Search code examples
oracle-databaseplsqlsql-scriptsspool

How to create a oracle sql script spool file


I have a question about spooling the the results of my program. My sample sql script looks like this.

  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;

The above script does not work, but I want to do something like this where in the begin end block we compute some values and i want to spool those results.

Thanks.


Solution

  • This will spool the output from the anonymous block into a file called output_<YYYYMMDD>.txt located in the root of the local PC C: drive where <YYYYMMDD> is the current date:

    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
    

    Hope it helps...

    EDIT:

    After your comment to output a value for every iteration of a cursor (I realise each value will be the same in this example but you should get the gist of what i'm doing):

    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;