2011-12-21 46 views
7

Ho una domanda sullo spooling dei risultati del mio programma. Il mio esempio di script sql ha questo aspetto.Come creare un file di spool sql per script oracle

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; 

Lo script di cui sopra non funziona, ma voglio fare qualcosa di simile in cui nel blocco di fine cominciare calcoliamo alcuni valori e voglio per avvolgere questi risultati.

Grazie.

risposta

15

Ciò spool l'uscita dal blocco anonimo in un file chiamato output_<YYYYMMDD>.txt trova nella radice del PC locale C: guidare dove <YYYYMMDD> è la data corrente:

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 

Speranza che aiuta ...

EDIT:

Dopo il tuo commento e uscita un valore per ogni iterazione di un cursore (mi rendo conto ogni valore sarà lo stesso in questo esempio, ma si dovrebbe ottenere il succo di quello che sto facendo):

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; 
+0

Cosa succede se c'è un cursore nel blocco e scorre all'interno del punto iniziale. Come 'loop c: = a + 10; selezionare c in: d da doppio; ciclo finale; fine; SPOOL selezionare: d da doppio; SPOOL OFF EXIT; ' Quindi, ora fornirà tutti i risultati oppure l'output finale memorizzato in: d. Come eseguire lo spool se c'è un loop. – user987900

+1

È possibile utilizzare DBMS_OUTPUT all'interno del ciclo del cursore per emettere il valore ad ogni iterazione del cursore. Vedi modifica .. – Ollie

+0

Ciao Ollie, ho ancora una domanda. Il codice sopra funziona bene quando corro da SQL * plus. Ma, ho uno script di shell che richiama questo script SQL e spool l'output in un file di testo. Ho registrato lo script della shell nelle app Oracle e quando invio una richiesta dalle app per l'esecuzione. Mostra normale e in esecuzione ma non viene mai completato. Do, devo apportare modifiche allo script sopra quando si richiama da uno script di shell. – user987900

2

Con spool:

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; 
+0

Cosa succede se c'è un cursore nel blocco e scorre all'interno del punto iniziale. Come 'loop c: = a + 10; selezionare c in: d da doppio; ciclo finale; fine; SPOOL seleziona: d da doppio; SPOOL OFF EXIT; ' Quindi, ora darà tutti i risultati oppure l'output finale memorizzato in: d. Come fare lo spool se c'è un loop. – user987900

+0

Non funzionerà in questo modo. È possibile eseguire lo spooling di selezioni SQL, non di PL/SQL. Per l'output in codice pl/sql, è possibile utilizzare il pacchetto dbms_output, come indicato da Ollie. –

+0

Grazie per il tuo aiuto Florin .. – user987900

-3

Al fine di eseguire un file di spool in plsql Vai a File-> finestra di comando Nuovo-> -> incollare il code-> execute. Arrivati ​​alla directory e troverai il file.

0

Il rocchetto da un blocco BEGINEND è piuttosto semplice. Ad esempio, se hai bisogno di spoolare i risultati di due tabelle in un file, usa semplicemente lo for loop. Il codice di esempio è riportato di seguito.

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; 
/