我在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
答案 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