본문 바로가기

Database/Oracle

PL 1

    PL/SQL
    PL : Procedural == 처리자 Extension
    Process -> Procedure
    
    SQL 을 확장한 순차적 언어 -> Procedure, Function, Trigger
                                in out      in out
                                insert      select
                                delete
                                update
    제어문 : if, while, for
    +script

 

 

DECLARE     --선언부
    message VARCHAR2(10);           --변수명,  String message과 동일
BEGIN       --실행부
    message := 'hello pl';           -- message = "hello pl"과 동일
    
    SYS.dbms_output.put_line('message = ' || message);
    
            --예외처리문
END;
/

   Script 구조
    1. 선언부 : 변수, 상수, 초기화
    2. 실행부 : 실제로 처리할 Query 부분이나 제어문을 활용해서 처리하는 부분
    3. 예외처리부 : 각종 오류 처리

 

 

 

-- 사원번호를 입력받고 그 사원의 급여에 1000을 더한 값으로 갱신(UPDATE)하라.
-- 사원번호와 갱신된 급여를 출력하라

ACCEPT p_empno PROMPT '사원 번호를 입력하시오'

DECLARE
    --v_sal NUMBER(8,2) : -1000;
    v_sal EMPLOYEES.salary%TYPE := 1000;                  --EMP테이블의 sal 크기로 잡힘
    v_salTotal NUMBER;
BEGIN
    --확인용
    SELECT salary INTO v_salTotal
    FROM employees
    WHERE employee_id = &p_empno;
    
    SYS.dbms_output.put_line(&p_empno || '번 사원의 급여: ' || v_salTotal);
    
    --update
    UPDATE employees
    SET salary = salary + v_sal               --v_sal은 1000
    WHERE employee_id = &p_empno;
    
    SELECT salary INTO v_salTotal
    FROM employees
    WHERE employee_id = &p_empno;
    
    SYS.dbms_output.put_line(&p_empno || '번 사원의 갱신 후 급여: ' || v_salTotal);
    
END;        
/

 

ROLLBACK;

 

 

 

 

 

 

--문자열 입력 받을 때

ACCEPT p_empname PROMPT '사원 명을 입력하세요'

DECLARE
    v_name employees.last_name%TYPE := '&p_empname';

--숫자를 입력 받을 때

ACCEPT u_empno PROMPT '사원 번호를 입력하세요'

DECLARE
    u_sal EMPLOYEES.salary%TYPE := &p_empno;

 

 

 

 

 

 

 

 

--console에 출력을 on

SET SERVEROUTPUT on

--console에 출력을 off

SET SERVEROUTPUT off

 

 

 

 

 

--if

DECLARE
    counter INTEGER;
BEGIN
    counter := 1;
    counter := counter + 1;
    
    IF counter IS NULL THEN 
        dbms_output.put_line('result: counter is null');
    ELSE 
        dbms_output.put_line('result: counter is not null');
    END IF;
END;
/

 

 

 

 


---for

DECLARE
    counter INTEGER;
    i INTEGER;
BEGIN
    FOR i IN 1..9 LOOP
        SYS.dbms_output.put_line('i = ' || i);
        counter := i * 2;
        SYS.dbms_output.put_line('2 * ' || i || ' = ' || counter);
    END LOOP;
END;
/

 

 

 

 

--loop

DECLARE
    v_count NUMBER := 0;            --선언과 함께 초기화
    v_total NUMBER := 0;
BEGIN
    LOOP
        EXIT WHEN v_count = 10;
           
        v_count := v_count + 1;
        v_total := v_total + v_count;
    
    END LOOP;
    
        SYS.dbms_output.put_line('v_total = ' || v_total);
END;
/

 

 

 

 

 

---while

DECLARE
    v_count NUMBER := 0;
BEGIN
    
    WHILE v_count < 10
    LOOP
        v_count := v_count + 1;
        SYS.dbms_output.put_line('v_count = ' || v_count);
    END LOOP;
END;
/

 

 

 

 

 

--- GOTO

DECLARE
    v_name VARCHAR2(10) := 'LEE';
    v_case NUMBER := 0;
BEGIN
    CASE WHEN MOD(v_case, 2) = 0 THEN       --v_case를 2로나눈 나머지가 0으로 성립될때
            GOTO test1;
        WHEN MOD(v_case, 2) = 1 THEN 
            GOTO test2;
        ELSE
            GOTO err;
    END CASE;
    
<<test1>>
    SYS.dbms_output.put_line(v_name || ' is woman');
    GOTO sub_end;
<<test2>>
    SYS.dbms_output.put_line(v_name || ' is man');
    GOTO sub_end;
<<err>>
    SYS.dbms_output.put_line('ERROR');
    
<<sub_end>>
    SYS.dbms_output.put_line('Exit');

END;
/

 

 

 

 

 

 

---예외처리부

DECLARE
    counter INTEGER;
BEGIN
    counter := 1;
    counter := counter / 0;         --컴퓨터는 0을 계산 못하므로 =0 은 예외발생
    
EXCEPTION WHEN OTHERS THEN
      SYS.dbms_output.put_line('예외가 발생하였습니다');
END;
/

 

 

 

 

 

 

---varray : Variable Array

DECLARE
    TYPE varray_test IS VARRAY(3) OF INTEGER;       -- int varray_test = new int[3] (3은 3개라는 뜻)
    vArr varray_test;
BEGIN
    vArr := varray_test(11, 22, 33);                --각 번지별 11, 22, 33의 값을 넣음
    -- vArr(0)
    SYS.dbms_output.put_line('vArr(1)' || vArr(1));
END;
/

 

 

 

 

 

 

--메세지박스로 입력받기
--ACCEPT

ACCEPT p_deptno PROMPT '부서번호를 입력하세요(급여의 합)'         --p_deptno는 입력받는 값(sc)

DECLARE
    v_salTotal NUMBER;
BEGIN
    SELECT SUM(salary) INTO v_saltotal              --결과는 SUM(salary)를 통해 v_saltotal로 나온다
    FROM employees
    WHERE department_id = &p_deptno;                --외부에서 받은키는 앞에 &을 붙인다
    
    SYS.dbms_output.put_line(&p_deptno || '번 부서 급여의 합은 '
        || TO_CHAR(v_salTotal, '$999,999,999'));
END;
/

 

 

 

 

 

 

 

 

 

 

 

 

'Database > Oracle' 카테고리의 다른 글

pl//Cursor  (0) 2020.06.29
PL// work 06  (0) 2020.06.26
work 06 (view)  (0) 2020.06.26
View  (0) 2020.06.26
INDEX  (0) 2020.06.25