存儲過程核心優勢
- 效能: 編譯後儲於 Server 端,執行無網路傳輸 SQL 文本開銷。
- 安全: 封裝業務邏輯,隱藏表結構,授權
EXECUTE 而非 SELECT/INSERT。
- 模組化: 共用邏輯集中維護,應用端僅呼叫介面。
- 減少網路往返: 批次業務單次呼叫完成多步驟。
參數三屬性
| 屬性 | 說明 |
| 名稱 | 合法 PL/SQL 識別碼 |
| 模式 | IN (預設,唯讀)、OUT (唯寫,返回值)、IN OUT (雙向) |
| 資料型別 | 標量型別、%TYPE、%ROWTYPE、PL/SQL 型別、物件型別 |
%TYPE 參照欄位型別,%ROWTYPE 參照整列結構,結構變更自動同步,極利維護。
建立最簡存儲過程
CREATE OR REPLACE PROCEDURE pro_1 (p_id VARCHAR2) IS
v_name VARCHAR2(20);
BEGIN
DBMS_OUTPUT.PUT_LINE('ID:' || p_id || ' Name:' || v_name);
END;
CREATE OR REPLACE:不存在則建立,存在則覆蓋(保留權限)。
IS ... BEGIN ... END;:宣告區與執行區。
編譯存儲過程
- 工具:PL/SQL Developer → Execute (F8)。
- 命令列:
ALTER PROCEDURE pro_1 COMPILE;(需 ALTER ANY PROCEDURE 權限)。
呼叫存儲過程
| 環境 | 語法 |
| PL/SQL 區塊 | BEGIN pro_1('00813045'); END; |
| SQL*Plus / SQLcl | SET SERVEROUTPUT ON; EXECUTE pro_1('00813025'); |
| Shell 腳本 | sqlplus -s user/pass @call_proc.sql 內含 EXEC pro_1(...); |
刪除存儲過程
DROP PROCEDURE pro_1;
進階:Invoker's Rights vs Definer's Rights
CREATE PROCEDURE proc_ir AUTHID CURRENT_USER IS ... -- 呼叫者權限
CREATE PROCEDURE proc_dr AUTHID DEFINER IS ... -- 定義者權限(預設)
- Definer's Rights: 以擁有者權限執行,呼叫者僅需
EXECUTE 權限,核心封裝模式。
- Invoker's Rights: 以呼叫者權限執行,適用於需操作呼叫者 Schema 物件的工具類程序。
總結
存儲過程 = Server 端業務邏輯容器。掌握 CREATE PROCEDURE、IN/OUT/IN OUT 參數模式、ALTER PROCEDURE COMPILE、EXECUTE 呼叫、DROP PROCEDURE 五大核心操作,並理解 AUTHID 權限模型,即可開始編寫生產級存儲過程。
- 上一篇文章: Oracle Package 完整指南:封裝、權限控制、重載與實戰最佳實踐
- 下一篇文章: Oracle 動態 SQL 完整教學:EXECUTE IMMEDIATE、USING/INTO/RETURNING/BULK COLLECT 實戰
Copyright ©
程式碼之家 All Rights Reserved