【问题标题】:Return Default message if there is no record to return - sqlplus oracle如果没有要返回的记录,则返回默认消息 - sqlplus oracle
【发布时间】:2018-08-23 02:07:37
【问题描述】:

我在 sqlplus 中运行视图并生成报告,然后发送电子邮件 (mailx)。 如果没有记录,它会创建一个空的 excel 输出文件。 我想验证 sql 错误代码,如果没有记录,我想在电子邮件正文中包含“指定时间段内没有记录”。 您能否建议如何捕获 sql 代码,以便我可以更改没有附件的电子邮件正文? 提前致谢。

代码:

sqlplus /@conn<<EOF

WHENEVER SQLERROR EXIT 1 ROLLBACK
WHENEVER OSERROR EXIT 1 ROLLBACK

SET MARKUP HTML ON
SET PAGESIZE 50000
SET FEEDBACK OFF

@/home/user/script.sql;

echo body | mailx 

script.sql:

col spoolname new_value spoolname;
Spool /home/path/file
Select * from schema.file;

感谢您的建议。
我已经修改了代码,下面是我现在遇到的错误。
错误:“语法错误;文件意外结束”

请你们检查并提出建议吗?

sqlplus /@conn<<EOF
<SQL error handling & set values >

@/home/user/script.sql;
EOF                                                                                          
CDATE=$CDATE"`date +"%y%m%d"`.xls";                                                       
ODFILENAME="/home/usr/reports/ ";                                                                 
ODFILENAME=$ODFILENAME"$CDATE";                                                       

if [ -s "$ODFILENAME" ]; then                                                               
    BODY=$BODY"Please find the extract."
else
    BODY=$BODY"Zero KB file."                                                                      
fi                                                                                                                           

mailx

【问题讨论】:

  • 你的第二个 EOF 在哪里?您的 shell 脚本代码不完整。
  • WHENEVER SQLERROR EXIT 1 ROLLBACK 不会在 select 语句中没有记录的情况下使用退出代码退出会话。如果您正在运行 PL/SQL 块,则可以使用 no_data_found 之类的异常。否则,@kfinity 的答案,即在 shell 中检查文件大小应该适合你。

标签: oracle shell oracle11g sqlplus


【解决方案1】:

一种选择是在运行查询之前从 PL/SQL 块中引发 NO_DATA_FOUND 以获取单个记录,以查看查询是否为您提供输出。这将导致 SQL* Plus 会话以SQLERROR 终止

注意:如果script.sql中有多个sql查询,或者是长时间运行的查询,这可能效率不高。

您可以在 sqlplus 中编写类似的内容。

WHENEVER SQLERROR EXIT 1 ROLLBACK
WHENEVER OSERROR EXIT 1 ROLLBACK

DECLARE 
v INT;

BEGIN
    SELECT 1
    INTO v
    FROM v_EMPLOYEES  --Your view query for 1 row
    WHERE ROWNUM = 1;  
END;
/

SET MARKUP HTML ON
SET PAGESIZE 50000
SET FEEDBACK OFF
@/home/user/script.sql

如果它以这种方式终止并出现错误,退出代码将被 shell 环境变量 $? 捕获,可以在与 kfinity 的答案类似的块中使用。

if [ $? -eq 0 ] ;then 
..
..
else 

【讨论】:

    【解决方案2】:

    我会这样做:

    shell脚本

    sqlplus -silent /@conn<<EOF
    
    WHENEVER SQLERROR EXIT 1 ROLLBACK
    WHENEVER OSERROR EXIT 1 ROLLBACK
    
    SET MARKUP HTML ON
    SET PAGESIZE 50000
    SET FEEDBACK OFF
    
    @/home/user/script.sql;
    EOF
    
    if [ -s /home/path/file ] ; then
      # file is not zero size
      echo body | mailx ...
    else
      mailx -s "subject" user@domain.com <<EOF
    There is no records for the specified period
    .
    EOF
    fi
    

    【讨论】:

    • 感谢您的建议,引发此问题并得到“语法错误;意外的文件结尾错误。语法有任何问题。如果 [ -s "$ODFILENAME" ]; then BODY=$BODY"请找到提取。" else BODY=$BODY"零 KB 文件。" fi
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多