PL/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๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โข
์์
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 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
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
๋ณต์ฌ


