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?

Foi útil?

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:

  1. 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.
  2. Instrumento sua proc externo alguma forma para que você pode tentar traçar sua execução si mesmo.
  3. Contato com o suporte do Oracle
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top