0

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

  1. 设置一些变量,如当前申请日期等。 [完成]
  2. 根据用户案例对数据库表执行查询以填充全局临时表 [完成]
  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 中是否有任何可用的功能?

谢谢

4

1 回答 1

0

SPOOL是一个SQL Plus特性,你不能在 PL/SQL 中使用它。SQL Developer 等许多工具都支持 sqlplus 命令。话虽如此,您需要调用所有过程并调用 sqlplus 作为操作系统级别。如果要将过程的输出写入 OS 文件,则可以使用UTL_FILE. 如果你想避免这种情况,那么唯一的方法是DBMS_OUTPUT在你的程序内部使用,然后将输出假脱机到一个文件中。

从 Oracle12.2开始,您可以使用SET MARKUP命令:

SET MARKUP CSV ON

SET MARKUP语法有两个选项:

  • CSV
  • HTML

CSV选项具有以下语法:

CSV {ON|OFF} [DELIMI[TER] character] [QUOTE {ON|OFF}]

有关创建CSV 报告的信息,请参阅SQLPlus 文档

替代解决方案UTL_FILE

您可以使用DBMS_SCHEDULERSQL 脚本创建作业。在最近的版本中,数据库调度程序得到了增强,能够直接在数据库之外运行 SQL Plus 风格的脚本,而无需让操作系统访问数据库服务器或 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;
/

您可以将上述示例扩展并实现到您的复杂过程。这里有一个很好的解释。

于 2020-04-18T19:56:15.767 回答