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

CC.*_*CC. 3 sql unix oracle ksh plsql

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

任何人有任何想法?

Pet*_*ang 8

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

如果您使用SQL Plustest.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
Run Code Online (Sandbox Code Playgroud)

并将输出重定向到文件(test.txt):

sqlplus user/passwd@instance @ test.sql > test.txt
Run Code Online (Sandbox Code Playgroud)

如果你真的需要在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;
Run Code Online (Sandbox Code Playgroud)

呼叫:

Select owner || ';' || calculate_my_row( object_name )
From all_objects;
Run Code Online (Sandbox Code Playgroud)

性能可能会受到影响,但应该会有效.但要确保,你尝试的东西不能以纯粹的方式完成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
Run Code Online (Sandbox Code Playgroud)

返回

        ID V C
---------- - -
         1 A *
         2 A  
         3 B *
         4 B  
Run Code Online (Sandbox Code Playgroud)