我需要在 PUTTY 中使用 SHELL 脚本运行 SQL 查询,并以表格式在电子邮件正文中发送结果,其中包含标题以及顶部的消息行。到目前为止我已经写了这篇文章,但我无法获得表格格式的结果。
#! /bin/ksh
sqlplus -s user/pass @sid > /dev/null << EOF
whenever sqlerror exit 4;
set newpage 0
set space 0
set feedback off
set head off
set echo off
set pagesize 0
set serverout on
set trimspool on
set linesize 3000
spool $CSVFILE
select * from table;
spool off;
exit 0;
EOF
mailx -s "Subject Line" [email protected] < $CSVFILE
exit 0
SQL 运行良好,数据保存在 CSVFILE 中。我想要的结果应该以表格格式发送到电子邮件正文中的电子邮件地址,并且还涉及表格上方的消息行,如下所示: 带有粗略表格的电子邮件示例
没有错误。但即使在 SET HEAD ON 之后,CSVFILE 中也没有标头。我也尝试过“mail -a(内容类型)”解决方案,但“-a”给出错误。
答案1
Shell 并不是一个好的工具。
更好的解决方案是将数据转储到文件中,然后使用awk
、perl
甚至重新格式化文件python
。
更好的是 - 将整个内容写在perl
or中python
- 连接到数据库,执行 SQL 语句,下载并格式化数据。
另一种方法是在网上找到(或自己编写)一个export2csv
工具(github上有很多版本)。只需找到一个可以在您的环境中运行的即可。他们通常有一种简单的方法来定义 SQL 语句和输出文件。
如果您有 ODBC 连接到数据库(unixODBC
工作正常),并且可以编译 C++ 代码,您可以尝试我的nisql
:https://github.com/White-Owl/nisql
答案2
sqlplus
你的问题出在设置的方式上。添加集合,例如:
set lines 256
set trimout on
set tab off
像这样打印表格:
Name | Address | Phone |
-------+---------------+-------------+
name1 | address1 | phone1 |
name2 | address2 | phone2 |
name3 | address3 | phone3 |
然后你的最后一个命令将发送格式漂亮的邮件。
要在表格前添加行,您可以使用prompt
:
prompt Hi,
prompt Please check results below:
prompt
据您了解,这些命令应该在select
生成表之前。