Question

Quelqu'un at-il vu cette erreur en essayant d'appeler une fonction C externe à partir d'une requête Oracle? J'utilise Oracle 10g et j'obtiens cette erreur chaque fois que j'essaie d'appeler l'une des deux fonctions de la bibliothèque. Un appel à l'autre fonction revient correctement à chaque fois, bien que la fonction qui fonctionne soit entièrement autonome, aucun appel à aucune fonction OCI *.

Voici la procédure stockée utilisée pour appeler le code C défaillant:

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
);

Toute aide serait appréciée. Tout ce que j'ai trouvé dans ce message d'erreur indique que l'action à entreprendre est la suivante: Contactez le support client d'Oracle.

Éditer: je l'ai réduit au point que je sais qu'il existe un défaut de segmentation profond dans libclntsh après que j'appelle OCILobTrim (pour le tronquer à une longueur égale à 0) sur le jeton des jetons. Voici le code que j'ai utilisé pour appeler cette procédure.

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;
/

Quelque chose ne va pas dans cette configuration qui pourrait causer des problèmes avec OCILobTrim?

Était-ce utile?

La solution 2

Eh bien, une mise à niveau vers la version 10.2.0.4 (utilisait la version 10.2.0.1) au moins, m'a donné une erreur compréhensible au lieu d'un fichier de base assez inutile et du fichier ORA-28579.

Il s'avère que le code que je déboguais supposait qu'appeler OCILobRead renverrait toutes les données en un seul passage. C'est le cas pour tout client utilisant un jeu de caractères de largeur fixe.

Pour les clients utilisant un jeu de caractères de largeur variable, ce n'était pas le cas, OCILobRead lisait en fait une partie des données et renvoyait OCI_NEED_DATA. Les futurs appels à OCILobTrim et OCILobWrite échouaient à cause de l'appel toujours en attente à OCILobRead. La solution consistait à mettre en boucle les appels OCILobRead jusqu'à ce que OCI_NEED_DATA ne soit plus renvoyé et que toutes les données nécessaires soient stockées dans notre mémoire tampon.

Un appel à OCIBreak aurait également permis aux fonctions OCILobTrim et OCILobWrite de continuer, même si nous n'avions pas toutes les données d'entrée nécessaires.

Autres conseils

Il semble que ce soit l'une de ces erreurs qui signifie essentiellement qu'un certain nombre de problèmes ont pu se produire avec la procédure externe.

Il y a un bogue connu dans 10.2.0.3, aucune idée de sa pertinence:

  

ORA-28579 survient lorsqu’on essaie de sélectionner   données d'une fonction de table en pipeline   mis en œuvre dans " C " en utilisant le   ODCITable / ANYDATASET interface.   ODCITableDescribe fonctionne bien mais   ODCITableFetch génère un ORA-28579   erreur.

Je suggérerais:

  1. Regardez dans le serveur de base de données les répertoires de trace et le répertoire où se trouve le proc externe, pour tout fichier journal ou trace généré lorsque l'erreur se produit.
  2. Instrumentez votre processus externe dans     afin que vous puissiez essayer de     retracez lui-même son exécution.
  3. Contacter le support Oracle
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top