PL/SQL
- ์งํฉ์ ์ฑํฅ์ด ๊ฐํ SQL์ ์ผ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์์๋ฅผ ์ถ๊ฐ
๊ธฐ๋ณธ ๊ตฌ์กฐ
์ ์ธ๋ถ(Declare)
- ๋ณ์, ์์ ์ ์ธ
- ์๋ต๊ฐ๋ฅ
์คํ๋ถ(Begin)
- ์ ์ด๋ฌธ, ๋ฐ๋ณต๋ฌธ ๋ฑ ๋ก์ง ์คํ
์์ธ์ฒ๋ฆฌ๋ถ(Exception)
- ์คํ๋์ค ์๋ฌ ๋ฐ์์ catch, ํ์์กฐ์น
- ์๋ต๊ฐ๋ฅ
์ฐ์ฐ์
- := ๋์ ์ฐ์ฐ์
- ** ์ ๊ณฑ์ฐ์ฐ์
๋ณ์
๋ณ์
์ผ๋ฐํ์
var VarTYPE( );
๋ณ์ ์ฐธ์กฐ ํ์
- ์ ์ง๋ณด์ ์ฉ์ด
table.column%TYPE ;
DECLARE
deptno dept.deptno%TYPE;
dname dept.dname%TYPE;
โญ๋ณตํฉ๋ณ์
ROWTYPE
์ ์ธ : ๋ณ์๋ช ํ ์ด๋ธ๋ช %ROWTYPE
์ ๊ทผ : ๋ณ์๋ช .์ปฌ๋ผ๋ช
DECLARE
v_dept_row dept%ROWTYPE;
BEGIN
SELECT * INTO v_dept_row
FROM dept
WHERE deptno=10;
DBMS_OUTPUT.PUT_LINE('dname : ' || v_dept_row.dname);
DBMS_OUTPUT.PUT_LINE('deptno : ' || v_dept_row.deptno);
DBMS_OUTPUT.PUT_LINE('loc : ' || v_dept_row.loc);
END;
/
/*
dname : ACCOUNTING
deptno : 10
loc : NEW YORK
*/
RECODE TYPE
DECLARE
TYPE dept_row_type IS RECORD(
deptno dept.deptno%TYPE,
dname dept.dname%TYPE);
dept_rec dept_row_type;
BEGIN
SELECT deptno, dname
INTO dept_rec
FROM dept
WHERE deptno=10;
DBMS_OUTPUT.PUT_LINE('dept_row : ' || dept_rec.deptno || ',' || dept_rec.dname);
END;
/
TABLE TYPE
TABLE ํ ์ด๋ธํ์ ์ด๋ฆ IS TABLE OF ํ์ ํ์ INDEX BY BINARY_INTEGER
DECLARE
TYPE dept_tab_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;
v_dept_tab dept_tab_type;
BEGIN
SELECT * BULK COLLECT INTO v_dept_tab
FROM dept;
FOR i IN 1..v_dept_tab.count LOOP
DBMS_OUTPUT.PUT_LINE(v_dept_tab(i).deptno || ' , ' || v_dept_tab(i).dname );
END LOOP;
END;
/
/*
10 , ACCOUNTING
20 , RESEARCH
30 , SALES
40 , OPERATIONS*/
๋ก์ง์ ์ด
์กฐ๊ฑด์ ์ด
IF
IF ์กฐ๊ฑด THEN
์คํํ ๋ฌธ์ฅ;
ELSIF ์กฐ๊ฑด THEN
์คํํ ๋ฌธ์ฅ;
ELSE
์คํํ ๋ฌธ์ฅ;
END IF;
DECLARE
p NUMBER := 2;
BEGIN
IF p = 1 THEN
DBMS_OUTPUT.PUT_LINE('p=1');
ELSIF p = 2 THEN
DBMS_OUTPUT.PUT_LINE('p=2');
ELSE
DBMS_OUTPUT.PUT_LINE('else');
END IF;
END;
/
/*
p=2 */
๋ฐ๋ณต๋ฌธ
FOR - LOOP
FOR count IN [REVERSE] start..end LOOP
statement;
END LOOP;
counter : index variable( i )
DECLARE
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('for i :' || i);
END LOOP;
END;
/
/*
for i :1
for i :2
for i :3
for i :4
for i :5*/
WHILE
WHILE condition
LOOP
statement;
END LOOP;
DECLARE
i NUMBER := 1;
BEGIN
WHILE i <= 5 LOOP
DBMS_OUTPUT.PUT_LINE( i );
i := i+1;
END LOOP;
END;
/
LOOP
LOOP
statement;
EXIT [when condition];
END LOOP;
DECLARE
i NUMBER := 0;
BEGIN
LOOP
EXIT WHEN i > 5;
DBMS_OUTPUT.PUT_LINE( i );
i := i + 1;
END LOOP;
END;
/
๋ธ๋ก ์ ํ
Anonymous block
Procedure
Function
Anonymous block
-- ํ๋ฉด ์ถ๋ ฅ์ ํ์ฑํ ํ๋ ์ค์ ( ์ ์ํ 1ํ๋ง ์คํํ๋ฉด ์ ์ง)
SET SERVEROUTPUT ON;
-- ๊ฐ๋จํ PL/SQL์ต๋ช
๋ธ๋ญ
DECLARE
deptno NUMBER(2);
dname VARCHAR2(20);
BEGIN
SELECT deptno, dname INTO deptno, dname
FROM dept
WHERE deptno =10;
dbms_output.Put_line(deptno || ' ' || dname);
END;
/ -- ์ค์ง์ ์ผ๋ก PL/SQL ๊ตฌ๋ฌธ์ด ๋๋๋ ๋ถ๋ถ
/*
10 ACCOUNTING
PL/SQL ํ๋ก์์ ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ต๋๋ค.
*/
Procedure
- ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์์ ์๊ณ ์ ์ฐจ์ ๋ก์ง์ ํตํด ๋ณต์กํ ์ฝ๋ ์์ฑ
- ์๋ฒ์ ์ ์ฅ๋์ด ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
๋ทฐ
- ๋ทฐ ์์ฑ
- select *
from ๋ทฐ
ํ๋ก์์ ์ ์ฐจ
- ํ๋ก์์ ์์ฑ (CREATE OR REPLACE ...)
- ํ๋ก์์ ์คํ (EXEC ํ๋ก์์ ๋ช )
โฆ๏ธ์ธ์๊ฐ ์๋ ํ๋ก์์ ์์ฑ ๋ฐ ์คํ
CREATE OR REPLACE PROCEDURE print_dept IS
dname dept.dname%TYPE;
loc dept.loc%TYPE;
BEGIN
SELECT dname, loc INTO dname ,loc
FROM dept
WHERE deptno =10;
DBMS_OUTPUT.PUT_LINE(dname || ' ' || loc);
END;
/
-- ์คํ
EXEC print_dept;
--ACCOUNTING NEW YORK
โฆ๏ธ์ธ์๊ฐ ์๋ ํ๋ก์์ ์์ฑ
ํ๋ก์์ ๋ช (์ธ์๋ช 1 IN ์ธ์ํ์ 1, ....)
์ธ์๋ช : ์ฃผ๋ก P_ ์ ๋์ด ์ฃผ๋ก ์ฌ์ฉ
๋ณ์๋ช : ์ฃผ๋ก V_ ์ ๋์ด ์ฃผ๋ก ์ฌ์ฉ
CREATE OR REPLACE PROCEDURE print_dept(p_deptno IN dept.deptno%TYPE) IS
v_dname dept.dname%TYPE;
v_loc dept.loc%TYPE;
BEGIN
SELECT dname, loc INTO v_dname ,v_loc
FROM dept
WHERE deptno = p_deptno;
DBMS_OUTPUT.PUT_LINE(v_dname || ' ' || v_loc);
END;
/
-- ์คํ
EXEC print_dept(20);
--RESEARCH DALLAS
Function
CURSOR (์ปค์)
- ๋ค๋์ ๋ฐ์ดํฐ๋ฅผ ๋ณ์์ ๋ด๊ฒ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ฌํด์ ธ ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ๋์ ๋ชปํ ์๋ ์์.
- ํ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ธ์ถํ์ง ์๊ณ , ๊ฐ๋ฐ์๊ฐ ์ง์ ์ธ์ถ ๋จ๊ณ๋ฅผ ์ ์ด ํจ์ผ๋ก์จ ๋ณ์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ง ์๊ณ ๋ ๊ฐ๋ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅ.
์ปค์์ ์ข ๋ฅ
- ๋ฌต์์ ์ปค์ : ์ปค์์ด๋ฆ์ ๋ณ๋๋ก ์ง์ ํ์ง ์๋๊ฒฝ์ฐ
โ ์ค๋ผํด์ด ์์์ ์ฒ๋ฆฌํด์ค - ๋ช ์์ ์ปค์ : ์ปค์๋ฅผ ๋ช ์์ ์ด๋ฆ๊ณผ ํจ๊ป ์ ์ธํ๊ณ , ๊ฐ๋ฐ์๊ฐ ํด๋น ์ปค์๋ฅผ ์ง์ ์ ์ด ๊ฐ๋ฅ
์ปค์ ์ฌ์ฉ ๋ฐฉ๋ฒ (๋ช ์์ ์ปค์)
์ปค์ ์ ์ธ (DECLARE)
CURSOR ์ปค์์ด๋ฆ IS
SELECT ์ฟผ๋ฆฌ;์ปค์ ์ด๊ธฐ
OPEN ์ปค์์ด๋ฆ;
FETCH (์ธ์ถ)
FETCH ์ปค์์ด๋ฆ INTO ๋ณ์;
์ปค์ ๋ซ๊ธฐ
CLOSE ์ปค์์ด๋ฆ;
-- dept ํ
์ด๋ธ์ ๋ชจ๋ ํ์ ๋ํด ๋ถ์๋ฒํธ, ๋ถ์์ด๋ฆ์ cursor๋ฅผ
--ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ค์ต
DECLARE
CURSOR dept_cur IS -- ์ปค์์ ์ธ
SELECT deptno, dname
FROM dept;
v_deptno dept.deptno%TYPE;
v_dname dept.dname%TYPE;
BEGIN
OPEN dept_cur; -- ์ปค์์ด๊ธฐ
LOOP
FETCH dept_cur INTO v_deptno, v_dname;
EXIT WHEN dept_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_deptno || ' , ' || v_dname);
END LOOP;
END;
/
๋ช ์์ ์ปค์ FOR LOOP( ํฅ์๋ FOR ๋ฌธ)
FOR ๋ ์ฝ๋๋ช IN ์ปค์๋ช LOOP
๋ฐ๋ณต ์คํํ ๋ฌธ์ฅ;
END LOOP;
- OPEN, FETCH, CLOSE : 2~4๋จ๊ณ๋ฅผ FOR LOOP์์ ํด๊ฒฐ
DECLARE
CURSOR dept_cur IS -- ์ปค์์ ์ธ
SELECT deptno, dname
FROM dept;
BEGIN
FOR dept_row IN dept_cur LOOP
DBMS_OUTPUT.PUT_LINE(dept_row.deptno || ' , ' || dept_row.dname);
END LOOP;
END;
/
ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๋ช ์์ ์ปค์ FOR LOOP
DECLARE
CURSOR ์ปค์๋ช (ํ๋ผ๋ฏธํฐ๋ช ํ๋ผ๋ฏธํฐํ์ ) IS
QUERY ;
BEGIN
FOR ๋ ์ฝ๋๋ช IN ์ปค์๋ช LOOP
๋ฐ๋ณต ์คํํ ๋ฌธ์ฅ;
END LOOP;
END;
DECLARE
CURSOR emp_cur(p_deptno dept.deptno%TYPE) IS -- ์ปค์์ ์ธ
SELECT empno, ename
FROM emp
WHERE deptno = p_deptno;
BEGIN
FOR emp_row IN emp_cur(30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_row.empno || ' , ' || emp_row.ename);
END LOOP;
END;
/
์ธ๋ผ์ธ ์ปค์ ์ ์ธ
BEGIN
FOR dept_row IN (SELECT deptno, dname FROM dept) LOOP
DBMS_OUTPUT.PUT_LINE(dept_row.deptno || ' , ' || dept_row.dname);
END LOOP;
END;
/'IT > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ORACLE] ์ธ๋ฑ์ค(INDEX) ๊ตฌ์กฐ (0) | 2022.01.11 |
|---|---|
| [ORACLE]์คํ๊ณํ (0) | 2022.01.11 |
| [ORACLE] Window ํจ์, ๋ถ์ํจ์ (0) | 2022.01.11 |
| [ORACLE]๊ณ์ธต์ฟผ๋ฆฌ (0) | 2022.01.11 |
| [ORACLE]Subquery Advanced (0) | 2022.01.11 |