νλ‘μμ (Procedure)
νΉμ μ
무λ₯Ό μ²λ¦¬νλ μΌλ ¨μ μμ
μ νλ‘κ·Έλ¨μΌλ‘ μ μ₯νμ¬ μ¬μ©νλ κ°μ²΄
ν¨μ vs νλ‘μμ λΉκ΅
κ΅¬λΆ | ν¨μ(Function) | νλ‘μμ (Procedure) |
λ°νκ° | λ°λμ νλμ κ°μ λ°ν | λ°νκ°μ΄ μκ±°λ μ¬λ¬ κ° κ°λ₯ |
μ€ν λ°©λ² | SELECT λ¬Έμμ μ§μ νΈμΆ κ°λ₯ | EXECUTE λ¬ΈμΌλ‘ νΈμΆ |
μ£Ό μ©λ | κ³μ° κ²°κ³Ό λ°ν | 볡μ‘ν λΉμ¦λμ€ λ‘μ§ μ²λ¦¬ |
DML μ¬μ© | μ νμ | μμ λ‘κ² μ¬μ© κ°λ₯ |
νλ‘μμ μμ±
β’
νλΌλ―Έν° μλ νλ‘μμ
CREATE OR REPLACE PROCEDURE νλ‘μμ λͺ
IS | AS
μ μΈλΆ
BEGIN
μ€νλΆ
EXCEPTION
μμΈ μ²λ¦¬λΆ
END [νλ‘μμ λͺ
];
SQL
볡μ¬
β’
νλΌλ―Έν° μλ νλ‘μμ
CREATE OR REPLACE PROCEDURE νλ‘μμ λͺ
(
νλΌλ―Έν°1 [IN / OUT / IN OUT] λ°μ΄ν°νμ
[ := κ° | DEFAULT κΈ°λ³Έκ° ],
νλΌλ―Έν°2 [IN / OUT / IN OUT] λ°μ΄ν°νμ
[ := κ° | DEFAULT κΈ°λ³Έκ° ],
...
)
IS | AS
μ μΈλΆ
BEGIN
μ€νλΆ
EXCEPTION
μμΈ μ²λ¦¬λΆ
END [νλ‘μμ λͺ
];
SQL
볡μ¬
νλΌλ―Έν° λͺ¨λ
λͺ¨λ | μ€λͺ
| λ°μ΄ν° νλ¦ | κΈ°λ³Έκ° μ€μ |
IN | μ
λ ₯ μ μ© νλΌλ―Έν° | νΈμΆλΆ β νλ‘μμ | κ°λ₯ |
OUT | μΆλ ₯ μ μ© νλΌλ―Έν° | νλ‘μμ β νΈμΆλΆ | λΆκ°λ₯ |
IN OUT | μ
μΆλ ₯ νλΌλ―Έν° | μλ°©ν₯ (νΈμΆλΆ | κ°λ₯ |
β’
νλ‘μμ λ‘ κ°μ μ λ¬λ§ νλ νλΌλ―Έν°μ
λλ€.
β’
νλ‘μμ λ΄λΆμμ κ°μ λ³κ²½ν μ μμ΅λλ€ (μ½κΈ° μ μ©).
β’
κΈ°λ³Έκ°μ μ€μ ν μ μμΌλ©°, μλ΅ μ κΈ°λ³Έ λͺ¨λμ
λλ€.
β’
리ν°λ΄, λ³μ, μμ λ±μ μ λ¬ν μ μμ΅λλ€.
β’
νλ‘μμ μμ νΈμΆλΆλ‘ κ°μ λ°ννλ νλΌλ―Έν°μ
λλ€.
β’
νλ‘μμ λ΄λΆμμ κ°μ ν λΉν΄μΌ ν©λλ€.
β’
νΈμΆ μ λ°λμ λ³μλ₯Ό μ λ¬ν΄μΌ ν©λλ€ (리ν°λ΄ λΆκ°).
β’
κΈ°λ³Έκ°μ μ€μ ν μ μμ΅λλ€.
β’
νλ‘μμ μμ μ μλμΌλ‘ NULLλ‘ μ΄κΈ°νλ©λλ€.
β’
νλ‘μμ λ‘ κ°μ μ λ¬νκ³ , λ€μ κ²°κ³Όλ₯Ό λ°μμ€λ νλΌλ―Έν°μ
λλ€.
β’
νλ‘μμ λ΄λΆμμ κ°μ μ½κ³ μμ ν μ μμ΅λλ€.
β’
νΈμΆ μ λ°λμ λ³μλ₯Ό μ λ¬ν΄μΌ ν©λλ€.
β’
κΈ°λ³Έκ°μ μ€μ ν μ μμ΅λλ€.
β’
κ°μ λμ νκ±°λ λ³ννλ μμ
μ μ μ©ν©λλ€.
νλ‘μμ μμ± μμ
β’
νλΌλ―Έν° μλ νλ‘μμ
β’
νλΌλ―Έν° μλ νλ‘μμ
β’
νλΌλ―Έν° μλ νλ‘μμ
CREATE OR REPLACE PROCEDURE update_all_salaries
IS
v_count NUMBER := 0;
BEGIN
UPDATE employees
SET salary = salary * 1.05; -- μ μ§μ 5% μΈμ
v_count := SQL%ROWCOUNT; -- μν₯λ°μ ν μ
COMMIT;
DBMS_OUTPUT.PUT_LINE(v_count || 'λͺ
μ κΈμ¬κ° μΈμλμμ΅λλ€.');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('μ€λ₯ λ°μ: ' || SQLERRM);
END update_all_salaries;
/
SQL
볡μ¬
β’
νλΌλ―Έν° μλ νλ‘μμ
νλΌλ―Έν° λͺ¨λμλ IN, OUT, IN OUT μΈ κ°μ§κ° μμ΅λλ€.
CREATE OR REPLACE PROCEDURE get_emp_info
(
p_emp_id IN NUMBER, -- μ
λ ₯ νλΌλ―Έν°
p_emp_name OUT VARCHAR2, -- μΆλ ₯ νλΌλ―Έν°
p_salary OUT NUMBER, -- μΆλ ₯ νλΌλ―Έν°
p_dept_name OUT VARCHAR2 -- μΆλ ₯ νλΌλ―Έν°
)
IS
BEGIN
SELECT e.emp_name,
e.salary,
d.dept_title
INTO p_emp_name, p_salary, p_dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_code = d.dept_id
WHERE e.emp_id = p_emp_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_emp_name := 'λ°μ΄ν° μμ';
p_salary := 0;
p_dept_name := 'λΆμ μμ';
END get_emp_info;
/
SQL
볡μ¬
νλ‘μμ μμ± (κΈ°λ³Έκ° μ€μ )
CREATE OR REPLACE PROCEDURE increase_salary
(
p_emp_id IN NUMBER,
p_rate IN NUMBER := 0.1, -- κΈ°λ³Έκ° 10%
p_bonus IN NUMBER DEFAULT 0 -- κΈ°λ³Έκ° 0
)
IS
BEGIN
UPDATE employees
SET salary = salary * (1 + p_rate),
bonus = p_bonus
WHERE emp_id = p_emp_id;
COMMIT;
DBMS_OUTPUT.PUT_LINE('κΈμ¬κ° μΈμλμμ΅λλ€.');
END increase_salary;
/
SQL
볡μ¬
νλ‘μμ μ€ν
λ°©λ² 1: EXECUTE λ¬Έ μ¬μ©
β’
νλΌλ―Έν°κ° μκ°λ IN νλΌλ―Έν°λ§ μλ κ²½μ°
EXECUTE νλ‘μμ λͺ
;
EXECUTE νλ‘μμ λͺ
(μΈμ1, μΈμ2, ...);
EXECUTE νλ‘μμ λͺ
(νλΌλ―Έν°1 => μΈμ1, νλΌλ―Έν°2 => μΈμ2, ...);
SQL
볡μ¬
β’
μμ
SET SERVEROUTPUT ON;
-- νλΌλ―Έν° μλ νλ‘μμ
EXECUTE update_all_salaries;
-- νλΌλ―Έν° μλ νλ‘μμ (μμΉ κΈ°λ°)
EXECUTE increase_salary(100, 0.15, 0.2);
-- νλΌλ―Έν° μλ νλ‘μμ (μ΄λ¦ κΈ°λ°)
EXECUTE increase_salary(p_emp_id => 100, p_rate => 0.15);
SQL
볡μ¬
λ°©λ² 2: PL/SQL λΈλ‘ λ΄μμ μ€ν
β’
OUT νλΌλ―Έν°κ° μλ κ²½μ°
DECLARE
λ³μ1 λ°μ΄ν°νμ
;
λ³μ2 λ°μ΄ν°νμ
;
...
BEGIN
νλ‘μμ λͺ
(INνλΌλ―Έν°, OUTλ³μ1, OUTλ³μ2, ...);
-- λ°νλ κ° μ¬μ©
DBMS_OUTPUT.PUT_LINE(λ³μ1);
DBMS_OUTPUT.PUT_LINE(λ³μ2);
END;
/
SQL
볡μ¬
β’
μμ
DECLARE
v_name VARCHAR2(50);
v_sal NUMBER;
v_dept VARCHAR2(50);
BEGIN
get_emp_info(100, v_name, v_sal, v_dept);
DBMS_OUTPUT.PUT_LINE('μ΄λ¦: ' || v_name);
DBMS_OUTPUT.PUT_LINE('κΈμ¬: ' || v_sal);
DBMS_OUTPUT.PUT_LINE('λΆμ: ' || v_dept);
END;
/
SQL
볡μ¬
νλ‘μμ μμ
DROP PROCEDURE νλ‘μμ λͺ
;
SQL
볡μ¬
β’
μμ
DROP PROCEDURE update_all_salaries;
SQL
볡μ¬
μ€μ μμ
μμ 1: λΆμλ³ κΈμ¬ ν΅κ³ νλ‘μμ
CREATE OR REPLACE PROCEDURE get_dept_salary_stats
(
p_dept_code IN VARCHAR2,
p_avg_sal OUT NUMBER,
p_max_sal OUT NUMBER,
p_min_sal OUT NUMBER,
p_emp_count OUT NUMBER
)
IS
BEGIN
SELECT AVG(salary), MAX(salary), MIN(salary), COUNT(*)
INTO p_avg_sal, p_max_sal, p_min_sal, p_emp_count
FROM employees
WHERE dept_code = p_dept_code;
DBMS_OUTPUT.PUT_LINE('=== λΆμ κΈμ¬ ν΅κ³ ===');
DBMS_OUTPUT.PUT_LINE('νκ· κΈμ¬: ' || TO_CHAR(p_avg_sal, '999,999,999'));
DBMS_OUTPUT.PUT_LINE('μ΅κ³ κΈμ¬: ' || TO_CHAR(p_max_sal, '999,999,999'));
DBMS_OUTPUT.PUT_LINE('μ΅μ κΈμ¬: ' || TO_CHAR(p_min_sal, '999,999,999'));
DBMS_OUTPUT.PUT_LINE('μΈμ μ: ' || p_emp_count || 'λͺ
');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('ν΄λΉ λΆμμ μ§μμ΄ μμ΅λλ€.');
END get_dept_salary_stats;
/
SQL
볡μ¬
μμ 2: μ§μ μ 보 μΌκ΄ μ λ°μ΄νΈ νλ‘μμ
CREATE OR REPLACE PROCEDURE batch_update_employees
(
p_dept_code IN VARCHAR2,
p_salary_rate IN NUMBER DEFAULT 1.0,
p_bonus_rate IN NUMBER DEFAULT 0
)
IS
v_count NUMBER;
BEGIN
UPDATE employees
SET salary = salary * p_salary_rate,
bonus = bonus + p_bonus_rate
WHERE dept_code = p_dept_code;
v_count := SQL%ROWCOUNT;
COMMIT;
DBMS_OUTPUT.PUT_LINE(v_count || 'λͺ
μ μ§μ μ λ³΄κ° μ
λ°μ΄νΈλμμ΅λλ€.');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('μ€λ₯ λ°μ: ' || SQLERRM);
RAISE;
END batch_update_employees;
/
SQL
볡μ¬
β’
볡μ‘ν λΉμ¦λμ€ λ‘μ§μ νλ‘μμ λ‘ μΊ‘μννμ¬ μ¬μ¬μ©μ±μ λμ΄μΈμ
β’
νΈλμμ
μ²λ¦¬κ° νμν μμ
μ νλ‘μμ μμ COMMIT/ROLLBACKμ λͺ
μνμΈμ
β’
μμΈ μ²λ¦¬λ₯Ό λ°λμ ν¬ν¨νμ¬ μμ μ±μ ν보νμΈμ
β’
OUT νλΌλ―Έν°λ₯Ό νμ©νμ¬ μ¬λ¬ κ°μ λ°νν μ μμ΅λλ€
μ£Όμ μ°¨μ΄μ μ 리
ν¨μ (Function)
β’
β’
β’
β’
β’
νλ‘μμ (Procedure)
β’
β’
β’
β’
β’


