Search
Duplicate

PL/SQL

PL/SQL

SQL ์„ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ™•์žฅํ•œ ์–ธ์–ด
PL/SQL(Procedural Language/SQL)์€ ์˜ค๋ผํด์—์„œ ์ œ๊ณตํ•˜๋Š” ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ, SQL์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜์—ฌ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

โ€ข
PL/SQL ๊ธฐ๋ณธ ๊ตฌ์กฐ
โ€ข
๊ธฐ๋ณธ ๋ฌธ๋ฒ•์‚ฌํ•ญ
โ€ข
PL/SQL ๊ตฌ์„ฑ์š”์†Œ
โ—ฆ
๋ณ€์ˆ˜
โ—ฆ
์ƒ์ˆ˜
โ—ฆ
์—ฐ์‚ฐ์ž
โ—ฆ
์ฃผ์„
โ—ฆ
DML ๋ฌธ
โ€ข
๋ฐ์ดํ„ฐ ํƒ€์ž…
โ€ข
์—ฐ์‚ฐ์ž
โ€ข
์ฃผ์„
โ€ข
DML ๋ฌธ
โ€ข
์ œ์–ด๋ฌธ
โ—ฆ
์กฐ๊ฑด๋ฌธ
โ—ฆ
๋ฐ˜๋ณต๋ถ„

PL/SQL ๊ธฐ๋ณธ ๊ตฌ์กฐ

PL/SQL์€ ๋ธ”๋ก(Block) ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.

๋ธ”๋ก์˜ ๊ตฌ์กฐ

DECLARE -- ์„ ์–ธ๋ถ€: ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ์ปค์„œ ๋“ฑ์„ ์„ ์–ธ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์„ ์–ธ; BEGIN -- ์‹คํ–‰๋ถ€: ์‹ค์ œ ๋กœ์ง์„ ๊ตฌํ˜„ ์‹คํ–‰ ๋ช…๋ น์–ด; EXCEPTION -- ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ถ€: ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ฒ˜๋ฆฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„; END; /
SQL
๋ณต์‚ฌ
์ต๋ช… ๋ธ”๋ก(Anonymous Block) ์ด๋ฆ„์ด ์—†๋Š” ๋ธ”๋ก์œผ๋กœ, ์ปดํŒŒ์ผ๊ณผ ๋™์‹œ์— ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ผํšŒ์„ฑ ์ž‘์—…์ด๋‚˜ ํ…Œ์ŠคํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

PL/SQL ์ถœ๋ ฅ ์„ค์ •

SET SERVEROUTPUT ON; -- ์ถœ๋ ฅ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” BEGIN DBMS_OUTPUT.PUT_LINE('Hello, PL/SQL!'); END; /
SQL
๋ณต์‚ฌ

๊ธฐ๋ณธ ๋ฌธ๋ฒ• ๊ทœ์น™

โ€ข
๋ธ”๋ก ํ‚ค์›Œ๋“œ(DECLARE, BEGIN, EXCEPTION)์—๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค
โ€ข
๊ฐ ์‹คํ–‰ ๋ฌธ์žฅ์˜ ๋์—๋Š” ์„ธ๋ฏธ์ฝœ๋ก (;)์„ ๋ถ™์ž…๋‹ˆ๋‹ค
โ€ข
ํ•œ ์ค„ ์ฃผ์„: --, ์—ฌ๋Ÿฌ ์ค„ ์ฃผ์„: /* */
โ€ข
PL/SQL ๋ธ”๋ก ์‹คํ–‰ ํ›„ ๋งˆ์ง€๋ง‰์— /๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค

PL/SQL ๊ตฌ์„ฑ์š”์†Œ

โ€ข
๋ณ€์ˆ˜
โ€ข
์ƒ์ˆ˜
โ€ข
์—ฐ์‚ฐ์ž
โ€ข
์ฃผ์„
โ€ข
DML๋ฌธ

๋ณ€์ˆ˜

๋ณ€์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์„ ์–ธ

๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž… := ๊ฐ’;
SQL
๋ณต์‚ฌ

๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •

๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž… DEFAULT ๊ฐ’;
SQL
๋ณต์‚ฌ

๋ณ€์ˆ˜์˜ NOT NULL ์ง€์ •

๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํƒ€์ž… NOT NULL ๊ฐ’;
SQL
๋ณต์‚ฌ
DECLARE v_name VARCHAR2(50) := 'ํ™๊ธธ๋™'; v_age NUMBER := 25; v_salary NUMBER(10,2); BEGIN v_salary := 3000000; DBMS_OUTPUT.PUT_LINE('์ด๋ฆ„: ' || v_name); END; /
SQL
๋ณต์‚ฌ

์ƒ์ˆ˜

์ƒ์ˆ˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
์ƒ์ˆ˜๋ช… CONSTANT ๋ฐ์ดํ„ฐํƒ€์ž… := ๊ฐ’;
SQL
๋ณต์‚ฌ
DECLARE c_rate CONSTANT NUMBER := 0.05; -- ์„ธ์œจ 5% BEGIN DBMS_OUTPUT.PUT_LINE('์„ธ์œจ: ' || c_rate); END; /
SQL
๋ณต์‚ฌ

๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’๊ณผ ์ œ์•ฝ์กฐ๊ฑด

DECLARE v_count NUMBER DEFAULT 0; -- ๊ธฐ๋ณธ๊ฐ’ ์ง€์ • v_name VARCHAR2(50) NOT NULL := 'Admin'; -- NOT NULL ์ œ์•ฝ BEGIN NULL; END; /
SQL
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ํƒ€์ž…

๋ถ„๋ฅ˜
์„ค๋ช…
์˜ˆ์‹œ
์Šค์นผ๋ผํ˜•
๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…
NUMBER, CHAR, VARCHAR2, DATE, BOOLEAN
์ฐธ์กฐํ˜•(%TYPE)
ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์˜ ํƒ€์ž… ์ฐธ์กฐ
v_name employees.emp_name%TYPE;
๋ ˆ์ฝ”๋“œํ˜•(%ROWTYPE)
ํ…Œ์ด๋ธ” ์ „์ฒด ํ–‰์˜ ๊ตฌ์กฐ ์ฐธ์กฐ
v_emp employees%ROWTYPE;
DECLARE -- ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์‹œ v_emp_name employees.emp_name%TYPE; v_salary employees.salary%TYPE := 5000000; BEGIN SELECT emp_name INTO v_emp_name FROM employees WHERE emp_id = 100; END; /
SQL
๋ณต์‚ฌ
%TYPE์˜ ์žฅ์ 
ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ PL/SQL ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„

(์šฐ์„ ์ˆœ์œ„ ๋†’์Œ)
**
์ œ๊ณฑ ์—ฐ์‚ฐ์ž
+, -
๋ถ€ํ˜ธ ์—ฐ์‚ฐ์ž (+10, -10)
*, /
๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ
+, -, ||
๋ง์…ˆ, ๋บ„์…ˆ, ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž (1+2)
>, <, >=, <=
๋น„๊ต ์—ฐ์‚ฐ์ž
NOT
๋ถ€์ • ์—ฐ์‚ฐ์ž
AND
๊ทธ๋ฆฌ๊ณ 
OR
๋˜๋Š”
(์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์Œ)

์ฃผ์„

์ข…๋ฅ˜
๊ธฐํ˜ธ
ํ•œ ์ค„ ์ฃผ์„
--
์—ฌ๋Ÿฌ ์ค„ ์ฃผ์„
/* ํ•œ ์ค„ ๋‘ ์ค„ */

DML ๋ฌธ ์‚ฌ์šฉ

PL/SQL์—์„œ๋Š” SELECT, INSERT, UPDATE, DELETE๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
PL/SQL ์ƒ์—์„œ DDL ์€ ์ง์ ‘ ์“ธ ์ˆ˜ ์—†๋‹ค.
PL/SQL ์—์„œ๋Š” ์ฃผ๋กœ DML ์„ ์‚ฌ์šฉํ•œ๋‹ค.
โ€ข
์˜ˆ์‹œ
DECLARE v_emp_name employees.emp_name%TYPE; v_dept_name departments.dept_title%TYPE; BEGIN SELECT e.emp_name, d.dept_title INTO v_emp_name, v_dept_name -- ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ FROM employees e JOIN departments d ON e.dept_code = d.dept_id WHERE e.emp_id = 100; DBMS_OUTPUT.PUT_LINE('์‚ฌ์›๋ช…: ' || v_emp_name); DBMS_OUTPUT.PUT_LINE('๋ถ€์„œ๋ช…: ' || v_dept_name); END; /
SQL
๋ณต์‚ฌ

์ œ์–ด๋ฌธ

โ€ข
์กฐ๊ฑด๋ฌธ
โ€ข
๋ฐ˜๋ณต๋ฌธ
โ€ข
๊ธฐํƒ€ ์ œ์–ด๋ฌธ

์กฐ๊ฑด๋ฌธ - IF ๋ฌธ

IF ~ THEN (๋‹จ์ˆœ ์กฐ๊ฑด)

IF ์กฐ๊ฑด์‹ THEN ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; END IF;
SQL
๋ณต์‚ฌ
DECLARE v_score NUMBER := 85; BEGIN IF v_score >= 60 THEN DBMS_OUTPUT.PUT_LINE('ํ•ฉ๊ฒฉ์ž…๋‹ˆ๋‹ค!'); END IF; END; /
SQL
๋ณต์‚ฌ

IF ~ THEN ~ ELSE (์–‘์žํƒ์ผ)

IF ์กฐ๊ฑด์‹ THEN ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; ELSE ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; END IF;
SQL
๋ณต์‚ฌ
DECLARE v_age NUMBER := 20; BEGIN IF v_age >= 19 THEN DBMS_OUTPUT.PUT_LINE('์„ฑ์ธ์ž…๋‹ˆ๋‹ค.'); ELSE DBMS_OUTPUT.PUT_LINE('๋ฏธ์„ฑ๋…„์ž์ž…๋‹ˆ๋‹ค.'); END IF; END; /
SQL
๋ณต์‚ฌ

IF ~ THEN ~ ELSIF (๋‹ค์ค‘ ์กฐ๊ฑด)

IF ์กฐ๊ฑด์‹ THEN ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; ELSEIF ์กฐ๊ฑด์‹ THEN ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; ELSEIF ์กฐ๊ฑด์‹ THEN ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; ELSE ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; END IF;
SQL
๋ณต์‚ฌ
DECLARE v_score NUMBER := 85; v_grade CHAR(1); BEGIN IF v_score >= 90 THEN v_grade := 'A'; ELSIF v_score >= 80 THEN v_grade := 'B'; ELSIF v_score >= 70 THEN v_grade := 'C'; ELSIF v_score >= 60 THEN v_grade := 'D'; ELSE v_grade := 'F'; END IF; DBMS_OUTPUT.PUT_LINE('ํ•™์ : ' || v_grade); END; /
SQL
๋ณต์‚ฌ

์กฐ๊ฑด๋ฌธ - CASE ๋ฌธ

CASE ๋น„๊ต ๊ธฐ์ค€ WHEN ๊ฐ’1 THEN ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; WHEN ๊ฐ’2 THEN ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; ... ELSE ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; END CASE;
SQL
๋ณต์‚ฌ
DECLARE v_dept_code CHAR(2) := 'D1'; v_dept_name VARCHAR2(50); BEGIN CASE v_dept_code WHEN 'D1' THEN v_dept_name := '์ธ์‚ฌํŒ€'; WHEN 'D2' THEN v_dept_name := 'ํšŒ๊ณ„ํŒ€'; WHEN 'D3' THEN v_dept_name := '๋งˆ์ผ€ํŒ…ํŒ€'; ELSE v_dept_name := '๊ธฐํƒ€๋ถ€์„œ'; END CASE; DBMS_OUTPUT.PUT_LINE('๋ถ€์„œ: ' || v_dept_name); END; /
SQL
๋ณต์‚ฌ

๋ฐ˜๋ณต๋ฌธ

์‹คํ–‰ํ๋ฆ„์„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฌธ์žฅ
โ€ข
์ข…๋ฅ˜
โ—ฆ
LOOP
โ—ฆ
WHILE LOOP
โ—ฆ
FOR LOOP

LOOP

๊ธฐ๋ณธ LOOP๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋กœ, EXIT ๋ฌธ์œผ๋กœ ํƒˆ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
LOOP ๋ฐ˜๋ณต ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; (EXIT WHEN ์ข…๋ฃŒ์กฐ๊ฑด); END LOOP;
SQL
๋ณต์‚ฌ
DECLARE v_count NUMBER := 1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(v_count || '๋ฒˆ์งธ ๋ฐ˜๋ณต'); v_count := v_count + 1; EXIT WHEN v_count > 5; -- ์กฐ๊ฑด ๋งŒ์กฑ ์‹œ ์ข…๋ฃŒ END LOOP; END; /
SQL
๋ณต์‚ฌ

WHILE LOOP

์กฐ๊ฑด์ด TRUE์ผ ๋™์•ˆ ๋ฐ˜๋ณต ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
WHILE ์กฐ๊ฑด์‹ LOOP ๋ฐ˜๋ณต ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; END LOOP;
SQL
๋ณต์‚ฌ
DECLARE v_count NUMBER := 1; BEGIN WHILE v_count <= 5 LOOP DBMS_OUTPUT.PUT_LINE(v_count || '๋ฒˆ์งธ ๋ฐ˜๋ณต'); v_count := v_count + 1; END LOOP; END; /
SQL
๋ณต์‚ฌ

FOR LOOP

์ง€์ •๋œ ๋ฒ”์œ„๋งŒํผ ์ž๋™์œผ๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
FOR i IN ์‹œ์ž‘๊ฐ’..์ข…๋ฃŒ๊ฐ’ LOOP ๋ฐ˜๋ณต ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; END FOR; FOR i N REVERSE ์‹œ์ž‘๊ฐ’..์ข…๋ฃŒ๊ฐ’ LOOP ๋ฐ˜๋ณต ์‹คํ–‰ํ•  ๋ช…๋ น์–ด; END LOOP;
SQL
๋ณต์‚ฌ
BEGIN -- 1๋ถ€ํ„ฐ 5๊นŒ์ง€ ์ฆ๊ฐ€ FOR i IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE(i || '๋ฒˆ์งธ ๋ฐ˜๋ณต'); END LOOP; -- 5๋ถ€ํ„ฐ 1๊นŒ์ง€ ๊ฐ์†Œ FOR i IN REVERSE 1..5 LOOP DBMS_OUTPUT.PUT_LINE(i || '๋ฒˆ์งธ ์—ญ์ˆœ ๋ฐ˜๋ณต'); END LOOP; END; /
SQL
๋ณต์‚ฌ

๊ธฐํƒ€ ์ œ์–ด๋ฌธ

โ€ข
EXIT
โ€ข
CONTINUE
๋ช…๋ น์–ด
์„ค๋ช…
EXIT
๋ฐ˜๋ณต๋ฌธ์„ ์ฆ‰์‹œ ์ข…๋ฃŒ
EXIT WHEN ์กฐ๊ฑด
์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ
CONTINUE
ํ˜„์žฌ ๋ฐ˜๋ณต ์ฃผ๊ธฐ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋‹ค์Œ ๋ฐ˜๋ณต์œผ๋กœ
CONTINUE WHEN ์กฐ๊ฑด
์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ํ˜„์žฌ ๋ฐ˜๋ณต ์ฃผ๊ธฐ๋ฅผ ๊ฑด๋„ˆ๋œ€
BEGIN FOR i IN 1..10 LOOP -- ์ง์ˆ˜๋Š” ๊ฑด๋„ˆ๋›ฐ๊ธฐ CONTINUE WHEN MOD(i, 2) = 0; -- 7๋ณด๋‹ค ํฌ๋ฉด ์ข…๋ฃŒ EXIT WHEN i > 7; DBMS_OUTPUT.PUT_LINE('ํ™€์ˆ˜: ' || i); END LOOP; END; /
SQL
๋ณต์‚ฌ