2011-10-11 87 views
3

我試圖在我創建的「插件」中調用系統存儲過程。當我在測試應用程序中測試我的插件時,它工作正常。當我在針對性的應用程序中運行插件時,我從Oracle那裏得到了一個異常,這沒有任何意義。Oracle SQL查詢僅在一個進程中失敗:「ORA-01405:提取的列值爲NULL」

我使用Oracle服務器11.2.0.1.0和ODP.NET 2.112.2.0。

下面是從ODP.NET調試跟蹤從我的測試程序:

(ENTRY) OracleConnection::OracleConnection(1) 
(POOL) New connection pool created for: "Data Source=orcl;User ID=scott;" 
(ENTRY) OracleConnection::CreateCommand() 
OpsSqlPrepare2():SQL: begin DBMS_AQADM.START_QUEUE(queue_name => 'MyQueue'); end; 
(EXIT) OpsSqlExecuteNonQuery(): RetCode=0 Line=877 
(EXIT) OracleCommand::ExecuteNonQuery() 
(ENTRY) OracleConnection::Dispose() 
(ENTRY) OracleConnection::Close() 

在這裏,從有針對性的應用程序運行相同的代碼的調試跟蹤從ODP.NET:

(ENTRY) OracleConnection::OracleConnection(1) 
(POOL) New connection pool created for: "Data Source=orcl;User ID=scott;" 
(ENTRY) OracleConnection::CreateCommand() 
OpsSqlPrepare2():SQL: begin DBMS_AQADM.START_QUEUE(queue_name => 'MyQueue'); end; 
(EXIT) OpsSqlExecuteNonQuery(): RetCode=0 Line=877 
(EXIT) OracleCommand::ExecuteNonQuery() 
(ENTRY) OpsErrGetOpoCtx() 
(ERROR) Oracle error code=1405; ORA-01405: fetched column value is NULL 
(EXIT) OpsErrGetOpoCtx(): RetCode=0 Line=137 
(ENTRY) OracleConnection::Dispose() 
(ENTRY) OracleConnection::Close() 

我對於測試/目標應用程序之間可能會有什麼不同而感到迷茫。這兩個進程都作爲本地管理員組的成員運行。兩者都使用相同的連接字符串。兩者都運行相同的.NET代碼,但與數據庫服務器的結果不同。這裏會發生什麼?

+0

我們可以看到獲取多數民衆贊成失敗? – ninesided

+0

可惜@ninesided,我沒有進入反編譯DBMS_AQADM.START_QUEUE程序代碼,知道這是從哪裏來的。 –

回答

0

事實證明,我的目標應用程序是執行我的插件代碼,而在分佈式XA事務(MSDTC在我的情況)。撥打DBMS_AQADM.START_QUEUE有一個隱含的COMMIT;,我不知道。在這種情況下,錯誤消息顯然沒有幫助。

解決的辦法是換我呼籲在以下幾點:

using (var scope = new TransactionScope(TransactionScopeOption.Surpress)) 
{ 
    // execute DBMS_AQADM.START_QUEUE code here 
    scope.Complete(); 
} 

這將導致調用DBMS_AQADM.START_QUEUE到環境事務之外運行。

2

這個錯誤來自哪裏被要求的指標變量被設置爲指示現場返回null老OCI & PREC編譯的代碼。當沒有指示變量聲明時,如果遇到空值,則會觸發此錯誤。顯然,一些較舊的代碼在您所做的調用下仍然是分層的。

換句話說,這是一個數據問題。我不知道從哪裏開始看。

+0

是啊,我已經研究過深入的ORA-01405錯誤沒有多少運氣。這怎麼可能是一個過程中的數據問題,而不是另一個過程? –