Oracle PL / SQL:将查询结果转储到文件中

时间:2010-03-31 07:42:17

标签: sql oracle unix plsql ksh

我正在研究pl sql存储过程。 我需要做的是选择,使用游标,并为每个记录使用值构建一个字符串。 最后,我需要将其写入文件。 我尝试使用dbms_output.put_line(“toto”),但缓冲区大小很小,因为我有大约1400万行。 我从unix ksh调用我的程序。 我正在考虑使用“假脱机”(在ksh方面)转储我的程序结果,但我不知道该怎么做(如果可能的话)

任何人都有任何想法?

4 个答案:

答案 0 :(得分:8)

除非确实有必要,否则我不会使用程序。

如果您使用SQL Plus调用脚本,只需将以下内容放入test.sqlSET来自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  

答案 1 :(得分:1)

如果输出的每一行都是表格中一行操作的结果,那么存储的函数与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);  

答案 2 :(得分:0)

utl_file是你的朋友 http://www.adp-gmbh.ch/ora/plsql/utl_file.html 但是将数据写入服务器上的文件系统,因此您可能需要DBA的帮助。

答案 3 :(得分:0)

Tom Kyte已经回答了这个问题,请参阅

Flat

来自this question on Ask Tom