簡體   English   中英

Oracle PL / SQL:將查詢結果轉儲到文件中

[英]Oracle PL/SQL: Dump query result into file

我正在研究一個pl sql存儲過程。 我需要做的是選擇,使用游標,並為每個記錄使用值構建一個字符串。 最后,我需要將其寫入文件。 我嘗試使用dbms_output.put_line(“toto”),但緩沖區大小很小,因為我有大約1400萬行。 我從unix ksh調用我的程序。 我正在考慮使用“假脫機”(在ksh方面)轉儲我的程序的結果,但我不知道該怎么做(如果這是可能的)

任何人有任何想法?

除非確實有必要,否則我不會使用程序。

如果使用SQL Plus調用腳本,只需將以下內容放入test.sqlSET s來自SQL Plus FAQ以消除噪音):

SET ECHO OFF
SET NEWPAGE 0
SET SPACE 0
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL ON
SET TAB OFF

Select owner || ';' || object_name
From all_objects;

QUIT

並將輸出重定向到文件( test.txt ):

sqlplus user/passwd@instance @ test.sql > test.txt

如果你真的需要在PL / SQL中做一些事情,可以考慮把它放到一個函數中並按照記錄調用它:

Create Or Replace Function calculate_my_row( in_some_data In Varchar2 )
  Return Varchar2
As
Begin
  Return in_some_data || 'something-complicated';
End calculate_my_row;

呼叫:

Select owner || ';' || calculate_my_row( object_name )
From all_objects;

性能可能會受到影響,但應該會有效。 但請確保您嘗試的內容無法在純SQL完成。


閱讀您的評論我認為分析功能Lag是您所需要的。

如果val的值已更改,則此示例附加*

With x As (
      Select 1 id, 'A' val FROM dual
Union Select 2 id, 'A' val FROM dual
Union Select 3 id, 'B' val FROM dual
Union Select 4 id, 'B' val FROM dual
)
--# End of test-data
Select
  id,
  val,
  Case When ( val <> prev_val Or prev_val Is Null ) Then '*' End As changed
From (
  Select id, val, Lag( val ) Over ( Order By id ) As prev_val
  From x
)
Order By id

返回

        ID V C
---------- - -
         1 A *
         2 A  
         3 B *
         4 B  

如果輸出的每一行都是表中一行操作的結果,那么存儲的函數與Peter Lang的答案相結合,可以滿足您的需要。

create function create_string(p_foobar foobar%rowtype) return varchar2 as
begin
  do_some_stuff(p_foobar);
  return p_foobar.foo || ';' ||p_foobar.bar;
end;
/

如果它比這更復雜,也許你可以使用流水線表函數

create type varchar_array
    as table of varchar2(2000)
/

create function output_pipelined return varchar_array PIPELINED as
  v_line varchar2(2000);
begin
  for r_foobar in (select * from foobar)
  loop
    v_line := create_string(r_foobar);
    pipe row(v_line);
  end loop;
  return;
end;
/ 

select * from TABLE(output_pipelined);  

utl_file是你的朋友http://www.adp-gmbh.ch/ora/plsql/utl_file.html但是將數據寫入服務器上的文件系統,所以你可能需要DBA的幫助。

Tom Kyte回答了這個問題,請看

平面

來自Ask Tom的這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM