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?

È stato utile?

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:

  1. 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.
  2. Strumenti il ??tuo proc esterno     in qualche modo in modo da poter provare     traccia tu stesso l'esecuzione.
  3. Contatta il supporto Oracle
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top