7
votes

Comment créer un fichier de bobine de script Oracle SQL

J'ai une question à propos de la bobine des résultats de mon programme. Mon exemple de script SQL ressemble à ceci.

  whenever sqlerror exit failure rollback
  set heading off
  set arraysize 1
  set newpage 0
  set pages 0
  set feedback off
  set echo off
  set verify off

 declare
 ab varchar2(10) := 'Raj';
 cd varchar2(10);
 a number := 10;
 c number;
 d number;
 begin
 c := a+10;
 select ab,c into cd,d from dual;
 end;

 SPOOL 
 select cd,d from dual;
 SPOOL OFF
 EXIT;


0 commentaires

4 Réponses :


16
votes

Ceci aboutira à la sortie du bloc anonyme dans un fichier appelé Sortie_ .txt situé à la racine du PC local C: lecteur où est la date actuelle: xxx

espère qu'il aide ...

EDIT:

Après votre commentaire pour produire une valeur pour chaque itération de Un curseur (je réalise que chaque valeur sera la même dans cet exemple, mais vous devriez obtenir le gist de ce que je fais): xxx


6 commentaires

Que se passe-t-il s'il y a un curseur dans le bloc et il boucle à l'intérieur du début. Comme 'boucle c: = a + 10; Sélectionnez C dans: D de Dual; boucle de fin; finir; Sélection de la bobine: D de Dual; Spool off; ' Ainsi, maintenant, cela donnera-t-il tous les résultats ou la sortie finale stockée dans: D. Comment aboutir s'il y a une boucle.


Vous pouvez utiliser dbms_output dans la boucle du curseur pour émettre la valeur à chaque itération du curseur. Voir Modifier ..


Salut Ollie, j'ai une autre question. Le code ci-dessus fonctionne bien lorsque je cours à partir de SQL * Plus. Mais j'ai un script shell qui invoque ce script SQL et aboutit la sortie au fichier texte. J'ai enregistré le script Shell dans Oracle Apps, et lorsque je soumettez une demande d'applications à exécuter. Il montre normalement et courir mais il n'est jamais terminé. Do, je dois apporter des modifications au script ci-dessus lorsque vous invoquez à partir d'un script shell.


Si vous l'exécutez à l'arrière-plan, je m'inquiéterais de l'endroit où vous vous attendez à ce que la sortie aille. Dans ces circonstances, vous serez peut-être mieux à utiliser le package UTL_FILE pour écrire la sortie dans un fichier directement à partir du bloc PL / SQL, vous pouvez ensuite lire ce fichier à l'aide de tout outil souhaité (PL / SQL, Java, UNIX, etc. ). C'est assez simple à faire et vous auriez moins de complexité que de la sortie de spooling via SQLPlus puis dans un script shell, etc. docs.oracle.com/cd/b19306_01/appdev.102/b14258/u_file.htm


Pour exécuter cela à partir d'un script dans SQL Plus (comme @ myscript.sql), j'ai dû ajouter "/" après la "fin"; du bloc anonyme.


Est-ce que quelqu'un a un exemple de spool super simple? Je veux juste exporter une seule table de ligne, mais je vais devoir faire cette même exportation plusieurs fois, alors j'aimerais ne pas utiliser (clic droit -> exporter ...) à chaque fois. Je ne trouve pas d'exemple qui n'implique pas plus de 30 lignes de code.



2
votes

avec bobine: xxx


2 commentaires

Que se passe-t-il s'il y a un curseur dans le bloc et il boucle à l'intérieur du début. Comme 'boucle c: = a + 10; Sélectionnez C dans: D de Dual; boucle de fin; finir; Sélection de la bobine: D de Dual; Spool off; ' Ainsi, maintenant, cela donnera-t-il tous les résultats ou la sortie finale stockée dans: D. Comment aboutir s'il y a une boucle.


Ne fonctionnera pas de cette façon. Vous pouvez SPOOL SQL SELECTS, pas PL / SQL. Pour la sortie du code PL / SQL, vous pouvez utiliser DBMS_Output Package, car Ollie a indiqué.



-3
votes

Pour exécuter un fichier spool dans plsql Aller à File-> Nouvelle fenêtre de commande -> Collez votre code-> Exécuter. Je suis arrivé au répertoire et vous trouverez le fichier.


0 commentaires

0
votes

to spool à partir d'un commencer code> fin code> bloc est assez simple. Par exemple, si vous devez résulter de la bobine de deux tables dans un fichier, utilisez simplement le pour la boucle code>. Un exemple de code est indiqué ci-dessous.

BEGIN

FOR x IN 
(
    SELECT COLUMN1,COLUMN2 FROM TABLE1
    UNION ALL
    SELECT COLUMN1,COLUMN2 FROM TABLEB
)    
LOOP
    dbms_output.put_line(x.COLUMN1 || '|' || x.COLUMN2);
END LOOP;

END;
/


0 commentaires