我正在研究pl sql存储过程。 我需要做的是选择,使用游标,并为每个记录使用值构建一个字符串。 最后,我需要将其写入文件。 我尝试使用dbms_output.put_line(“toto”),但缓冲区大小很小,因为我有大约1400万行。 我从unix ksh调用我的程序。 我正在考虑使用“假脱机”(在ksh方面)转储我的程序结果,但我不知道该怎么做(如果可能的话)
任何人都有任何想法?
答案 0 :(得分:8)
除非确实有必要,否则我不会使用程序。
如果您使用SQL Plus调用脚本,只需将以下内容放入test.sql
(SET
来自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)