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 |