所有 Oracle 預存程序皆包含:
CREATE OR REPLACE PROCEDURE NoParPro AS
-- 宣告區
v_msg VARCHAR2(100);
BEGIN
-- 執行區
v_msg := 'Hello, Oracle Procedure!';
DBMS_OUTPUT.PUT_LINE(v_msg);
EXCEPTION
-- 例外區
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END NoParPro;
/
-- 呼叫
BEGIN
NoParPro;
END;
/
EXEC NoParPro; -- SQL*Plus 簡寫
CREATE OR REPLACE PROCEDURE queryempname (
p_empno IN emp.empno%TYPE
) AS
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
BEGIN
SELECT ename, job INTO v_ename, v_job
FROM emp
WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('員工: ' || v_ename || ', 職位: ' || v_job);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('查無此員工編號: ' || p_empno);
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('資料異常:單一編號對應多筆記錄');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('其他錯誤: ' || SQLERRM);
END queryempname;
/
-- 呼叫
EXEC queryempname(7369);
CREATE OR REPLACE PROCEDURE runbyparameters (
p_sal IN emp.sal%TYPE, -- 僅輸入
p_ename OUT VARCHAR2, -- 僅輸出
p_job IN OUT VARCHAR2 -- 輸入輸出雙向
) AS
v_cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO v_cnt
FROM emp
WHERE sal > p_sal AND job = p_job;
IF v_cnt = 1 THEN
SELECT ename INTO p_ename
FROM emp
WHERE sal > p_sal AND job = p_job;
p_job := 'FOUND_' || p_job; -- 修改 IN OUT 參數
ELSE
p_ename := 'NOT_UNIQUE';
END IF;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
p_ename := 'MULTI_ROWS';
WHEN OTHERS THEN
p_ename := 'ERROR: ' || SQLERRM;
END runbyparameters;
/
-- 呼叫方式一:位置標記法(須依序)
DECLARE
v_sal emp.sal%TYPE := 1100;
v_ename VARCHAR2(40);
v_job VARCHAR2(40) := 'CLERK';
BEGIN
runbyparameters(v_sal, v_ename, v_job);
DBMS_OUTPUT.PUT_LINE('結果: ' || v_ename || ' | ' || v_job);
END;
/
-- 呼叫方式二:名稱標記法(順序任意,強烈建議)
DECLARE
v_sal emp.sal%TYPE := 1100;
v_ename VARCHAR2(40);
v_job VARCHAR2(40) := 'CLERK';
BEGIN
runbyparameters(p_sal => v_sal, p_ename => v_ename, p_job => v_job);
DBMS_OUTPUT.PUT_LINE('結果: ' || v_ename || ' | ' || v_job);
END;
/
| 模式 | 方向 | 可讀 | 可寫 | 預設值 | 傳遞機制 | 典型用途 |
|---|---|---|---|---|---|---|
| IN | 呼叫端 → 程序 | 是 | 否 | 可指定 | 值傳遞 | 輸入條件、過濾參數 |
| OUT | 程序 → 呼叫端 | 否 | 是 | 不可指定 | 參考傳遞 | 回傳計算結果、狀態碼 |
| IN OUT | 雙向 | 是 | 是 | 不可指定 | 參考傳遞 | 輸入初始值並經處理後回傳 |
DBMS_OUTPUT.PUT_LINE 印關鍵變數值;SQL Developer / PL/SQL Developer 內建除錯器可斷點單步。掌握「三段式結構、四種參數模式、兩種呼叫法、例外分層處理」,即可撰寫健壯、可維護、高效能的 Oracle 預存程序。建議將常用範本存為程式碼片段,加速開發流程。