2011-12-21 67 views
7

我有一個關於假脫機程序結果的問題。我的示例sql腳本看起來像這樣。如何創建一個oracle sql腳本假脫機文件

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; 

以上腳本不工作,但我想這樣做,其中的開始端塊,我們計算一些數值,我想閥芯這些結果。

謝謝。

回答

15

這將從匿名塊的輸出閥芯到一個名爲output_<YYYYMMDD>.txt位於本地PC C的根文件:驅動器安裝在<YYYYMMDD>是當前日期:

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 

希望它可以幫助...

編輯:

輸出您的評論對光標的每一次迭代值後(我認識的每個值將在這個例子中,相同的,但你應該得到的我在做什麼要點):

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

如果塊中存在遊標並且它在開始結尾循環,會發生什麼情況。像 '循環 c:= a + 10; 將c選擇爲:d from dual; end loop; 結束; SPOOL select:d from dual; SPOOL OFF EXIT;' 所以,現在它會給出所有的結果或最終輸出存儲在:d。 如何假脫機如果有循環。 – user987900 2011-12-21 15:39:49

+1

您可以在遊標循環中使用DBMS_OUTPUT來在遊標的每次迭代中輸出值。見編輯.. – Ollie 2011-12-21 15:45:56

+0

嗨Ollie,我還有一個問題。上面的代碼工作正常,當我從SQL *加運行。但是,我有一個shell腳本調用這個SQL腳本並將輸出後臺處理爲文本文件。我在Oracle應用程序中註冊了shell腳本,並且當我從應用程序提交請求運行時。它顯示正常和運行,但它永遠不會完成。做,我必須從shell腳本調用時對上述腳本進行任何更改。 – user987900 2012-01-10 14:04:42

2

帶閥芯:

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

如果塊中有一個遊標並且它在開始結尾循環,會發生什麼情況。像'循環c:= a + 10;選擇c爲:d來自雙重;末端迴路;結束; SPOOL選擇:雙從d; SPOOL OFF EXIT;'所以,現在它會給出所有的結果或最終的輸出存儲在:d。如果有循環,如何後臺處理。 – user987900 2011-12-21 15:39:01

+0

不會以這種方式工作。您可以假脫機SQL選擇,而不是PL/SQL。對於pl/sql代碼中的輸出,您可以使用dbms_output包,如Ollie所示。 – 2011-12-21 20:14:40

+0

感謝您的幫助弗洛林.. – user987900 2011-12-22 13:45:51

-3

爲了在PLSQL 執行後臺打印文件轉到文件 - >新建 - >命令窗口 - >粘貼代碼 - >執行。到達目錄,你會找到該文件。

0

要從BEGINEND後臺打印非常簡單。例如,如果您需要將兩個表的結果放入文件中,則只需使用for loop即可。示例代碼如下。

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