Eu tenho uma biblioteca C que deve ser chamada de uma função pl/sql, então eu faço uma biblioteca .so e depois crio uma função pl/sql para chamá-la.
a fonte C (libcprog.c) é assim:
int exec_hmmftg ( char *p1 , char *p2, char *p3 ){}
a biblioteca no banco de dados oracle é:
CREATE LIBRARY CPROGLIB UNTRUSTED AS '/libcprog.so';
a função pl/sql criada é:
CREATE OR REPLACE FUNCTION CALL_C_PROGRAM(P1 IN VARCHAR2,
P2 IN VARCHAR2,
P3 IN OUT VARCHAR2)
RETURN BINARY_INTEGER
IS EXTERNAL NAME "exec_hmmftg"
LIBRARY CPROGLIB
LANGUAGE C
PARAMETERS(P1 STRING, P2, P3 BY REFERENCE STRING, RETURN INT);
Quando tentei ligar para CALL_C_PROGRAM , peguei:
ORA-01405: fetched column value is NULL
Como posso saber onde está o problema?
Novo
Eu mudei a definição da biblioteca para endereçar em algum lugar errado e ainda pego a mesma exceção!
Existe um parâmetro ou algo que devo definir antes de chamar a função?
A seguinte configuração funciona para mim no Oracle 11.2.0.2:
programa C:
Compile-o e verifique se ele está colocado em
$ORACLE_HOME/bin
ou$ORACLE_HOME/lib
(a configuração pode ser alterada para permitir outros diretórios) - os sinalizadores do compilador também serão diferentes para o AIX.Configure
EXTPROC
nolistener.ora
arquivo:Reinicie o ouvinte com
lsnrctl stop
seguido porlsnrctl start
.Crie a referência para a biblioteca externa e crie a função para fazer a interface entre PL/SQL e o programa C:
Teste a função:
Não tenho certeza do que você está fazendo de errado sem ver o C completo que você escreveu. Experimente e configure este caso simples que fiz para você e adicione funcionalidade pouco a pouco a partir daÃ.
Este erro é causado por variáveis ​​não inicializadas.
Por exemplo, se você chamar um procedimento externo assim:
, você obterá o erro.
E neste caso você não vai:
Sugiro que você implemente um wrapper para call_c_program que inicializará todas as variáveis ​​que são passadas para a biblioteca C como parâmetros.