将select结果放入ksh变量中

时间:2015-10-09 15:42:51

标签: oracle sqlplus ksh sql-loader

使用sql loader,我知道我可以在我的ctl文件中引用一个ksh变量。例如,我可以写

LOAD DATA
    INFILE '$PATH_IN_KSH/my_file.dat'
...

我想添加像这样的WHEN子句

    WHEN (125:125) = '$P_NUMBER'

P_NUMBER将具有我将使用选择查询检索的表中列的值。

有可能吗?使用select从列中检索一个值并以某种方式将其放入ksh变量中,以便ctl文件可以看到它。 (sql plus的东西?)

谢谢

1 个答案:

答案 0 :(得分:0)

作为基本概要,您可以使用heredoc运行SQL * Plus来执行查询,并将输出分配给变量:

P_NUMBER=`sqlplus -s /nolog <<!EOF
connect username/password
whenever sqlerror exit failure
set pagesize 0
set feedback off
select your_value from your_table where your_key = 'something'; 
exit 0
!EOF`

将反引号括起来将结果赋给变量。然后,$ P_NUMBER将保存您的查询所获得的任何值(如果凭据错误,则为错误消息,例如)。如果您确定查询将返回一个结果,则会有所帮助。在尝试使用变量之前,您还可以使用$?测试返回代码以查找错误。

包含-s标记,关闭反馈并将pagesize设置为零可以共同抑制所有噪音,因此您只能获得结果并且不必删除横幅,标题等。

最后我使用/nolog并将connect语句放在heredoc中,以便凭据不会出​​现在进程列表中,这是一个经常被忽视的安全性问题。如果您不想这样做并将凭据设置为sqlplus username/passwd,则可以添加-l标志,以便它只尝试登录一次;否则如果由于某种原因登录失败,它将尝试使用heredoc的其余部分作为进一步的凭证,并且看起来可能会被短脚本挂起。