從零開始掌握 Oracle PL/SQL 預存程序開發全流程。本文以最小化骨架程序為例,涵蓋環境準備、建立、執行、修改、除錯、刪除六大步驟,並說明 DBMS_OUTPUT、SET SERVEROUTPUT、編譯錯誤定位等核心技巧。
檔案 skeleton.sql:
CREATE OR REPLACE PROCEDURE skeleton
IS
BEGIN
NULL; -- PL/SQL 區塊至少需一條語句
END skeleton;
/
-- 逐行解析:
-- 1 CREATE OR REPLACE PROCEDURE skeleton -- 建立或覆蓋
-- 2 IS -- 宣告區開始
-- 3 BEGIN -- 執行區開始
-- 4 NULL; -- 空操作
-- 5 END skeleton; -- 結束
-- 6 / -- SQL*Plus 執行緩衝區
SQL> @skeleton
SQL> /
Procedure created.
-- 方式一:EXECUTE 命令
SQL> EXECUTE skeleton;
PL/SQL procedure successfully completed.
-- 方式二:匿名區塊呼叫
SQL> BEGIN
2 skeleton;
3 END;
4 /
PL/SQL procedure successfully completed.
編輯 skeleton.sql:
CREATE OR REPLACE PROCEDURE skeleton
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
END skeleton;
/
-- 重新建立
SQL> @skeleton
SQL> /
Procedure created.
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE skeleton;
Hello World!
PL/SQL procedure successfully completed.
關鍵:SET SERVEROUTPUT ON 必須在呼叫 DBMS_OUTPUT.PUT_LINE 之前執行,否則輸出不顯示。
-- 故意製造錯誤
CREATE OR REPLACE PROCEDURE bad_proc IS
BEGIN
SELECT * FROM non_exist_table; -- 表不存在
END;
/
-- SQL*Plus 回應:
Warning: Procedure created with compilation errors.
-- 查看錯誤
SQL> SHOW ERRORS
Errors for PROCEDURE BAD_PROC:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/3 PL/SQL: SQL Statement ignored
3/15 PL/SQL: ORA-00942: table or view does not exist
-- 或查詢視圖
SELECT * FROM user_errors WHERE name = 'BAD_PROC' ORDER BY sequence;
除錯循環:修改檔案 → @檔案 → / → SHOW ERRORS → 依錯誤行號定位 → 重複。
SQL> DROP PROCEDURE skeleton;
Procedure dropped.
屬 DDL 語句,隱含提交,不可回滾。
| 技巧 | 說明 |
|---|---|
| 參數錨定 | p_empno IN emp.empno%TYPE 防止 DDL 變更導致程式失效 |
| 區域變數 | 宣告區使用 v_ 前綴,避免與欄位名衝突 |
| 游標 FOR 迴圈 | FOR r IN (SELECT ...) LOOP ... END LOOP; 隱式開關游標 |
| 大量綁定 | FORALL i IN 1..v_cnt INSERT ... VALUES (v_arr(i)) 批次 DML |
| 自主交易 | PRAGMA AUTONOMOUS_TRANSACTION; 記錄日誌不受主交易回滾影響 |
| 編譯警告 | ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL'; 捕獲潛在問題 |
@deploy_procs.sql 含 CREATE OR REPLACE、GRANT EXECUTE、SYNONYM。DBA_OBJECTS.LAST_DDL_TIME、V$SQL 執行統計。掌握「編寫 → @建立 → EXECUTE → SET SERVEROUTPUT → SHOW ERRORS → DROP」標準循環,配合現代 IDE(SQL Developer、VS Code + Oracle Developer Tools)斷點除錯、單元測試框架,即能高效交付高品質 PL/SQL 程式單元。