从查询中执行命令
Execute command from query
我打算通过查询结果发送电子邮件。问题是它正在打印而不是 运行 命令。有人可以向我解释我做错了什么吗?
sqlTxt=$(sqlplus -s "$CONNECT" << EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE;
SET FEEDBACK OFF
SET HEADING OFF
SET SERVEROUTPUT ON
SET FEED OFF
SET TERMOUT OFF
SET VERIFY OFF
SET ECHO OFF
SET HEAD OFF
select 'echo -en '||cme.BODY ||' | mailx -s '||cme.SUBJECT ||' -a "$HTMLFILE"'||decode(MAIL_FROM,null,'',' -r "<' ||MAIL_FROM|| '>"')||' -c "'||MAIL_CC||'" "'||MAIL_TO||'"' send from CUST_SEND_EMAIL cme WHERE cme.program_name='SEND_EMAIL' and cme.status='NOK';
/
EOF
)
$sqlTxt
一些补充说明:
cme.BODY
包含 \n
。出于这个原因,我使用 echo -en
- 我正在使用
mailx
因为我发现最简单的工作方式
- 不需要像我一样使用命令。我可以将查询结果的每一列的内容分配给变量(我尝试这样做但没有成功)。
有人可以帮助我吗?
提前致谢
更改最后一行
$sqlTxt
到
eval $sqlTxt
更多信息about eval, and a warning!
it adds a space to the file extension
那将是80个字符;与附件本身无关,只是 SQL*Plus 的默认线宽包装结果。如果你也保留普通的 $sqlTxt
你会看到它试图生成的命令,它可能有几个空格,间隔为 80 个字符 - 但如果你的终端设置为 80 个字符宽那么可能不是还是很明显。
您可以用一个比您期望的命令更长的数字覆盖线宽,例如
SET LINES 5000
您可能还想用引号将主题引起来,以防包含空格;我用这个轻微的变体测试成功:
...
SET HEAD OFF
SET LINES 5000
select 'echo -en '
|| cme.BODY
|| ' | mailx '
|| ' -s "' || cme.SUBJECT || '"'
|| ' -a "$HTMLFILE"'
|| case when MAIL_FROM is not null then ' -r "<' || MAIL_FROM || '>"' end
|| ' -c "' || MAIL_CC || '"'
|| ' "' || MAIL_TO || '"'
from CUST_SEND_EMAIL cme
where cme.program_name = 'SEND_EMAIL'
and cme.status = 'NOK';
EOF
)
# to debug
$sqlTxt
eval $sqlTxt
除了将查询分成多行以提高可读性并添加一些引号外,我还删除了 /
。由于查询已经以分号结束,该分号刚刚重新执行缓冲区 - 保存该查询 - 所以输出被复制,导致一些奇怪的结果(额外的虚假和非法 'to' 地址)。
我打算通过查询结果发送电子邮件。问题是它正在打印而不是 运行 命令。有人可以向我解释我做错了什么吗?
sqlTxt=$(sqlplus -s "$CONNECT" << EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE;
SET FEEDBACK OFF
SET HEADING OFF
SET SERVEROUTPUT ON
SET FEED OFF
SET TERMOUT OFF
SET VERIFY OFF
SET ECHO OFF
SET HEAD OFF
select 'echo -en '||cme.BODY ||' | mailx -s '||cme.SUBJECT ||' -a "$HTMLFILE"'||decode(MAIL_FROM,null,'',' -r "<' ||MAIL_FROM|| '>"')||' -c "'||MAIL_CC||'" "'||MAIL_TO||'"' send from CUST_SEND_EMAIL cme WHERE cme.program_name='SEND_EMAIL' and cme.status='NOK';
/
EOF
)
$sqlTxt
一些补充说明:
cme.BODY
包含\n
。出于这个原因,我使用echo -en
- 我正在使用
mailx
因为我发现最简单的工作方式 - 不需要像我一样使用命令。我可以将查询结果的每一列的内容分配给变量(我尝试这样做但没有成功)。
有人可以帮助我吗?
提前致谢
更改最后一行
$sqlTxt
到
eval $sqlTxt
更多信息about eval, and a warning!
it adds a space to the file extension
那将是80个字符;与附件本身无关,只是 SQL*Plus 的默认线宽包装结果。如果你也保留普通的 $sqlTxt
你会看到它试图生成的命令,它可能有几个空格,间隔为 80 个字符 - 但如果你的终端设置为 80 个字符宽那么可能不是还是很明显。
您可以用一个比您期望的命令更长的数字覆盖线宽,例如
SET LINES 5000
您可能还想用引号将主题引起来,以防包含空格;我用这个轻微的变体测试成功:
...
SET HEAD OFF
SET LINES 5000
select 'echo -en '
|| cme.BODY
|| ' | mailx '
|| ' -s "' || cme.SUBJECT || '"'
|| ' -a "$HTMLFILE"'
|| case when MAIL_FROM is not null then ' -r "<' || MAIL_FROM || '>"' end
|| ' -c "' || MAIL_CC || '"'
|| ' "' || MAIL_TO || '"'
from CUST_SEND_EMAIL cme
where cme.program_name = 'SEND_EMAIL'
and cme.status = 'NOK';
EOF
)
# to debug
$sqlTxt
eval $sqlTxt
除了将查询分成多行以提高可读性并添加一些引号外,我还删除了 /
。由于查询已经以分号结束,该分号刚刚重新执行缓冲区 - 保存该查询 - 所以输出被复制,导致一些奇怪的结果(额外的虚假和非法 'to' 地址)。