์ปค์(Cursor)๋?
ํ๋์ ๋ ์ฝ๋๊ฐ ์๋ ์ฌ๋ฌ ๋ ์ฝ๋๋ก ๊ตฌ์ฑ๋ ์์ ์์ญ์์ SQL๋ฌธ์
์คํํ๊ณ ๊ทธ ๊ณผ์ ์ ์๊ธด ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์ CURSOR๋ฅผ ์ฌ์ฉํ๋ค.
์ค๋ผํด ์๋ฒ์ ์ํด ์คํ๋๋ ๋ชจ๋ SQL๋ฌธ์ ์ฐ๊ด๋ ๊ฐ๊ฐ์ ์ปค์๋ฅผ ์์ ํ๊ณ ์๋ค.
์ปค์์ ์ข ๋ฅ
์์์ ์ปค์ : ๋ชจ๋ DML๊ณผ PL/SQL SELECT๋ฌธ์ ๋ํด ์ ์ธ๋๋ค.
๋ช ์์ ์ปค์ : ํ๋ก๊ทธ๋๋จธ์ ์ํด ์ ์ธ๋๋ฉฐ ์ด๋ฆ์ด ์๋ ์ปค์.
์์์ ์ปค์
์์์ ์ธ ์ปค์๋ ์ค๋ผํด์ด๋ PL/SQL์คํ ๋ฉ์ปค๋์ฆ์ ์ํด ์ฒ๋ฆฌ๋๋ SQL๋ฌธ์ฅ์ด ์ฒ๋ฆฌ๋๋ ๊ณณ์ ๋ํ ์ต๋ช ์ ์ฃผ์. ์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์คํ๋๋ ๋ชจ๋ ๋ฌธ์ฅ์ ์์์ ์ธ ์ปค์๊ฐ ์์ฑ๋๋ฉฐ, ์ปค์ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ค.
์์์ ์ปค์๋ SQL ๋ฌธ์ด ์คํ๋๋ ์๊ฐ ์๋์ผ๋ก OPEN๊ณผ CLOSE๋ฅผ ์คํํ๋ค.
--์ปค์์ ์ข
๋ฅ--
SQL%ROWCOUNT : ํด๋น SQL ๋ฌธ์ ์ํฅ์ ๋ฐ๋ ํ์ ์
SQL%FOUND : ํด๋น SQL ์ํฅ์ ๋ฐ๋ ํ์ ์๊ฐ 1๊ฐ ์ด์์ผ ๊ฒฝ์ฐ TRUE
SQL%NOTFOUND : ํด๋น SQL ๋ฌธ์ ์ํฅ์ ๋ฐ๋ ํ์ ์๊ฐ ์์ ๊ฒฝ์ฐ TRUE
SQL%ISOPEN : ํญ์ FALSE, ์์์ ์ปค์๊ฐ ์ด๋ ค ์๋์ง์ ์ฌ๋ถ ๊ฒ์
--0 ๋ ์ฝ๋ ์ญ์
DECLARE
vempNO emp.empNo%TYPE;
vcount NUMBER;
BEGIN
vempNo := '100l';
DELETE FROM emp WHERE empNo = vempNo;
vcount := SQL%ROWCOUNT;
COMMIT;
DBMS_OUTPUT.PUT_LINE(vcount||' ๋ ์ฝ๋ ์ญ์ ');
END;
/
๋ช ์์ ์ปค์
๋ช ์์ ์ปค์๋ ํ๋ก๊ทธ๋๋จธ์ ์ํด ์ ์ธ๋๋ฉฐ ์ด๋ฆ์ด ์๋ ์ปค์๋ก ์ฌ๋ฌ row๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
CURSOR ์ ์ธ → ์ปค์ OPEN → FETCH → ์ปค์ CLOSE
- CURSOR์ ์ธ : ๊ฒ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ ์ธํ๋ค.
- ์ปค์ OPEN : OPEN์ ์ปค์์์ ์ ์ธ๋ SELECT๋ฌธ์ ์คํ์ ์๋ฏธํ๋ค. ๋ฐ์ดํฐํ์ ์ถ์ถํ์ง ๋ชปํด๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
- FETCH : ์ปค์์ FETCH๋ ํ์ฌ ๋ฐ์ดํฐ ํ์ OUTPUT๋ณ์์ ๋ฐํํ๋ค. ์ปค์์ SELECT๋ฌธ ์ปฌ๋ผ์ ์ ๋ฐ ๋ฐ์ดํฐ ํ์ ์ OUTPUT๋ณ์์ ์ ๋ฐ ๋ฐ์ดํฐ ํ์ ๊ณผ ์ผ์นํด์ผ ํ๋ค.
- ์ปค์ CLOSE : OPEN๋ ์ปค์๋ ์ฌ์ฉ ์๋ฃํ ๋ฐ๋์ CLOSE ํด์ผ ํ๋ค. ์ ์ธ๋ SELECT๋ฌธ์ ์ ์ธ์ ํด์ ํ๋ค. ์ปค์๊ฐ ๋ CLOSE๋ ์ํ์์๋ FETCH๋ฅผ ํ ์ ์๋ค.
-- name,sal ์ ์ฒด ๊ฐ์ ธ์ค๊ธฐ
DECLARE
vname emp.name%TYPE;
vsal emp.sal%TYPE;
--CURSOR ์ ์ธ
CURSOR cur_emp IS SELECT name,sal FROM emp;
BEGIN
--CURSOR OPEN
OPEN cur_emp;
LOOP
--FETCH
FETCH cur_emp INTO vname,vsal;
EXIT WHEN cur_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vname||':'||vsal);
END LOOP;
--CLOSE
CLOSE cur_emp;
END;
/
-- '๊น'์จ ์ฑ์ ๊ฐ์ง ์ฌ๋ ๊ฒ์
CREATE OR REPLACE PROCEDURE pEmpSelect
(
pName VARCHAR2
)
IS
vname emp.name%TYPE;
vsal emp.sal%TYPE;
CURSOR cur_emp IS
SELECT name,sal FROM emp WHERE INSTR(name,pName)>0;
BEGIN
OPEN cur_emp;
LOOP
--FETCH
FETCH cur_emp INTO vname,vsal;
EXIT WHEN cur_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vname||':'||vsal);
END LOOP;
--CLOSE
CLOSE cur_emp;
END;
/
EXEC pEmpSelect('๊น');
์ปค์ ๋ณ์
๋ช ์์ ์ปค์์ ์์์ ์ปค์๋ ์ ์ ์ด๋ฏ๋ก, ์ปค์๊ฐ ๋ง๋ค์ด์ง๋ ์์ ์์ ์ฟผ๋ฆฌ๋ฌธ์ด ์ ์๋๋ค. ๋ฐ๋ผ์ ๋ฐํ์๊น์ง ์ปค์์ ์ด์ฉํ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ REF CURSOR์ ์ปค์๋ณ์๋ฅผ ์ ๊ณตํ์ฌ ๋ฐํ์์์ ์ปค์์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๊ณ ๊ฒฐ๊ณผ ์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๊ณ ์๋ค.
-- SYS_REFCURSOR
-- : ์ฝํ ์ฐธ์กฐ ์ปค์ ํ์
-- : ๋ฐ์ดํฐ ํ์
์ ํฌํจํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฐ๊ณผ ์
์ ์ ์ฅํ ์ ์์
-- : ํ๋ก์์ ์คํ๊ฒฐ๊ณผ(SELECT ๋ฌธ)๋ฅผ ์๋ฐ ๋ฑ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ ํ ๋ ์ฌ์ฉ
-- ์ปค์ ๋ณ์ ์ ์ธ
์ปค์๋ณ์ SYS_REFCURSOR;
-- ์ปค์ ๋ณ์ ์ฌ์ฉ
OPEN ์ปค์๋ณ์ FOR SELECT ๋ฌธ
-- ์ปค์ ๋ณ์์์ ๊ฐ ๊ฐ์ ธ ์ค๊ธฐ
FETCH ์ปค์๋ณ์ INTO ๋ณ์, ๋ณ์;
FETCH ์ปค์๋ณ์ INTO ๋ ์ฝ๋๋ณ์;
--SYS_REFCURSOR
CREATE OR REPLACE PROCEDURE pEmpSelect
(
pName VARCHAR2,
pResult OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN pResult FOR
SELECT name,sal FROM emp WHERE INSTR(name,pName)>0;
END;
/
--ํ์ธ
DECLARE
vName emp.name%TYPE;
vSal emp.sal%TYPE;
vResult SYS_REFCURSOR;
BEGIN
pEmpSelect('์ ',vResult);
LOOP
FETCH vResult INTO vName,vSal;
EXIT WHEN vResult%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vName||':'||vSal);
END LOOP;
END;
/
๋์ ์ฟผ๋ฆฌ๋?
ํ๋ก์์ ๋ฑ์์ ๋์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ํ ์คํธ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ
-- EXECUTE IMMEDIATE
-- : DDL, DML ๊ตฌ๋ฌธ์ ์คํ
-- : SELECT ๊ตฌ๋ฌธ ์คํ ์ INTO ์ ์ ์ฌ์ฉํ์ฌ ๋จ์ผ ๊ฐ์ ๋ฐํ ๋ฐ์ ๋ ์ฌ์ฉ
-- : ํ๋ก์์ ๋ฑ์์ ๋์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ํ
์คํธ ์ฟผ๋ฆฌ๋ฅผ ์
๋ ฅ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ
-- : RESOURCE ๊ถํ๋ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํ
์ด๋ธ์์ฑ, ์ํ์ค ์์ฑ๋ฑ์ ํ ์ ์์ง๋ง
-- : EXECUTE IMMEDIATE ์์๋ ๋ถ๊ฐ๋ฅํ๋ค.
-- : EXECUTE IMMEDIATE ๋ก ํ
์ด๋ธ์ ์์ฑํ๊ฑฐ๋ ์ํ์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ๋ค์์ ์์คํ
๊ถํ์ด ํ์ ํ๋ค.
CREATE OR REPLACE PROCEDURE pboardcreate
(
pname VARCHAR2
)
IS
S VARCHAR2(4000);
BEGIN
S := ' create table ' || pname;
S := S|| '(num NUMBER PRIMARY KEY, ';
S := S|| ' name VARCHAR2(30) not null, ';
S := S|| ' subiect VARCHAR2(255) not null, ';
S := S|| ' content VARCHAR2(4000) not null, ';
S := S|| ' hitCount NUMBER DEFAULT 0, ';
S := S|| ' reg_date DATE DEFAULT SYSDATE) ';
FOR T IN (SELECT tname FROM TAB WHERE tname = UPPER(pname))LOOP
EXECUTE IMMEDIATE 'drop table ' || pname || ' PURGE';
Dbms_Output.Put_Line(Pname||'ํ
์ด๋ธ ์ญ์ ...');
END LOOP;
EXECUTE IMMEDIATE S;
Dbms_Output.Put_Line(Pname||'ํ
์ด๋ธ ์์ฑ...');
S := 'CREATE SEQUENCE ' ||pname||'_seq';
FOR T IN ( SELECT * FROM seq WHERE sequence_name = UPPER(pname||'_seq'))LOOP
EXECUTE IMMEDIATE 'DROP SEQUENCE '||pname||'_seq';
DBMS_OUTPUT.PUT_LINE(PNAME||'_seq ์ํ์ค ์ญ์ ...');
END LOOP;
EXECUTE IMMEDIATE S;
DBMS_OUTPUT.PUT_LINE(PNAME||'_seq ์ํ์ค ์์ฑ...');
END;
/
SELECT * FROM TAB;
EXEC pboardcreate('board');
SELECT * FROM TAB;
SELECT * FROM seq;
'๐ป > ORACLE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(29)[ORACLE] 12์ผ์ฐจ : PL/SQL - 5 (ํธ๋ฆฌ๊ฑฐ ๋ฐ ํจํค์ง) (1) | 2024.03.27 |
---|---|
(29)[ORACLE] 12์ผ์ฐจ : PL/SQL - 4 (์์ธ์ฒ๋ฆฌ) (0) | 2024.03.27 |
(28)[ORACLE] 11์ผ์ฐจ : PL/SQL - 2 (0) | 2024.03.25 |
(28)[ORACLE] 11์ผ์ฐจ : PL/SQL (1) | 2024.03.25 |
[ORACLE] 10์ผ์ฐจ : ํธ๋์ญ์ , ORACLE 12C (1) | 2024.03.22 |