2009-01-09 3 views
0

Произошла ли какая-либо ошибка при попытке вызова внешней функции C из запроса Oracle? Я использую 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.

Редактирование: Я сузил его до такой степени, что я знаю, что в libclntsh есть segfault, после того как я вызываю OCILobTrim (чтобы усечь его до 0 длины) на клонах токенов. Вот код, который я использовал для вызова этой процедуры.

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 продолжить, хотя у нас не было бы всех необходимых входных данных.

+0

Можете ли вы показать образец? даже я столкнулся с проблемой и ошибкой ORA-28579: ошибка сети во время обратного вызова от внешнего агента процедуры. –

1

Похоже, что это одна из тех ошибок, которая по существу означает, что любое количество вещей могло нарушить внешнюю процедуру.

Существует известная ошибка в 10.2.0.3, не знает, если это не относится к делу:

ORA-28579 возникает при попытке выбрать данных из конвейерной функции таблицы, реализованной в «C» с помощью Интерфейс ODCITable/ANYDATASET. ODCITableDescribe работает нормально, но ODCITableFetch генерирует ошибку ORA-28579 .

Я хотел бы предложить:

  1. Посмотрите в следовых каталогов сервера баз данных и каталог , где находится внешний прок, для любого журнала или файлов трассировки генерируется при возникновении ошибки.
  2. Инструмент ваш внешний proc в каким-то образом, чтобы вы могли попробовать отслеживать его выполнение самостоятельно.
  3. Обратитесь в службу поддержки Oracle
+0

Дэйв, есть ли у вас ссылка на эту известную проблему? Я ничего не делаю с интерфейсом ODCITable, но, возможно, там есть что-то связанное. –

+0

Недавно Oracle переработал свой сайт поддержки, и я не вижу способа получить ссылку на один документ. Я нашел его на metalink.oracle.com, выполнив поиск кода ошибки. Это ошибка # 5370332 и описана в документе # 5370332.8. Надеюсь, это поможет. –