Oracle 存儲過程與函數完整語法指南
一、存儲過程結構三部曲
CREATE OR REPLACE PROCEDURE proc_name (param_list) IS
-- 1. 定義部:變量/常量/游標/異常聲明
v_ename VARCHAR2(20);
v_sal NUMBER(7,2);
BEGIN
-- 2. 執行部:業務邏輯 SQL/PLSQL
SELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('員工:'||v_ename||' 薪資:'||v_sal);
EXCEPTION
-- 3. 異常處理部
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('員工編號不存在');
END;
/
二、參數模式
IN(默認):只讀,可傳常量/變量/表達式。
OUT:只寫,必須傳變量,返回值給調用者。
IN OUT:可讀寫,傳變量,進出雙向傳值。
三、帶參數過程示例
CREATE OR REPLACE PROCEDURE update_sal (p_ename VARCHAR2, p_sal NUMBER) IS
BEGIN
UPDATE emp SET sal = p_sal WHERE ename = p_ename;
END;
/
-- 調用
EXEC update_sal('SCOTT', 1200);
-- 或
CALL update_sal('SCOTT', 1200);
四、函數(必須有 RETURN)
CREATE OR REPLACE FUNCTION get_annual_sal (p_ename VARCHAR2) RETURN NUMBER IS
v_annual NUMBER;
BEGIN
SELECT sal*12 + NVL(comm,0) INTO v_annual FROM emp WHERE ename = p_ename;
RETURN v_annual;
END;
/
-- 調用
VAR ys NUMBER;
CALL get_annual_sal('SCOTT') INTO :ys;
PRINT ys;
五、調用方式總結
| 方式 | 無參過程 | 有參過程 | 函數 |
| SQL*Plus | EXEC proc(); / CALL proc(); | EXEC proc('A',1); / CALL proc('A',1); | VAR r NUMBER; CALL func('A') INTO :r; |
| PL/SQL 塊 | proc(); | proc('A',1); | v := func('A'); |