从Oracle中的表集中导出数据

时间:2020-04-18 16:44:09

标签: oracle stored-procedures plsql spool oracle19c

我有一个用例,其中(使用调度程序)调用了一组存储过程,其中包括以下操作模式-

  1. 设置一些变量,例如当前的申请日期等。[完成]
  2. 对数据库表执行查询以根据用户情况填充Global Temporary表[完成]
  3. 根据报告案例(使用临时表上的where子句)以CSV文件格式导出这些结果 [需要帮助]
  4. CSV文件目录基于报告类型,而csv文件名称根据日期/时间是动态的。 [需要帮助]

假定这些存储过程计划并每天运行以及时生成报告。 现在,我们无法执行如何导出临时表中存在的这些结果集的操作。

我尝试了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中是否有相同的功能?

谢谢

1 个答案:

答案 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
  • HTML

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有一个很好的解释。

相关问题