ORA-28579: Erro de rede durante a chamada de resposta de agente procedimento externo
-
07-07-2019 - |
Pergunta
Alguém viu esse erro ao tentar chamar uma função externa C a partir de uma consulta do Oracle? Estou usando o Oracle 10g e obter este erro cada vez que eu tentar chamar uma das duas funções na biblioteca. Uma chamada para os outros retornos de função multar cada vez, embora a função que as obras são todas auto-suficientes, há chamadas para qualquer OCI * funções.
Aqui está o procedimento armazenado que é usado para chamar o código C não:
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
);
Qualquer ajuda seria apreciada. Tudo que eu encontrei sobre esta mensagem de erro diz que a ação a ser tomada é:. Apoio ao Cliente Contacte a Oracle
Editar: Eu reduzi-lo ao ponto que eu sei que há um segfault no fundo libclntsh depois eu chamo OCILobTrim (truncar-lo para baixo a 0 comprimento) na clob tokens. Aqui está o código que eu tenho usado para chamar este procedimento.
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;
/
Existe errado alguma coisa com esta configuração que pode estar causando problemas OCILobTrim?
Solução 2
Bem, um upgrade para 10.2.0.4 (estava usando 10.2.0.1) pelo menos me deu um erro compreensível, em vez de um arquivo core bastante inútil eo ORA-28579.
Acontece que o código que eu estava depurando estava assumindo que chamar OCILobRead retornaria todos os dados em uma passagem. Este é o caso de qualquer cliente usando um conjunto de caracteres de largura fixa.
Para clientes que utilizam um conjunto de caracteres de largura variável, este não é o caso, OCILobRead foi realmente ler parte dos dados e retornando OCI_NEED_DATA e futuras chamadas para OCILobTrim e OCILobWrite estavam falhando por causa da chamada ainda pendente para OCILobRead. A solução foi fazer um loop OCILobRead chamadas até OCI_NEED_DATA não foi devolvido e tivemos todos os dados necessários em nossa buffer.
Uma chamada para OCIBreak também teria permitido as funções OCILobTrim e OCILobWrite para continuar, embora não teria tido todos os dados de entrada necessários.
Outras dicas
Parece que este é um daqueles erros que significa, essencialmente, uma série de coisas poderia ter errado ido com o procedimento externo.
Há um erro conhecido no 10.2.0.3, nenhuma idéia se é relevante:
ORA-28579 ocorre ao tentar selecionar Dados a partir de uma função de tabela em pipeline implementado em "C" usando o ODCITable / Interface AnyDataSet. ODCITableDescribe fina funciona, mas ODCITableFetch gera um ORA-28579 erro.
Gostaria de sugerir:
- Examinar o servidor de banco de dados diretórios traço, eo diretório onde o proc externo situa-se, por quaisquer arquivos de log ou de rastreamento gerados quando ocorre o erro.
- Instrumento sua proc externo alguma forma para que você pode tentar traçar sua execução si mesmo.
- Contato com o suporte do Oracle