ํ์ต ๋ด์ฉ
PL/SQL ์ด๋
-> PROCEDURAL EXTENTION TO STRUCTURED QUERY LANGUAGE
- ์ค๋ผํด ์์ฒด์ ๋ด์ฅ๋์ด ์๋ ์ธ์ด์ด๋ค.
SQL์ ํ์ฅํ ์์ฐจ์ ์ธ ์ธ์ด
- PROCEDURE, FUNCTION, TRIGGER(์๋ํธ์ถํจ์, CALL BACK)
PL/SQL ๋ฌธ์ BLOCK ๊ตฌ์กฐ๋ก ๋ค์์ SQL ๋ฌธ์ ํ๋ฒ์ ORACLE DB๋ก ๋ณด๋ด์ ์ฒ๋ฆฌํ๋ฏ๋ก
์ํ์๋๋ฅผ ํฅ์ ์ํฌ์ ์๋ค.
- SCRIPT ๊ตฌ์กฐ
DECLARE
-- ์ ์ธ๋ถ
MESSAGE VARCHAR2(10);
BEGIN
-- ์คํ๋ถ
MESSAGE := 'HELLO PL';
dbms_output.put_line('MESSAGE = ' || message);
END;
/
1. ์ ์ธ๋ถ : ๋ณ์, ์์, ์ด๊ธฐํ
2. ์คํ๋ถ : QUERY, ์ ์ด๋ฌธ, ์ค์ ์ฒ๋ฆฌ, BEGIN์ผ๋ก ์์ํ๊ณ END๋ก ์ข
๋ฃ๋๋ค.
3. ์์ธ์ฒ๋ฆฌ : ๊ฐ์ข
์ค๋ฅ๋ฅผ ์ ์ํ๊ณ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ผ๋ก ์ ํ ์ฌํญ์ด๋ค.
- SET SERVEROUTPUT ON
CONSOLE์ ์ถ๋ ฅ์ ์ค์ (๊ธฐ๋ณธ์ ์ผ๋ก PL/SQL์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณด์ฌ์ฃผ์ง ์๋๋ค.)
SET SERVEROUTPUT ON
- IF ๋ฌธ
๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์์ IF๋ฌธ์ด ๋ค์ด๊ฐ ์์ ์ด๋ค.
JAVA์์ ๊ณต๋ถํ IF๋ฌธ๊ณผ ํก์ฌํ๊ฒ ์๊ฒผ์ผ๋ฉฐ, ๋ค๋ง ์ฐจ์ด๊ฐ ๋๋ ๊ฒ์
IF์ ๋ํ ์กฐ๊ฑด์ด ๋๋๋ฉด THEN์ ์ ๋ ฅํด์ฃผ๊ณ , ELSE IF๋ ELSIF๋ก ์์ฑํ๋ค๋ ๊ฒ.
๋ง์ง๋ง์๋ IF์ ์ด ๋๋ฌ๋ค๋ END IF; ๋ฅผ ๊ผญ ๋ถ์ด์ฃผ์ด์ผ ํ๋ค.
DECLARE
COUNTER INTEGER;
BEGIN
COUNTER := 1;
COUNTER := COUNTER + 1;
IF counter = 1 THEN
DBMS_OUTPUT.PUT_LINE('COUNTER = 1');
ELSIF COUNTER = 2 THEN
DBMS_OUTPUT.PUT_LINE('COUNTER = 2');
ELSIF COUNTER = 3 THEN
DBMS_OUTPUT.PUT_LINE('COUNTER = 3');
ELSIF COUNTER = 4 THEN
DBMS_OUTPUT.PUT_LINE('COUNTER = 4');
ELSE
DBMS_OUTPUT.PUT_LINE('COUNTER IS NULL');
END IF;
END;
/
-- ์ถ๋ ฅ๊ฐ : COUNTER = 2
- FOR ๋ฌธ
์์ ์ ์ถ๋ ฅ๊ฐ์ ๋น๊ตํด๋ณด๋ฉด ์ด๋ค ์๋ฆฌ๋ก ์๋๋๋์ง ์ฝ๊ฒ ํ์ ๋ ๊ฒ์ด๋ค.
DECLARE
COUNTER INTEGER;
I INTEGER; -- LOOP์ฉ ๋ณ์
BEGIN
FOR I IN 1..9 LOOP
DBMS_OUTPUT.put_line('I = ' || I);
END LOOP;
END;
/
/*
์ถ๋ ฅ๊ฐ :
I = 1
I = 2
I = 3
I = 4
I = 5
I = 6
I = 7
I = 8
I = 9
*/
- LOOP๋ฌธ
FOR๋ฌธ ์์ด LOOP๋ฌธ์ผ๋ก๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
V_COUNT๊ฐ 10์ด ๋๋ฉด LOOP์ ๋น ์ ธ๋๊ฐ๊ณ , V_COUNT๋ 1์ฉ ์ฆ๊ฐํ๋ค.
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;
DBMS_OUTPUT.put_line('v_count = ' || v_count);
END LOOP;
DBMS_OUTPUT.put_line('v_total = ' || v_total);
END;
/
/*
๊ฒฐ๊ณผ๊ฐ:
v_count = 1
v_count = 2
v_count = 3
v_count = 4
v_count = 5
v_count = 6
v_count = 7
v_count = 8
v_count = 9
v_count = 10
v_total = 55
*/
- WHILE ๋ฌธ
WHILE๋ฌธ์ ๋จผ์ ์กฐ๊ฑด์ ๋ช ์ํ๊ณ LOOP์ผ๋ก ๊ฐ์ธ์ค๋ค.
์กฐ๊ฑด์ด FALSE๊ฐ ๋๋ฉด LOOP์ ๋น ์ ธ๋๊ฐ๊ฒ ๋๋ค.
DECLARE
V_COUNT NUMBER := 0;
V_TOTAL NUMBER := 0;
BEGIN
WHILE v_count < 10
LOOP
v_count := v_count + 1;
v_total := v_total + v_count;
DBMS_OUTPUT.put_line('v_count = ' || v_count);
END LOOP;
DBMS_OUTPUT.put_line('v_total = ' || v_total);
END;
/
/*
๊ฒฐ๊ณผ๊ฐ :
v_count = 1
v_count = 2
v_count = 3
v_count = 4
v_count = 5
v_count = 6
v_count = 7
v_count = 8
v_count = 9
v_count = 10
v_total = 55
*/
- GOTO๋ฌธ
์์ฆ์ ๋ง์ด ์ฌ์ฉ๋์ง ์๋ ๊ตฌ๋ฌธ์ด๋ผ๊ณ ํ๋ค.
๊ตฌ์กฐ๋ง ๋ณด๊ณ ์ด๋ป๊ฒ ์๋๋๋ ๊ฒ์ธ์ง ์ฐธ๊ณ ๋ง ํ์.
DECLARE
V_NAME VARCHAR2(10) := 'LEE';
V_CASE NUMBER := 0;
BEGIN
CASE WHEN MOD(V_CASE, 2) = 0 THEN
GOTO TEST1;
WHEN MOD(V_CASE, 2) = 1 THEN
GOTO TEST2;
ELSE
GOTO ERR;
END CASE;
<<TEST1>>
DBMS_OUTPUT.put_line(v_name || 'IS WOMEN');
GOTO SUB_END;
<<TEST2>>
DBMS_OUTPUT.put_line(v_name || 'IS MEN');
GOTO SUB_END;
<<ERR>>
DBMS_OUTPUT.put_line('ERROR');
GOTO SUB_END;
<<SUB_END>>
DBMS_OUTPUT.put_line('END');
END;
/
/*
๊ฒฐ๊ณผ๊ฐ :
LEE IS WOMEN
END
*/
- ์์ธ์ฒ๋ฆฌ๋ถ
์์ธ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ ์์๋ฅผ ๋ค์๊ณ , ์์ธ๊ฐ ๋ฐ์๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋๋๋ค.
DECLARE
COUNTER INTEGER;
BEGIN
COUNTER := 10;
COUNTER := COUNTER / 0;
EXCEPTION WHEN OTHERS THEN -- ์์ธ์ฒ๋ฆฌ
dbms_output.put_line('์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.');
END;
/
--๊ฒฐ๊ณผ๊ฐ : ์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- VARRAY (VARIABLE ARRAY)
๊ณ ์ ๊ธธ์ด๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ ์์ฑํ ์ ์๋ค. (SQL์์๋ ๋ฐฐ์ด INDEX๊ฐ 0์ด ์๋ 1๋ถํฐ ์์ํ๋ค๋ ๊ฒ์ ์ ์ํ์.)
ํ์ : TYPE ํ์
๋ช
IS VARRAY (ํฌ๊ธฐ) OF ์์๊ฐํ์
[NOT NULL];
DECLARE
TYPE VARRAY_TEST IS VARRAY(3) OF INTEGER;
-- TYPE VARRAY๋ช
IS VARRAY(์ต๋ ํฌ๊ธฐ) OF ์์๊ฐ_ํ์
;
MYARR VARRAY_TEST;
BEGIN
MYARR := VARRAY_TEST(11, 22, 33);
DBMS_OUTPUT.PUT_LINE('MYARR(2) = ' || MYARR(2));
END;
/
--๊ฒฐ๊ณผ๊ฐ : MYARR(2) = 22
- ACCEPT
๋ฐ์ดํฐ ๊ฐ์ ์ ๋ ฅ๋ฐ๊ธฐ ์ํด ์ฐ๋ ๊ตฌ๋ฌธ์ด๋ค.
ACCEPT p_DEPTNO PROMPT '๋ถ์๋ฒํธ๋ฅผ ์
๋ ฅํ์์ค(๊ธ์ฌ์ ํฉ)'
๊ฒฐ๊ณผ๊ฐ : (์๋์ ๊ฐ์ด ๋ฐ์ดํฐ ๊ฐ์ ๋ฐ์ ์ฐฝ์ด ์์ฑ๋๋ค.)
๋ฌธ์ ํ์ด
EX) ์ฌ์๋ฒํธ ์
๋ ฅ ๋ฐ๊ณ ๊ทธ ์ฌ์์ ๊ธ์ฌ์ 1000์ ๋ํ ๊ฐ์ผ๋ก ๊ฐฑ์ (UPDATE)ํ๋ผ.
์ฌ์๋ฒํธ, ๊ฐฑ์ ๋ ๊ธ์ฌ๋ฅผ ์ถ๋ ฅ(SELECT)ํ๋ผ.
ACCEPT p_empno PROMPT '์ฌ์๋ฒํธ๋ฅผ ์
๋ ฅํ์์ค(+1000)'
DECLARE
v_sal NUMBER := 1000;
v_salTotal NUMBER;
BEGIN
-- select
SELECT salary INTO v_salTotal
FROM employees
WHERE employee_id = &p_empno;
dbms_output.put_line(&p_empno || '๋ฒ ์ฌ์์ ๊ธ์ฌ = ' || v_salTotal);
-- update
UPDATE employees
SET salary = salary + v_sal
WHERE employee_id = &p_empno;
SELECT salary INTO v_salTotal
FROM employees
WHERE employee_id = &p_empno;
dbms_output.put_line(&p_empno || '๋ฒ ์ฌ์์ ๊ธ์ฌ = ' || v_salTotal);
END;
/
- ROWTYPE
- ํ ์ด๋ธ์ด๋ ๋ทฐ ๋ด๋ถ์ ์ปฌ๋ผ ๋ฐ์ดํฐํ, ํฌ๊ธฐ, ์์ฑ์ ๊ทธ๋๋ก ์ฌ์ฉ ํ ์ ์๋ค.
- ROWTYPE ์์ ํ ์ด๋ธ ์ด๋ฆ์ ์ ๋ ฅํ๋ค. EX) EMP%ROWTYPE
- ๊ฐ ์ปฌ๋ผ๋ง๋ค์ ํ์ ์ ๊ฐ์ ธ์ค๋ ค๋ฉด %TYPE์ ๋ถ์ฌ์ค๋ค. EX) EMP.SALARY%TYPE
DECLARE
V_EMPNO EMPLOYEES.EMPLOYEE_ID%TYPE;
V_FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE;
V_EMP EMPLOYEES%ROWTYPE; -- COLUMN๋ช
์ด ์๋์ ์ผ๋ก ๋ณ์๋ช
์ด ๋๋ค.
--%ROWTYPE ์์ ์ค๋ ๊ฒ์ ํ
์ด๋ธ ์ด๋ฆ
-- EX) V_EMP.SALARY
BEGIN
SELECT employee_id, first_name, salary
INTO V_EMP.employee_id, V_EMP.first_name, V_EMP.SALARY
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE('์ฌ์๋ฒํธ : ' || V_EMP.employee_id);
DBMS_OUTPUT.PUT_LINE('์ฌ์๋ช
: ' ||V_EMP.first_name);
DBMS_OUTPUT.PUT_LINE('๊ธ์ฌ : ' || V_EMP.SALARY);
END;
/
PROCEDURE - INSERT, DELETE, UPDATE ์ ์ฌ์ฉ๋๋ค.
FUNCTION - SELECT๋ง ์ฌ์ฉ๋๋ค.
TRIGGER - UTIL (=CALLBACK)
PROCEDURE : ์ ์ฐจํ SQL์ ํ์ฉํ์ฌ ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ํธ๋์ญ์ ์ธ์ด.
ํ๋ผ๋ฏธํฐ์๋ IN, OUT์ด ๋ชจ๋ ์ฌ ์ ์๋ค.
๊ธฐ๋ณธ ํ์
CREATE OR REPLACE PROCEDURE MYPROC(INNUM IN NUMBER, OUTNUM OUT NUMBER)
IS
-- ์ ์ธ๋ถ
BEGIN
-- ์คํ๋ถ
DBMS_OUTPUT.PUT_LINE('INNUM : ' || INNUM);
OUTNUM := 333;
-- ์์ธ์ฒ๋ฆฌ๋ถ
END;
/
ํธ์ถ ๋ฐฉ๋ฒ
VAR VAL NUMBER;
EXECUTE myproc(111, :VAL);
PRINT VAL;
/*
๊ฒฐ๊ณผ๊ฐ :
VAL
----------
333
*/
๋งค๊ฐ ๋ณ์๊ฐ ์์ด๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
CREATE OR REPLACE PROCEDURE HELLOPROC
IS
MSG VARCHAR2(20);
BEGIN
MSG := 'HELLOPROC ํธ์ถ';
DBMS_OUTPUT.PUT_LINE(MSG);
END;
/
EXECUTE helloproc;
-- ๊ฒฐ๊ณผ๊ฐ : HELLOPROC ํธ์ถ
- FUNCTION
๊ตฌ์ฑ์ด ํ๋ก์์ ์ ์ ์ฌํ์ง๋ง ํ๋ผ๋ฏธํฐ์ IN๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ฐํ๋ ๊ฐ์ ๋ฐ๋์ RETURN ์ผ๋ก ๋ฃ์ด์ค์ผ ํ๋ค.
SELECT
๊ตฌ๋ฌธ ์์ ๋ฆฌํด ๊ฐ์ด ์กด์ฌํ๋ค.
CREATE OR REPLACE FUNCTION FUNC(P_VAL IN NUMBER)
RETURN NUMBER
IS
V_VAL NUMBER;
BEGIN
V_VAL := P_VAL;
V_VAL := V_VAL * 2;
RETURN V_VAL;
END;
/
SELECT FUNC(3)
FROM DUAL;
-- ๊ฒฐ๊ณผ๊ฐ : 6
'๐ป ๊ฐ๋ฐ > ๐ TIL (Today I Learned)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
21.02.22 TIL(D+29 JDBC ํ์ฉ AccountBook ๋ง๋ค๊ธฐ) (0) | 2021.02.22 |
---|---|
21.02.19 TIL(D+28 JDBC์ ํตํ DML ๊ตฌํ) (0) | 2021.02.19 |
21.02.16 TIL (ORACLE SUB QUERY, JOIN, TABLE, DDL, DML, ๋ฌด๊ฒฐ์ฑ) (0) | 2021.02.16 |
21.02.09 TIL (D+22 Oracle Select) (0) | 2021.02.09 |
21.02.09 TIL (D+22 Oracle DDL, ์๋ฃํ , ํ์ค ํจ์) (0) | 2021.02.09 |