🧾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?

你在程式碼中用參數化查詢時,框架通常會替你做兩件事:

  1. 自動建立 bind variable

  2. 把值安全地塞進去

所以程式執行不會報 SP2-0552。

但你在 SQL Developer 裡手動跑腳本時,就要自己宣告。


八、快速排查清單(你下次遇到就照這樣做)

遇到 SP2-0552 時,照順序檢查:

  1. 我是不是按了 F5(Run Script)

  2. SQL 裡是不是有 :something

  3. 有的話,前面有沒有 VAR ... + EXEC ... := ...

  4. 如果只是測試,能不能先改成 &something 或寫死?


九、結語:新手最容易卡住的不是 SQL,而是「執行模式」

很多人以為自己 SQL 寫錯,花半天查語法,結果其實只是:

  • 用了 bind variable

  • 卻忘了先宣告

  • 或按了 F5 走 SQL*Plus 模式

只要搞懂 Run Statement vs Run Script 的差異,SP2-0552 幾乎就不再是問題。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)