🧾Oracle SQL Developer 出現 SP2-0552 怎麼辦?新手也懂的「綁定變數未宣告」排查與解法(含常用去重查詢)
一、你遇到的問題其實很常見:SP2-0552 是什麼?
如果你在 Oracle SQL Developer 執行 SQL 時看到這個錯誤:
SP2-0552: 連結變數 "XXXX" 未宣告
這通常代表一件事:
你在 SQL 裡用了「綁定變數」(Bind Variable),但工具端沒有先宣告它。
這不是你的資料表壞了,也不是 SQL 寫錯了,而是「執行環境」在提醒你:
我不知道
:xxxx
是什麼,因為你沒有先定義它。
二、為什麼會這樣?關鍵差異:Run Statement vs Run Script
Oracle SQL Developer 有兩種常見執行方式:
1) Run Statement(通常是 Ctrl + Enter)
-
偏向「直接執行 SQL」
-
有時會用 SQL Developer 自己的方式處理參數
2) Run Script(通常是 F5)
-
會走 SQL*Plus 風格的腳本執行器
-
這種模式下,
:開頭的變數 一定要先宣告
很多人就是因為按了 F5,就突然遇到 SP2-0552。
三、什麼是 Bind Variable?新手版解釋
想像你寫一段 SQL:
-
你想查「某個版本」的資料
-
但版本字串每次都不同
-
你不想每次都改 SQL(也比較安全)
所以你會寫成「先留一個洞」:
-
這個洞叫做 參數 / 綁定變數
-
讓程式或工具在執行時再把值塞進去
四、SP2-0552 的三種實用解法
下面用一個「查訂單資料」的假想情境來示範
✅ 解法 A:用 Run Script(F5)時,先宣告變數(最正統)
如果你的 SQL 裡像這樣寫:
SELECT *
FROM SALES_ORDERS
WHERE ORDER_GROUP = :groupCode;
那你在 F5 執行前要先宣告:
VAR groupCode VARCHAR2(30);
EXEC :groupCode := 'G2026A';
SELECT *
FROM SALES_ORDERS
WHERE ORDER_GROUP = :groupCode;
這樣 SQL*Plus 腳本引擎才知道
:groupCode 是什麼。
✅ 解法 B:改成 & 變數(執行時跳出輸入框)
如果你不想寫宣告,可以改成 SQL Developer 常見的「替換變數」:
SELECT *
FROM SALES_ORDERS
WHERE ORDER_GROUP = '&groupCode';
你執行時會跳出輸入框,輸入一次就能跑。
這種方式適合「臨時測試」,但在程式端通常會用解法 A 的參數化方式。
✅ 解法 C:Debug 最快方式:先把值寫死
如果你只是想快速驗證資料,直接寫死最省時間:
SELECT *
FROM SALES_ORDERS
WHERE ORDER_GROUP = 'G2026A';
等確認 SQL 正確,再回頭改成參數化。
五、延伸:你還遇到另一個常見需求——列出某欄位所有不同值(去重)
在資料分析或做「下拉選單」時,很常需要查:
某個欄位有哪些不同的值?
例如:我要列出所有不同的客戶代碼。
✅ 最常見寫法:DISTINCT
SELECT DISTINCT CUSTOMER_CODE
FROM SALES_ORDERS
ORDER BY CUSTOMER_CODE;
✅ 排除 NULL(避免下拉選單出現空值)
SELECT DISTINCT CUSTOMER_CODE
FROM SALES_ORDERS
WHERE CUSTOMER_CODE IS NOT NULL
ORDER BY CUSTOMER_CODE;
六、工程師更常用:順便看每個值出現幾次(更實用)
只列出「有哪些值」有時不夠,工程師通常會想知道:
-
哪個值最多?
-
是否有異常暴增?
-
是否有一些值只有 1 筆(可能是錯資料)
SELECT
CUSTOMER_CODE,
COUNT(*) AS TOTAL_ROWS
FROM SALES_ORDERS
WHERE CUSTOMER_CODE IS NOT NULL
GROUP BY CUSTOMER_CODE
ORDER BY TOTAL_ROWS DESC;
這一招在排查資料品質、做報表選單、或找異常資料時非常有用。
七、為什麼程式(例如 EF Core / Java)不會遇到 SP2-0552?
你在程式碼中用參數化查詢時,框架通常會替你做兩件事:
-
自動建立 bind variable
-
把值安全地塞進去
所以程式執行不會報 SP2-0552。
但你在 SQL Developer 裡手動跑腳本時,就要自己宣告。
八、快速排查清單(你下次遇到就照這樣做)
遇到 SP2-0552 時,照順序檢查:
-
我是不是按了 F5(Run Script)?
-
SQL 裡是不是有
:something? -
有的話,前面有沒有
VAR ...+EXEC ... := ...? -
如果只是測試,能不能先改成
&something或寫死?
九、結語:新手最容易卡住的不是 SQL,而是「執行模式」
很多人以為自己 SQL 寫錯,花半天查語法,結果其實只是:
-
用了 bind variable
-
卻忘了先宣告
-
或按了 F5 走 SQL*Plus 模式
只要搞懂 Run Statement vs Run Script 的差異,SP2-0552 幾乎就不再是問題。
留言
張貼留言