๊ฐ์
๋์ ์ฟผ๋ฆฌ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ ๋ ๋ณ์๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ด ๋์ ์ผ๋ก ์์ฑ๋์ด ์คํ๋๋ ๋ฐฉ์์ ๋งํฉ๋๋ค.
์ค๋ผํด์์๋ PL/SQL์ ์ฌ์ฉํ์ฌ ๋์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. PL/SQL์ ์ค๋ผํด์ ํ๋ก์์ ์ ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ์ฟผ๋ฆฌ์ ๋นํด ์ ์ฐํ๊ณ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ ์ค๋ผํด์์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์ ๋ํด ์์๋ณด๊ณ , ๋์ ์ฟผ๋ฆฌ์ ์ฅ๋จ์ ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋์ ์ฟผ๋ฆฌ๋?
๋์ ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋ ๋ ์คํ ์์ ์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ด ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ฒ์ ๋งํฉ๋๋ค. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ณ์๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ ์ ์ฟผ๋ฆฌ๋ ๋ฏธ๋ฆฌ ์ ์๋ ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๋ ๋ฐ๋ฉด, ๋์ ์ฟผ๋ฆฌ๋ ์คํ ์์ ์ ์ค์ ๋ฐ์ดํฐ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ๋์ ์ผ๋ก ์์ฑํ์ฌ ์คํํฉ๋๋ค. ์ด๋ฌํ ์ ์ฐ์ฑ์ผ๋ก ์ธํด ๋์ ์ฟผ๋ฆฌ๋ ๋ค์ํ ์ํฉ์ ๋์ํ๊ธฐ ์ข์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ์กฐ๊ฑด์ ๋์ ์ผ๋ก ์ค์ ํ๊ฑฐ๋, ๋ฐ๋ณต๋ฌธ์ ํตํด ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค๋ผํด์์๋ PL/SQL์ ์ฌ์ฉํ์ฌ ๋์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. PL/SQL์ ์ค๋ผํด์ ํ๋ก์์ ์ ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์ ๋จ๋ฝ์์๋ ์ค๋ผํด์์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ค๋ผํด์์์ ๋์ ์ฟผ๋ฆฌ ์ฌ์ฉ๋ฒ
์ค๋ผํด์์๋ PL/SQL์ ์ฌ์ฉํ์ฌ ๋์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. PL/SQL์ ์ค๋ผํด์ ํ๋ก์์ ์ ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
PL/SQL์์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ ๋๋ค:
- ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ฌธ์์ด ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค. ์ด ๋ณ์๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋์ ์ผ๋ก ์์ฑํ์ฌ ์ ์ฅํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ํ์ํ ๋ณ์๋ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๋ฌธ์ฅ์ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์ (||)๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์ ๊ฐ์ ์ฟผ๋ฆฌ์ ํฌํจ์ํฌ ์ ์์ต๋๋ค.
- ๋์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํด
EXECUTE IMMEDIATE
๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.EXECUTE IMMEDIATE
๋ฌธ์ ์คํ ์์ ์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋๋ ์ค๋ผํด์์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค:
DECLARE
query_str VARCHAR2(1000); -- ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ณ์ ์ ์ธ
department_id NUMBER := 10; -- ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ๋ณ์
cursor_var SYS_REFCURSOR; -- ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์ปค์ ๋ณ์ ์ ์ธ
BEGIN
-- ๋์ ์ฟผ๋ฆฌ ์์ฑ
query_str := 'SELECT * FROM employees WHERE department_id = ' || department_id;
-- ๋์ ์ฟผ๋ฆฌ ์คํ
EXECUTE IMMEDIATE query_str INTO cursor_var;
-- ๊ฒฐ๊ณผ ์ถ๋ ฅ
LOOP
FETCH cursor_var INTO ...
EXIT WHEN cursor_var%NOTFOUND;
-- ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
END LOOP;
CLOSE cursor_var;
END;
/
์์ ์์ ์์๋ query_str
๋ณ์์ ์ ์ฅ๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ EXECUTE IMMEDIATE
๋ฌธ์ ํตํด ์คํํ๊ณ , cursor_var
๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ๋ค, ์ปค์๋ฅผ ๋ซ์์ค๋๋ค.
์ค๋ผํด์์์ ๋์ ์ฟผ๋ฆฌ ์ฌ์ฉ๋ฒ์ ์์ ์์ ์ ์ ์ฌํ๋ฉฐ, ์ค์ ๋ก๋ ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ ๋ฑ์ ์ ์ ํ ํ์ฉํ์ฌ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์คํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋์ ์ฟผ๋ฆฌ์ ์ฅ์ ๊ณผ ๋จ์
๋์ ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋ ๋ ์คํ ์์ ์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ด ๋์ ์ผ๋ก ์์ฑ๋๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋์ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ๊ณผ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค:
์ฅ์
์ ์ฐ์ฑ: ๋์ ์ฟผ๋ฆฌ๋ ์คํ ์์ ์ ์กฐ๊ฑด์ด๋ ๋ณ์์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ๋์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ค์ํ ์ํฉ์ ๋์ํ๊ธฐ ์ฝ๊ณ , ๋ณต์กํ ์กฐ๊ฑด ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ฑ๋ฅ ์ต์ ํ: ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ์์ ์ ์ค์ ๋ฐ์ดํฐ๋ ์กฐ๊ฑด์ ๋ง๊ฒ ์ฟผ๋ฆฌ๋ฌธ์ ์ต์ ํํ ์ ์์ต๋๋ค. ์ ์ ์ฟผ๋ฆฌ๋ณด๋ค ๋ ํจ์จ์ ์ธ ์คํ ๊ณํ์ ์์ฑํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ณด์: ๋์ ์ฟผ๋ฆฌ๋ ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ๋์ ์ผ๋ก ์ฟผ๋ฆฌ์ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ SQL ์ธ์ ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ ๋ ฅ๊ฐ์ ํ์ดํธ๋ฆฌ์คํธ๋ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ํตํด ์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋จ์
๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ ์ด๋ ค์: ๋์ ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋ ๋ ๋์ ์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ์ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๊ณ , ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์์ ํ๊ธฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
SQL์ ๊ตฌ๋ฌธ ๊ฒ์ฌ๊ฐ ์ด๋ ค์: ๋์ ์ฟผ๋ฆฌ๋ ์คํ ์์ ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ฒดํฌํ๊ฑฐ๋ ๋๋ฒ๊ทธํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋ฐ๋ผ์, SQL ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๋ณด์ ์ทจ์ฝ์ : ๋์ ์ฟผ๋ฆฌ์์๋ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์๋ชป๋ ์ ๋ ฅ์ผ๋ก ์ธํด ๋ณด์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ ์ธ์ ์ ๋ฑ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ผ๋ฏ๋ก, ์ ์ ํ ๋ณด์ ์กฐ์น๊ฐ ํ์ํฉ๋๋ค.
๋์ ์ฟผ๋ฆฌ์ ์ฅ์ ๊ณผ ๋จ์ ์ ๊ณ ๋ คํ์ฌ ์ฌ์ฉํ ๋์๋ ์ ์ฐ์ฑ๊ณผ ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ์ ์ ํ ์ฌ์ฉ๋ฒ๊ณผ ๋ณด์์ ๋ํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์ฟผ๋ฆฌ์ ๋ณต์ก์ฑ๊ณผ ์ ์ง๋ณด์์ ์ด๋ ค์์ ์ต์ํํ๊ณ , ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฟผ๋ฆฌ๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋์ ์ฟผ๋ฆฌ ์ฌ์ฉ ์์
๋์ ์ฟผ๋ฆฌ๋ ์ค๋ผํด์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํํ๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๊ณ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ ์์ ๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋ถ์์ ์ง์ ์ ๋ณด๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
DECLARE
query_str VARCHAR2(1000); -- ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ณ์ ์ ์ธ
department_id NUMBER := 10; -- ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ๋ณ์
cursor_var SYS_REFCURSOR; -- ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์ปค์ ๋ณ์ ์ ์ธ
BEGIN
-- ๋์ ์ฟผ๋ฆฌ ์์ฑ
query_str := 'SELECT * FROM employees WHERE department_id = ' || department_id;
-- ๋์ ์ฟผ๋ฆฌ ์คํ
EXECUTE IMMEDIATE query_str INTO cursor_var;
-- ๊ฒฐ๊ณผ ์ถ๋ ฅ
LOOP
FETCH cursor_var INTO ...
EXIT WHEN cursor_var%NOTFOUND;
-- ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
END LOOP;
CLOSE cursor_var;
END;
/
์ ์์ ์์, query_str
๋ณ์์๋ ๋์ ์ผ๋ก ์์ฑ๋ ์ฟผ๋ฆฌ๊ฐ ์ ์ฅ๋ฉ๋๋ค. department_id
๋ณ์๋ ์คํ ์์ ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฐ์ ์ ์ฅํ๋ ๋ณ์์
๋๋ค. ์ด ์์ ์์๋ department_id
๊ฐ 10์ธ ๋ถ์์ ์ง์ ์ ๋ณด๋ฅผ ์กฐํํ๊ธฐ ์ํด ๋์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํฉ๋๋ค.
EXECUTE IMMEDIATE
๋ฌธ์ ์ฌ์ฉํ์ฌ query_str
๋ณ์์ ์ ์ฅ๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๊ฒฐ๊ณผ๋ cursor_var
๋ณ์์ ์ ์ฅ๋ ํ, ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐ๋ณต๋ฌธ ๋ด์์ FETCH
๋ฌธ์ ์ฌ์ฉํ์ฌ ์ปค์์์ ์ง์ ์ ๋ณด๋ฅผ ์ฝ์ด์ค๊ณ , EXIT WHEN
๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ์ด์ ๊ฒฐ๊ณผ๊ฐ ์์ ๊ฒฝ์ฐ ๋ฐ๋ณต๋ฌธ์ ์ข
๋ฃํฉ๋๋ค.
๋์ ์ฟผ๋ฆฌ ์ฌ์ฉ ์์ ๋ฅผ ํตํด ๋์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ์ ์ฐํ๊ฒ ์์ฑํ๊ณ ์คํํ ์ ์์ต๋๋ค.
๋๊ธ