ORA-28579: ошибка сети при обратном вызове от внешнего агента процедур - PullRequest
0 голосов
/ 10 января 2009

Кто-нибудь видел эту ошибку при попытке вызвать внешнюю функцию C из запроса Oracle? Я использую Oracle 10g и получаю эту ошибку каждый раз, когда пытаюсь вызвать одну из двух функций в библиотеке. Вызов другой функции возвращается нормально каждый раз, хотя работающая функция полностью автономна, никаких вызовов для каких-либо функций OCI *.

Вот хранимая процедура, которая используется для вызова ошибочного кода 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.

Edit: я сузил его до такой степени, что я знаю, что глубоко в 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?

Ответы [ 2 ]

1 голос
/ 15 января 2009

Что ж, обновление до 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 января 2009

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

В 10.2.0.3 есть известная ошибка, не знаю, имеет ли она отношение:

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

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

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