使用 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 脚本。
我正在使用 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 脚本。