将假脱机文件的名称从 shell 脚本传递给 sqlplus

Posted

技术标签:

【中文标题】将假脱机文件的名称从 shell 脚本传递给 sqlplus【英文标题】:Passing the name of spool file to sqlplus from a shell script 【发布时间】:2017-02-01 07:38:15 【问题描述】:

我正在尝试编写一个 unix 程序,在该程序中我需要连接到 SQL DB 并获取数据并将其存储到文件中。

目前我正在使用以下命令:

output1=`sqlplus -s username@SID/password <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF;
SPOOL EMP_NAMES.txt
select emp_name from employee order by emp_name;
Spool off;

这工作正常。但我的要求是我想传递 spool 文件的值,这样每次都会生成一个新的 Spool 文件。

我基本上想在文件名末尾附加日期,例如:

date=`date +'%d/%m/%Y_%H:%M:%S:%2N'`
output1=`sqlplus -s username@SID/password <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF;
SPOOL EMP_NAMES_$date.txt

请告诉我如何做到这一点。

【问题讨论】:

【参考方案1】:

如果您使用heredoc 致电您的sqlplus,您可以轻松做到这一点:

spool_file=: ... your date logic here ...
sql_ouput=: ... path for sqlplus output & errors ...
sqlplus -s username@SID/password << EOF &> "$sql_output"
  SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING ON ECHO OFF;
  spool $spool_file
  # SQL statements
  spool off
EOF
if [[ $? != 0 ]]; then
  : ... error handling ...
fi
最好将sqlplus 的stdout/stderr 捕获到文件中而不是shell 变量中。 我认为可以通过从命令行中删除密码并将其添加为heredoc的第一行来隐藏密码(这将防止密码在ps中显示)

看看这个相关的帖子:Connect to sqlplus in a shell script and run SQL scripts

【讨论】:

感谢@codeforester 的超快速响应!!!我已经尝试了建议的步骤,但仍然出现错误。 spoolFile="SPOOL_FILE_"$date".txt" output1=`sqlplus -s username@SID/pwd "EOF" 是否位于行首并且该行没有其他字符?您遇到什么错误? 它在行尾就像 -- output1=`sqlplus -s username@SID/pwd 谢谢@codeforester !!!有效。我只是以您提到的类似方式重新编写了代码并且它起作用了。非常感谢!!!

以上是关于将假脱机文件的名称从 shell 脚本传递给 sqlplus的主要内容,如果未能解决你的问题,请参考以下文章

将参数从 Qt 传递到 shell 脚本文件

shell入门练习

将 hdfs 上的脚本文件传递给 impala-shell

参数传递:shell脚本调用一个带参数的python函数

从 VBScript 调用任何带有俄语名称的文件/脚本失败

将参数从 shell 脚本传递到 hive 脚本