【问题标题】:Problems while spooling data from Oracle. It spools elapsed time instead of spooling result of sql query into output file从 Oracle 假脱机数据时出现问题。它假脱机经过的时间,而不是将 sql 查询的结果假脱机到输出文件中
【发布时间】:2018-09-26 04:28:07
【问题描述】:

我正在尝试制作一个每天运行一次的 cron 作业。在调用 shell 脚本时,它调用一个 Sql 文件。这反过来将数据假脱机到文件中。该文件由 Shell 脚本选择,然后相应地邮寄。问题是当我尝试假脱机数据时,它正在写入经过的时间,而不是将查询的实际结果写入输出文件。

这是我正在使用的 sql 文件。

set define off
set numformat 99999999999999999999999999
set markup html on
set serveroutput on
set head on
set pages 3000
set echo off 

DECLARE
total integer :=0;
total = select count(*) from t_c_table1 vt, t_c_table2 ti WHERE vt.f_item_id = ti.f_item_id (+) AND (f_update_date < sysdate - 30)order by F_INSERT_DATE desc; 

IF total > 0 then 

spool /home/output.csv
select f_name, count (*) from t_c_table1 where F_INSERT_DATE < sysdate-100 group by f_item_provider_id;
spool off

END IF

我在假脱机的 csv 文件中得到类似 Elapsed: 00:00:00.506 的输出。

我哪里出错了? 请帮忙。 在此先感谢..

【问题讨论】:

  • spool 是一个 sqlplus 命令。您不能在 SQL 语句或 PL/SQL 块中使用它
  • 那么我应该在哪里使用线轴?里面的shell脚本?

标签: sql oracle plsql oracle11g sqlplus


【解决方案1】:

您发布的代码是错误的,它甚至无法在 Oracle 中编译,所以我很惊讶您得到了任何东西

由于没有SET TIMING ON,我不确定是什么在假脱机文件中产生了经过的时间线。也许您正在查看的是一些旧的、以前创建的 CSV 文件?

除了SPOOL 是一个 SQL*Plus 命令(因此您不能在 PL/SQL 过程中调用它)这一事实之外,您计算 TOTAL 变量值的方式是错误的 - 它应该是SELECT ... INTO 声明。

SQL> declare
  2    total integer := 0;
  3  begin
  4    select count(*)
  5      into total
  6      from dept;
  7
  8    if total > 0 then
  9       spool test.csv
 10       select * from dept;
 11       spool off;
 12    end if;
 13  end;
 14  /
     spool test.csv
           *
ERROR at line 9:
ORA-06550: line 9, column 12:
PLS-00103: Encountered the symbol "TEST" when expecting one of the following:
:= . ( @ % ;


SQL>

如果您想有条件地假脱机数据,则必须使用UTL_FILE 包。

或者,您可以“交互地”执行此操作,以便 SQL*Plus 询问您是否要假脱机数据,正如 Alex Poole 在他的回答 here 中所描述的那样。

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2021-10-11
    • 2021-09-29
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多