La lecture clob ligne par ligne, avec les pl\sql
Dans mon projet j'utilise oracle comme base de données principale et j'ai été confronté à un problème avec l'analyse des clob. Supposons donc que nous avons un clob avec la valeur
aaaaaa
cccccc
bbbbbb
Et il est stocké dans le test de la table ...
J'ai besoin d'écrire plsql procédure pour obtenir ce clob et le couper de sorte que je vais avoir un tableau avec les trois éléments [aaaaaa,cccccccc,bbbbbbb].
Est-il possible de trouver des solutions?
- Qu'avez-vous essayé? Avez-vous regardé le DBMS_LOB le paquet? Si vous pouvez faire cela à un
VARCHAR2
chaîne, vous pouvez adapter cette approche avec le MÉTIER de l'exploitation (e..g INSTR, SUBSTR). - Jetez un oeil à la documentation d'Oracle pour le package DBMS_LOB. Aller à elle, et bonne chance.
- j'ai essayé ce code
FOR i IN (SELECT * from test ) LOOP LOOP EXIT WHEN nEndIndex<1; nEndIndex := INSTR(i.value, CHR(10),nStartIndex); vLine := SUBSTR(i.incass, nStartIndex, nEndIndex); DBMS_OUTPUT.put_line(vLine); nStartIndex := nEndIndex + 1; nLineIndex:=nLineIndex+1; END LOOP; END LOOP;
- Et... ce qui s'est passé? Ne vous obtenez une erreur? Les mauvais résultats? (Veuillez poster le code et les résultats que les modifications apportées à la question, non pas que les commentaires). Je vous suggère de travailler sur la logique avec un
VARCHAR2
colonne, puis regardez laDBMS_LOB
équivalents de traiter avec un CLOB à la place. Ce qui ressemble, il sera presque travailler pourVARCHAR2
, sinStartIndex
est initialisé à1
etnEndIndex
est0
ou plus, mais la dernière parm desubstr
est mal, et il n'affiche pas la dernière ligne, je pense.
Vous devez vous connecter pour publier un commentaire.
Voici un morceau de code qui fonctionne.
Je vous suggère d'utiliser explicite plutôt les curseurs implicites (POUR i IN (select...)), pour l'exécution but.
D'abord voici le script de création de cas de test.
Alors voici le script pour lire ligne par ligne Clob :
quantité variable est utilisé pour détecter la fin de la position de la ligne. Être carfull, dans certains cas, la fin de ligne est CHR(10)||CHR(13) (CR + LF), et dans certains cas, il est seulement CHR(10).
Tandis que le SQL regexp /se connecter par niveau d'approche est sans doute le plus élégant, il est assez mauvais performancewise (pour mon cas de test sur 11.2.0.3.0). Beaucoup plus rapide est simple à analyser comme cela.
Au cas où...
- vous avez installé APEX
- et le clob est inférieure à 32K
vous pouvez également regarder dans le code suivant:
C'est un suivi de la réponse repose sur @Pierre-Gilles Levallois sa réponse.
Car je pense qu'il contenait quelques bugs, j'ai essayé de les corriger.
J'ai mis en place ce qu'elle est plutôt rapide et sale de bugs. Je suis sûr qu'il doit être plus élégant des solutions... voilà. L'exemple de la table:
Et la modification du code:
Emmanuel Répondre
C'est une solution élégante qui fonctionne très bien avec des clobs dépassant 32767 caractères ou de lignes dépassant 4K caractères.
Norme ANSI Requête:
Oracle de Requête Spécifique (message d'origine):
J'ai créé une table appelée lixo_mq:
J'ai copié impression procédure et il a changé de travail différents:
Un pipeline de fonction avec quelques options supplémentaires pour conduire le comportement. Testé/fonctionne sur Windows, Oracle 11g (j'ai quelques soupçons, elle peut ne pas sous *nix environnements, à cause de la façon dont les lignes de résilier).