Выполнить команду из запроса - PullRequest
1 голос
/ 04 марта 2020

Я собираюсь отправить электронное письмо по результатам запроса. проблема в том, что он печатается вместо запуска команды. Может кто-нибудь объяснить мне, что я делаю неправильно?

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, потому что я нашел самый простой для работы
  • , использование команды не обязательно, как я это делал. Я могу назначить переменным содержимое каждого столбца, полученного в результате запроса (который я пытался сделать безуспешно).

Кто-то может мне помочь?

Заранее спасибо

1 Ответ

1 голос
/ 04 марта 2020

Изменить последнюю строку

$sqlTxt

на

eval $sqlTxt

Подробнее о eval и предупреждение !

добавляет пробел к расширению файла

Это будет 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»).

...