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