Oracle PL/SQL: Vidage du résultat de la requête dans le fichier
Je suis en train de travailler sur une pl de la procédure stockée sql.
Ce dont j'ai besoin est de faire une sélection, utiliser un curseur et pour chaque enregistrement de construire une chaîne à l'aide de valeurs.
À la fin, j'ai besoin d'écrire cela dans un fichier.
J'essaie d'utiliser dbms_output.put_line("toto"), mais la taille de la mémoire tampon est à petit parce que j'ai environ 14 millions de lignes.
J'appelle ma procédure à partir d'un unix ksh.
Je suis en train de penser à quelque chose comme l'utilisation de "bobine" (sur le ksh côté) pour vider le résultat de mon intervention, mais je ne sais pas comment le faire (si c'est possible)
Quelqu'un a une idée?
J'ai déjà répondu. Je ne peut pas se permettre de faire plus qu'une fois la requête. Votre solution (l'Analytique de la Fonction) besoin de la requête à exécuter plus d'un. L'autre solution ne fonctionne pas, ni parce que j'ai besoin d'avoir la valeur d'un champ à partir de l'itération précédente.
Pourquoi avez-vous besoin pour exécuter la requête plusieurs fois à l'aide de Fonctions Analytiques? Avez-vous lu mon dernier commentaire?
Peut-être que j'avais tort. Je vais essayer pour l'exécution de votre solution.
Je viens de tryied votre solution et c'est encore mieux que celui que j'ai choisi première fois. Au début, j'ai mal compris, mais maintenant je l'ai eu. Merci beaucoup.
OriginalL'auteur CC. | 2010-03-31
Vous devez vous connecter pour publier un commentaire.
Que si cela est vraiment nécessaire, je ne voudrais pas utiliser une procédure.
Si vous appelez le script à l'aide de SQLPlus, il suffit de mettre la ligne suivante dans votre
test.sql
(leSET
s sont de SQLEn Plus de la FAQ pour supprimer le bruit):et de rediriger la sortie vers un fichier (
test.txt
):Si vous avez vraiment besoin de faire des trucs en PL/SQL, envisager de le mettre en fonction et de l'appeler par enregistrement:
Appel:
Performance pourrait en souffrir, mais il devrait fonctionner. Assurez-vous que ce que vous essayez ne peut pas être fait dans le plus pur
SQL
.La lecture de votre commentaire je pense que l'Analytique de la Fonction
Gal
est ce que vous avez besoin.Cet exemple ajoute
*
dans le cas où la valeur deval
a changé:Retourne
Merci de voir mon jour de réponse. Qu'essayez-vous qui ne peut pas être fait dans le plus pur SQL?
Pas mal cette solution, mais...:) Le traitement que je fais sur chaque ligne est: Si l'avant de la valeur d'un champ est différent, la valeur actuelle, je concaténer quelque chose, sinon ne rien faire. Donc à l'aide d'un curseur, il fonctionne, mais je ne peux pas/ je ne sais pas comment vider le résultat.
Merci de voir ma prochaine mise à jour à l'aide Analytique de la Fonction
Lag
.Solution intéressante, mais j'ai 14 millions de lignes, et je suis en train de faire quelque chose dans un délai raisonnable. Je ne peut pas se permettre de faire 4 fois le sélectionner.
OriginalL'auteur Peter Lang
Si chaque ligne de votre sortie est le résultat d'une opération sur une seule ligne dans la table, puis une fonction stockée, combiné avec Peter Lang réponse, pouvez faire ce que vous avez besoin.
Si c'est plus compliqué que cela, peut-être vous pouvez utiliser un pipeline fonction de table
v_line est fait pour une seule ligne.
Grand. Elle fonctionne. Merci beaucoup.
OriginalL'auteur Erich Kitzmueller
utl_file est votre ami
http://www.adp-gmbh.ch/ora/plsql/utl_file.html
Mais il est écrit les données dans le système de fichiers sur le serveur donc, vous avez probablement besoin de votre DBA aider pour cela.
OriginalL'auteur Robert Merkwürdigeliebe
Tom Kyte a répondu, voir
Plat
de cette question à Demander à Tom
OriginalL'auteur Paul James