Comment retourner temporaire CLOB exemple de fonction stockées en Pl/SQL?
Ma fonction stockée crée temporaire LOB instance à l'aide de: Dbms_Lob.CreateTemporary(BUFFER, TRUE, Dbms_Lob.SESSION);
où BUFFER
est un local CLOB
variable. Après que la fonction remplit BUFFER
avec certains de données et le renvoie.
Paramètre de durée de Dbms_Lob.CreateTemporary
dans mon cas, c'est Dbms_Lob.SESSION
, mais selon documentation oracle:
Le paramètre de durée passé à dbms_lob.createtemporary() est un indice.
La durée de la nouvelle temp LOB est la même que la durée de la
localisateur de variable en PL/SQL. Par exemple, dans le programme précédent
bloc, le programme de la variable a, la durée de la résidence image.
Donc à la fin du bloc, de la mémoire sera libérée à la
fin de la fonction.
Donc BUFFER CLOB
peut être détruite par Oracle après avoir quitté le bloc de fonction. Je peux voir que, dans certains cas, lorsque la mémoire TAMPON est de plus de 32 KO, je ne peux pas le lire c'est la valeur de retour de cette façon, à partir de Java (JDBC).
Est-il un autre chemin pour le retour temporaire CLOB instance à partir d'une fonction?
Oblak, en fait non, parce que je dois utiliser cette fonction dans l'instruction SELECT.
Alors peut-être vous pouvez déclarer une variable de niveau package et de retour de la fonction.
pourquoi ne pouvez-vous pas juste de retour d'un clob?
Avez-vous seulement, et de manière cohérente, un problème lorsque le CLOB est plus de 32K? Si cela sonne comme une JDBC problème, ou un problème avec la façon dont vous êtes à la récupération de la valeur sur le Java fin. Peut-être l'ajout de votre code Java peut révéler quelque chose?
OriginalL'auteur Volodymyr Frolov | 2013-01-29
Vous devez vous connecter pour publier un commentaire.
Dans un commentaire que vous avez dit:
La documentation de
getSubString
stipule que:Avec une fonction simple de générer et de retour d'un CLOB, je peux le récupérer plus de JDBC (
ojdbc5
ouojdbc6
) avec pas de problèmes, que ce soit avecgetCLOB()
ougetString()
. Mais si j'essaie d'attribuer leOracle.sql.CLOB
récupéré avecgetCLOB
à unString
à l'aide depuis-je obtenir les
Invalid argument(s) in call
erreur. Juste changer:œuvres. Il semble donc n'avoir rien à voir avec l'allocation temporaire dans la fonction ou le CLOB taille. Je ne comprends pas pourquoi vous n'avez pas un problème avec les petites CLOBs - peut-être que votre logique n'a tout simplement pas touché à cette si ils étaient petits?
En attendant, vous avez travaillé autour de ce avec
clob.getCharacterStream().read()
, et c'est peut-être un peu hors de propos maintenant.OriginalL'auteur Alex Poole
J'ai créé la fonction de retour d'un clob, aléatoire généré des données, la longueur est de 200 caractères.
Puis-je appeler la fonction:
Et je reçois toujours des données à la suite. Je me demande pourquoi votre fonction n'est pas les données de retour.
Après enquête, il semble que le problème est lié à la mise en œuvre d'oracle.sql.CLOB.getSubString, dans le cas où la longueur de la clob est plus que ~32K. clob.getCharacterStream().read() fonctionne comme prévu.
OriginalL'auteur Alen Oblak