ORA-28579: errore di rete durante la richiamata dall'agente procedura esterno
-
07-07-2019 - |
Domanda
Qualcuno ha visto questo errore durante il tentativo di chiamare una funzione C esterna da una query Oracle? Sto usando Oracle 10g e ottengo questo errore ogni volta che provo a chiamare una delle due funzioni nella libreria. Una chiamata all'altra funzione ritorna bene ogni volta, sebbene la funzione che funziona sia tutta autonoma, nessuna chiamata a nessuna funzione OCI *.
Ecco la procedura memorizzata utilizzata per chiamare il codice C non riuscito:
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
);
Qualsiasi aiuto sarebbe apprezzato. Tutto ciò che ho trovato in questo messaggio di errore indica che l'azione da intraprendere è: contattare l'assistenza clienti Oracle.
Modifica: l'ho ristretto al punto che so che c'è un profondo segfault in libclntsh dopo che chiamo OCILobTrim (per troncarlo fino a 0) sulla clok token. Ecco il codice che ho usato per chiamare questa procedura.
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;
/
C'è qualcosa di sbagliato in questa configurazione che potrebbe causare problemi OCILobTrim?
Soluzione 2
Bene, un aggiornamento a 10.2.0.4 (stava usando 10.2.0.1) mi ha dato almeno un errore comprensibile invece di un file core abbastanza inutile e ORA-28579.
Si scopre che il codice che stavo eseguendo il debug presupponeva che la chiamata a OCILobRead avrebbe restituito tutti i dati in un unico passaggio. Questo è il caso di qualsiasi client che utilizza un set di caratteri a larghezza fissa.
Per i client che utilizzano un set di caratteri a larghezza variabile, questo non è il caso, OCILobRead stava effettivamente leggendo parte dei dati e restituendo OCI_NEED_DATA e le chiamate future a OCILobTrim e OCILobWrite non erano riuscite a causa della chiamata ancora in sospeso a OCILobRead. La soluzione era di eseguire il loop delle chiamate OCILobRead fino a quando OCI_NEED_DATA non veniva più restituito e avevamo tutti i dati necessari nel nostro buffer.
Una chiamata a OCIBreak avrebbe anche permesso alle funzioni OCILobTrim e OCILobWrite di continuare, sebbene non avremmo avuto tutti i dati di input necessari.
Altri suggerimenti
Sembra che questo sia uno di quegli errori che essenzialmente significa che qualsiasi numero di cose avrebbe potuto andare storto con la procedura esterna.
Esiste un bug noto in 10.2.0.3, non ho idea se sia pertinente:
ORA-28579 si verifica quando si tenta di selezionare dati da una funzione di tabella pipeline implementato in "C" usando il Interfaccia ODCITable / ANYDATASET. ODCITableDescribe funziona bene ma ODCITableFetch genera un ORA-28579 di errore.
Suggerirei:
- Cerca nel server database le directory di traccia e la directory dove si trova il proc esterno, per tutti i file di registro o di traccia generati quando si verifica l'errore.
- Strumenti il ??tuo proc esterno in qualche modo in modo da poter provare traccia tu stesso l'esecuzione.
- Contatta il supporto Oracle