如果没有要返回的记录,则返回默认消息 - sqlplus oracle

时间:2018-03-14 13:51:51

标签: oracle shell oracle11g sqlplus

我在sqlplus中运行视图并生成报告然后发送电子邮件(mailx)。 如果没有记录,则创建一个空的excel outfile。 我想验证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;

感谢您的建议 我修改了代码,下面是我现在得到的错误 错误:&#34;语法错误;意外的文件结束&#34;

你们中有人可以查看并建议吗?

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

2 个答案:

答案 0 :(得分:0)

我会这样做:

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

答案 1 :(得分:0)

一个选项是在运行查询之前从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