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



>我正在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 

脚本.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

我会这样做:

外壳脚本

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

一种选择是在运行查询以获取单个记录以查看查询是否为您提供输出之前从 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 

最新更新