2015-10-09 32 views
0

使用sql loader,我知道我可以在我的ctl文件中引用一个ksh变量。例如,我可以写把选择结果放入一个ksh变量

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

我想补充一个WHEN子句这样

WHEN (125:125) = '$P_NUMBER' 

P_NUMBER将有一列在表中的值,我会用一个选择查询检索。

有没有可能这样做?使用select从列中检索值,并以某种方式将其放入ksh变量,以便ctl文件可以看到它。 (一些与SQL加?)

谢谢

+0

[This](http://stackoverflow.com/a/17731960/266304)稍微复杂一些 - 你并不需要一个函数,但它不会伤害到分离。这是否给你你需要的东西? –

+0

编写一个shell脚本来驱动这个过程。在脚本中使用一个HERE DOC作为sqlldr控制文件和引用shell变量,或者将控制文件作为单独的模板文件运行sed以用值替换变量。 – TenG

+0

@Alex Poole ..是的,它似乎很好 – mlwacosmos

回答

0

作为一个基本的轮廓,你可以运行在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标志,关闭反馈和设置页面大小为零共同抑制所有的噪音,所以你只得到了结果,并没有剥离出横幅,标题等

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