在 Oracle 中建立預存程序看似簡單,實則暗藏多個易踩地雷:SELECT 必須搭配 INTO 子句、輸出套件拼寫錯誤、伺服器輸出未開啟。本文以實際操作畫面為藍本,記錄從連續報錯到成功建立並執行 GET_NEWS 程序的完整修正路徑,作為新手避坑參考。
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
CREATE OR REPLACE PROCEDURE get_news (
aid IN VARCHAR2, atitle IN VARCHAR2
) AS
BEGIN
SELECT * FROM cf_news;
END;
錯誤:PLS-00428: 在此 SELECT 語句中缺少 INTO 子句
原因:PL/SQL 中 SELECT 必須將結果存入變數,不能直接輸出。
BEGIN → BEGING錯誤:編譯錯誤(語法錯誤)
錯誤:同樣缺少 INTO
錯誤:同樣缺少 INTO
CREATE OR REPLACE PROCEDURE get_news AS
aa NUMBER;
BEGIN
SELECT COUNT(*) INTO aa FROM cf_news;
END;
結果:程序已建立 ✓
DBMS_OUTPUBDBMS_OUTPUB.PUT_LINE('aa=' || aa);
錯誤:PLS-00201: 必須說明標識符 'DBMS_OUTPUB.PUT_LINE'
原因:正確套件名為 DBMS_OUTPUT。
CREATE OR REPLACE PROCEDURE get_news AS
aa NUMBER;
BEGIN
SELECT COUNT(*) INTO aa FROM cf_news;
DBMS_OUTPUT.PUT_LINE('aa=' || aa);
END;
結果:程序已建立 ✓
SQL> SET SERVEROUTPUT ON;
SQL> EXECUTE get_news;
aa=3
| 地雷 | 正確做法 | 錯誤代碼 |
|---|---|---|
| PL/SQL SELECT 無 INTO | SELECT ... INTO 變數 FROM ... | PLS-00428 |
| DBMS_OUTPUT 拼寫錯誤 | DBMS_OUTPUT.PUT_LINE | PLS-00201 |
| 未開啟伺服器輸出 | SET SERVEROUTPUT ON | 無輸出顯示 |
| BEGIN/END 拼寫 | 嚴格大小寫對應 | PLS-00103 |
SHOW ERRORS; 定位行號與錯誤代碼AS/IS 後)預先定義所有接收變數SET SERVEROUTPUT ONDBMS_OUTPUT.PUT_LINE 追蹤變數值與流程預存程序編譯錯誤 90% 集中在 SELECT INTO、套件拼寫、SERVEROUTPUT 三大項。建立「先除錯、再執行」肌肉記憶,將大幅縮短開發週期。