从查询中执行命令

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

一些补充说明:

有人可以帮助我吗?

提前致谢

更改最后一行

$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' 地址)。