본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] PL / SQL

-- 1. PL/SQL (Procedual Language extension to SQL) 은
-- 프로그래밍 언어의 특성을 가지는 sql 의 확장이며, 
-- 데이터 조작과 질의 문장은 pl/sql 의 절차적 코드 안에 포함된다,
-- 또한 pl/sql 을 사용하려면 sql로 할 수 없는 절차적 작업이 가능하다.
-- 여기에서 절차적 이라는 단어가 가지는 의미는 어떤 것이 어떤 과정을
-- 거쳐 어떻게 완료되는지 그 방법을 정확하게 코드에 기술한다는 것을 의미한다


--2. pl/sql 은 절차적으로 표현하기 위해 변수를 선언할 수 있는 기능,
--   참과 거짓을 구별할 수 있는 기능,
--   실행 흐름을 컨트롤 할 수 있는 기능들을 제공한다,

--3. PL/SQL 은 블럭 구조로 되어있으며
--    블럭은 선언/ 실행 / 예외처리 부분의 세 부분으로 구성되어 있다.
--    또한, 반드시 실행 부분은 존재해야 하며, 구조는 다음과 같다

-- 4. 형식 및 구조
/*
[DECLARE]
    --선언문(DECLATATIONS)
BEGIN
    --실행문(STATEMENT)
    [EXCEPTION]
    --예외처리문(EXCEPTION HANDLERS)

END;
*/

--(엄밀히 따지면 예외처리문은 실행문에 포함되는 것)


--5. 변수 선언

/*
DECLARE
    변수명 자료형;
    변수명 자료형 := 초기값; (:=이게 대입연산자이다 . 우측에 있는걸 좌측으로 )
    
BEGIN
    PL/SQL구문;
END;

*/
/*
이미지로 이해하기로는 := <= 이렇게 이해하면 된다 이런애는 없어요
이렇게 작성했다고 이렇게 한다 아니에요 자바와 같이 우를 좌에 대입하는데
그 약속이 이렇게 구성되어 있다, 처리하는실행구문을 작성하게됩니다
써봅시다 */

 

 

SET SERVEROUTPUT ON; --==>> 작업이 완료되었습니다.(0.08초) 
--> System.out.println() 
--> 『DBMS_OUTPUT.PUT_LINE()』
-- 화면에 결과를 출력하기 위한 환경변수 설정

/*
DECLARE 
    .......;
    .......;
    
BEGIN
    ...;
    ..........;
    .......;
END;*/



-- ● 변수에 임의의 값을 대입하고 출력하는 구문 작성
DECLARE
BEGIN 
END;
(이 뼈대부터 작성하고 시작하도록 하자)


DECLARE
        -- 선언부
        D1 NUMBER := 10; --모두 선언과 동시에 초기화
        D2 VARCHAR2(30) := 'HELLO';
        D3 VARCHAR2(20) := 'Oracle';
BEGIN 
        -- 실행부
        DBMS_OUTPUT.PUT_LINE(D1);
        DBMS_OUTPUT.PUT_LINE(D2);
        DBMS_OUTPUT.PUT_LINE(D3);
END;
/*
10
HELLO
Oracle


PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/




DECLARE
        -- 선언부
        D1 NUMBER := 10; --모두 선언과 동시에 초기화
        D2 VARCHAR2(30) := 'HELLO';
        D3 VARCHAR2(20) := 'Oracle';
BEGIN 
        -- 실행부
        
        D1 := D1 * 10; --(오라클 복합대입연산자 없어용~ EX. D1 *= 10)
        D2 := D2 || '민지';
        D3 := D3 || ' World';
        DBMS_OUTPUT.PUT_LINE(D1);
        DBMS_OUTPUT.PUT_LINE(D2);
        DBMS_OUTPUT.PUT_LINE(D3);
END;
/*
100
HELLO민지
Oracle World


PL/SQL 프로시저가 성공적으로 완료되었습니다.*/

-- ● IF문(조건문)


--IF ~ END IF ;


--IF ~ THEN ~ ELSE ~  END IF ;

-- IF ~ THEN ~ ELSIF~ THEN~ ELSIF ~THEN ~ELSE ~ END IF ;

-- 1. PL/SQL 의 IF 문장은 다른 언언의 IF 조건문과 거의 유사하다.
-- 일치하는 조건에 따라 선택적으로 작업을 수행할 수 있도록 한다,
-- TRUE 이면 THEN 과 ELSE 사이의 문장을 수행하고
-- FALSE 나 NULL 이면 ELSE 와 END 사이의 문장을 수행하게 된다,

2. 형식 및 구조

/*
IF 조건
    THEN 처리구문;
ELSIF 조건
    THEN 처리구문; 
ELSIF 조건
    THEN 처리구문;
ELSE
    처리구문;
END IF;
*/


-- ● 변수에 들어있는 값에 따라...
-- Excellent, Good, Fail 로 구분하여
-- 결과를 출력하는 pl/sql 구문을 작성한다.
 
DECLARE
    GRADE CHAR;
    
BEGIN
    GRADE := 'B';
    
    IF GRADE = 'A'
        THEN DBMS_OUTPUT.PUT_LINE('Excellent');
    ELSIF GRADE = 'B'
        THEN DBMS_OUTPUT.PUT_LINE('Good');
    ELSE 
        DBMS_OUTPUT.PUT_LINE('Fail');
    END IF;
END;

/*


Fail


PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/


-- ● CASE문(조건문)
-- CASE ~ WHEN ~ THEN ~ ELSE~END CASE;
-- 1. 형식 및 구조

/*
CASE 변수
    WHEN 값1
        THEN 실행문;
    WHEN 값2
        THEN 실행문;
    ELSE
        실행문;
END CASE; 

*/


-- ● 변수에 들어있는 값에 따라...
-- Excellent, Good, Fail 로 구분하여
-- 결과를 출력하는 pl/sql 구문을 작성한다.


DECLARE
    GRADE CHAR;
BEGIN
    GRADE := 'A';
    CASE GRADE
        WHEN 'A'
            THEN DBMS_OUTPUT.PUT_LINE('Excellent');
        WHEN 'B'
            THEN DBMS_OUTPUT.PUT_LINE('Good');
        ELSE DBMS_OUTPUT.PUT_LINE('Fail');
            
    END CASE;
END;
/*
Excellent


PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/




-- ● 외부 입력 처리

--1 .ACCEPT 문
-- ACCEPT 변수명 PROMPT '메세지';
-- 외부 변수로부터 입력받은 데이터를 내부 변수에 전달할 때
-- 『&외부변수명 형태로 접근하게 된다,

-- ● 정수 2개를 외부로부터(사용자로부터) 입력받아
-- 이들의 덧셈 결과를 출력하는  PL/SQL 구문을 작성한다.


ACCEPT N1 PROMPT '첫 번째 정수를 입력하세요';
ACCEPT N2 PROMPT '두 번째 정수를 입력하세요';

DECLARE
    --주요 변수 선언 및 초기화
    NUM1    NUMBER := &N1;
    NUM2    NUMBER := &N2;
    TOTAL   NUMBER := 0;
BEGIN
    -- 연산 및 처리
    TOTAL := NUM1 + NUM2;
    
    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('★'|| TOTAL || '★');
END;

-- ● 사용자로부터 입력받은 금액을 화폐 단위로
-- 출력하는 프로그램을 작성한다.
-- 단, 반환 금액은 편의상 1천원 미만, 10원 이상만 가능하다고 가정한다.
/*

실행 예)
바인딩 변수 입력 대화창 → 금액 입력 : 990

입력받은 금액 총액 : 990원
화폐단위 : 오백원 1, 백원 4, 오십원 1, 십원 4
*/


ACCEPT VAR1 PROMPT ' 금액 입력 : ';

DECLARE
        
    TOTAL   NUMBER := &VAR1; 
    FHUN    NUMBER := TRUNC(&VAR1/500);
    HUN     NUMBER := TRUNC(MOD(&VAR1,500)/100);
    FIF     NUMBER := TRUNC(MOD(MOD(&VAR1,500),100)/50);
    TEN     NUMBER := MOD(MOD(MOD(&VAR1,500),100),50)/10;
BEGIN
    DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || TOTAL||'원');
    DBMS_OUTPUT.PUT_LINE('오백원 : ' || FHUN ||' 백원 : ' || HUN || '  오십원 : ' || FIF || '  십원 : ' ||TEN ); 
END;


/*
입력받은 금액 총액 : 990원
오백원 : 1 백원 : 4  오십원 : 1  십원 : 4


PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/


 

 

위와 같은 문제 / 다른 풀이 방식

ACCEPT INPUT PROMPT '금액 입력';

DECLARE
    -- ● 주요 변수 선언 및 초기화
    MONEY   NUMBER := &INPUT;-- 연산을 위해 담아둔 변수
    MONEY2  NUMBER := &INPUT;-- 출력을 위해 담아둔 변수
    M500    NUMBER;-- 500원 짜리 갯수를 담아둘 변수    
    M100    NUMBER;-- 100원 짜리 갯수를 담아둘 변수    
    M50     NUMBER;-- 500원 짜리 갯수를 담아둘 변수    
    M10     NUMBER;-- 10원 짜리 갯수를 담아둘 변수    
BEGIN
    -- ● 연산 및 처리
    -- MONEY 를 500 으로 나눠서 몫을 취하고 나머지는 버린다. → 500원의 갯수
    M500 := TRUNC(MONEY/500);
    -- MONEY 를 500 으로 나눠서 몫은 버리고 나머지는 취한다.
    MONEY := MOD(MONEY,500);
    --ㅡMONEY 를 100 으로 나눠서 몫을 취하고 나머지는 버린다. → 100원의 갯수
     M100 := TRUNC(MONEY/100);
    -- MONEY 를 100 으로 나눠서 몫은 버리고 나머지는 취한다.
    MONEY := MOD(MONEY,100);
    --ㅡMONEY 를 50 으로 나눠서 몫을 취하고 나머지는 버린다. → 50원의 갯수
     M50 := TRUNC(MONEY/50);
    -- MONEY 를 50 으로 나눠서 몫은 버리고 나머지는 취한다.
    MONEY := MOD(MONEY,50);    
    --ㅡMONEY 를 10 으로 나눠서 몫을 취하고 나머지는 버린다. → 10원의 갯수
     M10 := TRUNC(MONEY/50);
    -- MONEY 를 10 으로 나눠서 몫은 버리고 나머지는 취한다.
    MONEY := MOD(MONEY,10);   
    -- 결과 출력
    DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || MONEY2);
    DBMS_OUTPUT.PUT_LINE('화폐단위  : 오백원 ' || M500 || ;', 백원 '||M100||', 오십원 '
    여기 나중에 마무리하기
END;