2009-01-09 15 views
0

有沒有人在嘗試從Oracle查詢中調用外部C函數時看到此錯誤?我使用Oracle 10g,每次嘗試調用庫中的兩個函數之一時都會出現此錯誤。對其他函數的調用每次都會返回正常,儘管可用的函數都是獨立的,不會調用任何OCI *函數。ORA-28579:從外部過程代理回調期間出現網絡錯誤

這裏的存儲過程,用來調用失敗的C代碼:

CREATE OR REPLACE PROCEDURE index_procedure(text in clob, tokens in out nocopy clob, location_needed in boolean) 
as language c 
name "c_index_proc" 
library lexer_lib 
with context 
parameters 
(
    context, 
    text, 
    tokens, 
    location_needed 
); 

任何幫助,將不勝感激。我在此錯誤消息中找到的所有信息都表明要採取的措施是:聯繫Oracle客戶支持。

編輯:我把它縮小到了我知道在我調用OCILobTrim(將它縮短爲0長度)之後在libclntsh中存在段錯誤的點。這是我一直用來調用這個過程的代碼。

declare text CLOB; tokens CLOB; 
begin 
dbms_lob.createtemporary(tokens, TRUE); 
dbms_lob.append(tokens, 'token'); 
dbms_lob.createtemporary(text, TRUE); 
dbms_lob.append(text, '<BODY>Test Document</BODY>'); 
index_procedure(text, tokens, FALSE); 
dbms_output.put_line(tokens); 
end; 
/

此設置是否有問題可能導致OCILobTrim問題?

回答

1

好了,升級到10.2.0.4(使用10.2.0.1)至少給了我一個可以理解的錯誤,而不是一個相當無用的核心文件和ORA-28579。

事實證明,我正在調試的代碼假設調用OCILobRead將一次返回所有數據。任何使用固定寬度字符集的客戶端都是如此。

對於使用可變寬度字符集的客戶端,這是不是這樣,OCILobRead實際上是讀取數據的一部分,並返回OCI_NEED_DATA和OCILobTrim和OCILobWrite是因爲仍在等待調用OCILobRead的失敗以後調用。解決方案是循環OCILobRead調用,直到OCI_NEED_DATA不再返回,並且我們的緩衝區中有所有需要的數據。

對OCIBreak的調用也會允許OCILobTrim和OCILobWrite函數繼續,儘管我們不會擁有所有需要的輸入數據。

1

它看起來像是這些錯誤之一,基本上意味着任何數量的東西都可能在外部程序中出錯。

沒有在10.2.0.3一個已知的錯誤,不知道是否是相關的:

ORA-28579嘗試選擇從「C」來實現流水線表函數 數據使用 發生時ODCITable/ANYDATASET接口。 ODCITableDescribe工作正常,但 ODCITableFetch生成一個ORA-28579 錯誤。

我建議:

  1. 查看數據庫服務器 跟蹤目錄,並在外部PROC所在的目錄 , 任何日誌或跟蹤文件時出現的錯誤產生 。
  2. 以某種方式在 中測量您的外部過程,以便您可以嘗試自行跟蹤其執行。
  3. 聯繫Oracle技術支持
+0

Dave,你有關於這個已知問題的鏈接嗎?我沒有對ODCITable接口做任何事情,但也許在那裏有相關的東西。 – 2009-01-12 13:52:18

+0

甲骨文不久前重新修改了他們的支持網站,我沒有看到一種方法來獲取單個文檔的鏈接。我通過搜索錯誤代碼在metalink.oracle.com上找到它。它是bug#5370332,並在文檔#5370332.8中進行了介紹。希望有所幫助。 – 2009-01-12 15:15:50