使用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的东西?)
谢谢
答案 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的其余部分作为进一步的凭证,并且看起来可能会被短脚本挂起。