2011-12-21 23 views
7

Mam pytanie dotyczące buforowania wyników mojego programu. Mój przykładowy skrypt sql wygląda następująco.Jak utworzyć plik bufora skryptu sql 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; 

Powyższy skrypt nie działa, ale chcę zrobić coś takiego, gdzie na rozpoczęcie bloku końcowego obliczyć pewne wartości i chcę, aby szpula te wyniki.

Dzięki.

Odpowiedz

15

To szpula wyjście z anonimowego bloku w pliku o nazwie output_<YYYYMMDD>.txt znajdujący się w katalogu głównym komputerze lokalnym dysku C: gdzie <YYYYMMDD> jest aktualna data:

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 

Nadzieja to pomaga ...

EDIT:

Po komentarzu do wyprowadzania wartości dla każdej iteracji kursora (zdaję sobie sprawę, każda wartość będzie taka sama w tym przykładzie, ale powinieneś dostać sens tego, co robię):

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

Co się stanie, jeśli w bloku znajduje się kursor i będzie on pasował wewnątrz początku. Podobnie jak 'pętla c: = a + 10; wybierz c do: d z podwójnego; koniec pętli; koniec; SPOOL wybierz: d od dual; SPOOL OFF EXIT; ' Tak, teraz da wszystkie wyniki lub ostateczne wyjście zapisane w: d. Sposób buforowania, jeśli występuje pętla. – user987900

+1

Możesz użyć DBMS_OUTPUT w pętli kursora, aby wyprowadzić wartość przy każdej iteracji kursora. Zobacz edytuj .. – Ollie

+0

Witam Ollie, mam jeszcze jedno pytanie. Powyższy kod działa poprawnie, gdy uruchamiam z SQL * plus. Ale mam skrypt powłoki, który wywołuje ten skrypt SQL i buforuje dane wyjściowe do pliku tekstowego. Zarejestrowałem skrypt powłoki w aplikacjach Oracle i po przesłaniu żądania z aplikacji do uruchomienia. Pokazuje normalne i działa, ale nigdy się nie kończy. Czy, muszę dokonać jakichkolwiek zmian w powyższym skrypcie podczas wywoływania ze skryptu powłoki. – user987900

2

Z szpuli:

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

Co się stanie, jeśli w bloku znajduje się kursor i będzie on pętlował wewnątrz początku. Podobnie jak "pętla c: = a + 10; wybierz c do: d z dual; pętla końcowa; koniec; Wybór SPO: d z dual; SPOOL OFF EXIT; " Tak więc teraz da wszystkie wyniki lub końcowe wyniki zapisane w: d. Jak spoolować, jeśli istnieje pętla. – user987900

+0

Nie działa w ten sposób. Możesz przechwytywać selekcje SQL, a nie PL/SQL. Dla wyniku w kodzie pl/sql, możesz użyć pakietu dbms_output, jak wskazał Ollie. –

+0

Dzięki za pomoc Florin .. – user987900

-3

W celu realizacji plik szpulki w plsql Przejdź do File-> New-> okno poleceń -> wklej Code> execute. Dostałem się do katalogu i znajdziesz plik.

0

Do buforowania z bloku BEGINEND jest bardzo prosty. Na przykład, jeśli chcesz buforować wynik z dwóch tabel do pliku, po prostu użyj for loop. Przykładowy kod podano poniżej.

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