軟體工程師的小事:到底要不要 Close

ORA-01006:連結變數不存在,設定 BindByName 屬性

此例外狀況大部分是有資料庫變數尚未設定,PL/SQL 忽略或 OracleParameter 沒有新增。

但在此案例中,大部分是可以執行,但在某些條件下會出現 ORA-01006 例外狀況。

文章環境
Orcale Data Provider for .NET
此文章使用部分程式碼片段描述案例。
問題

PL/SQL 片段

/* 以上忽略 */
WHERE A.DATE = :DATE
 AND A.CODE = :CODE
 AND B.CODE <> SUBSTR(:CODE,-4)

CSharp 程式碼片段

this.cmd.Parameters.Add(":DATE",OracleDbType.Date);
this.cmd.Parameters.Add(":CODE",OracleDbType.Varchar2, 8);

OracleParameter 加入了兩個查詢變數「:DATE」「:CODE」 原本執行都沒有甚麼問題,但是在某些特定案例卻會出現「ORA-01006: 連結變數不存在」。

解決方式

OracleCommand 有一個屬性是 BindByName,將屬性的數值設定為 True 即可

this.cmd.Parameters.BindByName = true;
可能是原本的 CASE 並不會執行到 SUBSTR(:CODE,-4) 所以並沒有問題,但在特定案例下會需要使用到 SUBSTR(:CODE,-4) 所以才會出現變數不存在的例外情況(沒有設定第三個 OracleParameter 變數 :CODE)
參考資料

留言