使用 Crontab 将输出格式更改为 SQLplus

Change output format into SQLplus using Crontab

我正在使用 crontab 到 运行 SQL 脚本。下面是我的脚本:

#!/bin/sh
export ORACLE_HOME=/opt/xxx/oracle/client
date=$(date +%d.%m.%y-%T)
echo "select col1, col2 from table1;" |/opt/xxx/oracle/client/bin/sqlplus "abc/abc@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=111.0.0.1)(Port=9999))(CONNECT_DATA=(SID=sidX)))" > /usr/users/tuser/temp/file.$date.txt

文件格式包含大量不必要的数据,例如:

如何只导出 headers 列的查询结果? (最好是csv格式)

您可以在回显字符串中包含 SQL*Plus set 命令,但还需要嵌入新行;从 echo 切换到 printf 可能会使 simpler/cleaer.

然后您可以用逗号连接您的列以获得 CSV 输出:

printf "set pages 0 lines 200 trimout on tab off feedback off\nselect col1||','||col2 from table1;exit" |  /opt/....

我还根据您的评论增加了行号。 You can read more about the settings available, and formatting in general.

如果您的列包含可能包含逗号的字符串,您可以将它们的值括在 double-quotes 中,这样可以避免它们被 Excel 或其他工具误解为额外的列。

如果您还需要 CSV headers,您可以使用虚拟查询来获取它们,或者使用提示命令添加固定文本:

printf "set pages 0 lines 200 trimout on tab off feedback off\nprompt COL1,COL2\nselect col1||','||col2 from table1;exit" |  /opt/....

并且您可以使用 -s 标志使 SQL*Plus 抑制其横幅:

... exit" | /opt/xxx/oracle/client/bin/sqlplus -s "abc/abc@..."

顺便说一句,如果您可以从使用 SID 切换到服务名称,则可以使用简短的 'easy connect' 语法而不是完整的 TNS 连接描述符。

带有简单查询的快速演示;如果我从命令行执行此操作(分成两行只是为了防止滚动):

printf "set pages 0 feedback off\nprompt Col1,Col2\nselect dummy||','||dummy from dual;" |\
  /path/to/sqlplus -s myuser/mypass@//myhost:myport/myservicename

我得到的全部输出是:

Col1,Col2
X,X

我会认真考虑至少将 SQL 命令放入 .sql 脚本文件并从 SQL*Plus 执行;并可能将整个命令(调用 sqlplus 执行脚本)放入 shell 脚本中 - 然后您可以从 cron 调用 shell 脚本。