我有一个用例,其中(使用调度程序)调用了一组存储过程,其中包括以下操作模式-
假定这些存储过程计划并每天运行以及时生成报告。 现在,我们无法执行如何导出临时表中存在的这些结果集的操作。
我尝试了SPOOL功能,但看起来它是基于SQLPLUS的,并且不确定是否可以在存储过程中使用它,是否仍然可以在存储过程的此流程中使用它。如果不是,在Oracle 19c中调用SPOOL有哪些可能的选择?如果是这样-临时表数据将可用,因为我们了解到它仅处于会话级别。如果您有任何解决方法,请告诉我们。
set term off
set feed off
set feedback off
set sqlformat csv
spool 'D:\test\outputExample.csv'
select Date_Time,a,b,c,Net_Amount from temp_tbl1 ;
spool off
由于每个csv报告的数据量较高,因此我避免使用 utl_file 功能。 Oracle 19c中是否有相同的功能?
谢谢
答案 0 :(得分:0)
SPOOL
是一种SQL Plus
功能,您不能在PL / SQL中使用它。许多工具(例如SQL Developer等)都支持sqlplus命令。话虽如此,您需要调用所有过程并以操作系统级别调用sqlplus。如果要将过程的输出写入OS文件,则可以使用UTL_FILE
。如果要避免这种情况,那么唯一的方法是在过程中使用DBMS_OUTPUT
,然后将输出假脱机到文件中。
从Oracle 12.2
起,您可以使用 SET MARKUP 命令:
SET MARKUP CSV ON
SET MARKUP
语法有两个选项:
CSV
选项具有以下语法:
CSV {ON|OFF} [DELIMI[TER] character] [QUOTE {ON|OFF}]
有关创建SQLPlus documentation的信息,请参见CSV reports。
UTL_FILE
的替代解决方案:
您可以使用DBMS_SCHEDULER
创建SQL脚本的作业。在最新版本中,数据库调度程序已得到增强,可以直接在数据库外运行SQL Plus样式脚本,而无需授予OS访问数据库服务器或SQL * Plus可执行文件的权限。
例如:
declare
sql_script VARCHAR2(32767) :=
'conn /@db
set markup csv on
set pages 0
set lines 200
set trimspool on
spool c:\your_directory\file.csv
select * from tab;
spool off';
begin
dbms_scheduler.create_job(
job_name => 'UNLOAD_DATA',
job_type => 'SQL_SCRIPT',
job_action => sql_script,
credential_name => 'username',
enabled => true
);
end;
/
您可以将上述示例扩展并实现为复杂的过程。 here有一个很好的解释。