2013-04-25 85 views
2

我在.net中使用oracleclient in,net運行一些代碼。 SQL代碼可以使用DBMS_PUT_LINE函數輸出大量響應,然後通過調用DBMS_GET_LINE來檢索該函數。如果輸出只是特定的文本行,即'DBMS_OUTPUT.PUT_LINE('用戶不可用:請聯繫系統管理員');'然後,對get_line的調用工作正常,並且我得到了該文本。但是,如果調用要輸出SQL錯誤消息'DBMS_OUTPUT.PUT_LINE(SQLERRM);'那麼我得到以下錯誤返回,'ORA-06502:PL/SQL:數字或值錯誤:十六進制原始轉換錯誤'Oracle dotnet DBMS輸出查詢

真的很奇怪的事情,是如果我然後運行完全相同的代碼第二次包括關閉並重新連接到數據庫),那麼對get_line的調用返回正在輸出的實際錯誤消息。

我的代碼基本上是執行以下操作:

打開數據庫連接 運行具有的ExecuteNonQuery 的SQL查詢創建等的輸出參數:

Dim anonymous_block = "begin dbms_output.get_line(:1, :2); end;" 

aCmd.CommandText = anonymous_block 
aCmd.Parameters.Add("1", OracleType.VarChar, 32000) 
aCmd.Parameters("1").Direction = ParameterDirection.Output 
aCmd.Parameters.Add("2", OracleType.Int32) 
aCmd.Parameters("2").Direction = ParameterDirection.Output 

然後運行另一個的ExecuteNonQuery得到輸出。

然後關閉與.close分貝()

但在第二次運行,它得到正確的輸出。我有沒有第一次正確設置?

有什麼想法?我總是可以運行代碼兩次,但這似乎非常低效。

回答

1

首先,設計一個應用程序做客戶端,並使用dbms_output服務器之間有意義的交流是一種可怕的方式。如果您的存儲過程需要將信息發送給調用者,則應通過OUT參數或例外來完成。讓存儲過程捕獲異常,嘗試將其寫入dbms_output緩衝區,然後讓應用程序嘗試從dbms_output緩衝區中讀取以確定是否存在異常不是編寫應用程序的可伸縮方法。

這就是說,如果你要取從dbms_output緩衝區中的數據,你需要在一個循環中這樣做。在您的具體情況下,錯誤堆棧包含多行數據(可能只有一個調用dbms_output.put_line,但文本包含內部換行符。您需要循環,直到status(第二個參數)返回1.

+0

不幸的是,我不得不使用由ASG提供的sql,所以我沒有機會去找更好的方法。因此,如果我使用get_line進行檢索,並且它包含上面顯示的錯誤消息,那麼如果我再創建第二個來電get_line,它返回一個空字符串,並且狀態參數是1,但我仍然沒有得到實際的郵件被髮送,只有Oracle六角/ RAW轉換錯誤 – 2013-04-25 16:58:02

+0

@KevinAppleyard - 對不起,什麼是'ASG'站在這裏?哪個SQL語句不能改? – 2013-04-25 17:01:35

+0

對不起,ASG是應用程序支持組,提供給我的SQL函數來運行它們的數據庫。可擴展性在這裏並不是真正的問題,因爲每月只能運行幾百次。他們爲我提供了一大塊執行特定功能的SQL。出於多種原因(主要是政治因素),這正是我必須與之合作的原因。 – 2013-04-25 17:11:52