web-dev-qa-db-fra.com

Comment créer un fichier spoule de script Oracle SQL

J'ai une question à propos de la mise en file d'attente 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;

Le script ci-dessus ne fonctionne pas, mais je veux faire quelque chose comme ceci où, au début du bloc final, nous calculons certaines valeurs et je veux spouler ces résultats.

Merci.

8
user987900

Cela spoulera la sortie du bloc anonyme dans un fichier appelé output_<YYYYMMDD>.txt situé à la racine du lecteur C: du PC local: <YYYYMMDD> étant la date du jour:

SET SERVEROUTPUT ON FORMAT WRAPPED
SET VERIFY OFF

SET FEEDBACK OFF
SET TERMOUT OFF

column date_column new_value today_var
select to_char(sysdate, 'yyyymmdd') date_column
  from dual
/
DBMS_OUTPUT.ENABLE(1000000);

SPOOL C:\output_&today_var..txt

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;
   --
   DBMS_OUTPUT.put_line('cd: '||cd);
   DBMS_OUTPUT.put_line('d: '||d);
END; 

SPOOL OFF

SET TERMOUT ON
SET FEEDBACK ON
SET VERIFY ON

Prompt
PROMPT Done, please see file C:\output_&today_var..txt
Prompt

J'espère que ça aide...

MODIFIER:

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

BEGIN
   c := a+10;
   --
   FOR i IN 1 .. 10
   LOOP
      c := a+10;
      -- Output the value of C
      DBMS_OUTPUT.put_line('c: '||c);
   END LOOP;
   --
END; 
16
Ollie

Avec bobine:

  set heading off
  set arraysize 1
  set newpage 0
  set pages 0
  set feedback off
  set echo off
  set verify off

variable cd varchar2(10);
variable d number;

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

 SPOOL 
 select :cd,:d from dual;
 SPOOL OFF
 EXIT;
2
Florin Ghita

Mettre en file d'attente à partir d'un bloc BEGINEND est assez simple. Par exemple, si vous devez spouler le résultat de deux tables dans un fichier, utilisez simplement le for loop. Un exemple de code est donné 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
Sarath Avanavu