2015-02-24 69 views
0

我正在使用unix shell KSH脚本来做一些表清理。 我有一个文件“partner.txt” 5000线这样需要从Unix shell脚本传递字符串到SQL查询

>cat partner.txt 

aaa0000 
aaa0001 
aaa0002 
... 
... 
aaa5000 

使用这个文件,我应该打扫几桌与匹配,说的合作伙伴协议。 所以我构建的格式的合作伙伴名单串,我可以用“IN”子句中使用SQL语句(SELECT * FROM选项卡凡partner_list伙伴

('aaa0000', 
'aaa0001','aaa0002',...,'aaa0010', 
'aaa0011','aaa0012',...,'aaa0020', 
... 
'aaa4990','aaa4991',...,'aaa5000') 

我指定的字符串partner_list这样的变量。

export BO="(" 
export BC=")" 
export BQ="('" 
export QC="','" 
export QB="')" 
export C="," 
export CE=","'\n' 
export QCE="',"'\n'"'" 

partnerListLine=${BO} 
while read partnerline; 
do 
    if [ `expr ${counter} % 10` -eq 0 ] 
    then 
     partnerListLine=${partnerListLine}${partnerline}${CE} 

    elif [ ${counter} -lt ${numOfObsoletePartner} ] 
    then 
     partnerListLine=${partnerListLine}${partnerline}${C} 
    fi 
    counter=`expr ${counter} + 1` 
done < partner.txt 
partnerListLine=${partnerListLine}${partnerline}${BC} 

然后我用这合作伙伴名单,以获取像

SQL_agreement='select distinct a.agreement from partner_agreement_map a where a.partner in ${partner_list} order by agreement asc;' 

我需要换行字符在我的合作伙伴名单,因为我是用sqlplus并遇到SP2-0027我的协议列表:输入是过长(> 2499个字符) 我N个合作伙伴后追加下面我的合作伙伴名单字符串添加换行符

CE=","'\n' 

这工作得很好当我在脚本中直接使用sqlplus时。

但是当我尝试将这个partner_list字符串作为参数传递给一个sql脚本时,它在查询中显示'\ n'。

这是我打电话给我的SQL脚本,并传递参数

sqlplus -s ${REFERENCE_DB_USER}/${REFERENCE_DB_PASS}@${DATABASE_INSTANCE} << !! 
set serveroutput on size 10000; 
set feedback off; 
set verify off; 
set echo off; 
set term off; 
set pagesize 0; 
SET linesize 1000; 
SET TRIMSPOOL ON; 

spool 1_del_agreement_spool_$$.lst; 

@1_del_agreement.sql ${partner_list}; 

spool off; 

exit; 
/
!! 

这是我的假脱机文件

>cat 1_del_agreement_spool_18165.lst         < 

select distinct a.agreement from partner_agreement_map a where a.partner in ('aaa0000',\n'aaa0001','aaa0002','aaa0003',...'aaa0010',\n'aaa0011'...) order by agreement asc 
                        * 
ERROR at line 1: 
ORA-00907: missing right parenthesis 

我怎样才能保持换行符时,我的参数传递到SQL脚本,并没有将它替换为'\ n'? 我试过ANSI-C引用,但失败了。

请让我知道如果你想,如果你正在使用bash所需要的外壳或SQL脚本

+0

注意:您不应该在此文档中使用'!!',因为这里有一个shell命令同名(回忆最后的命令)。改用'EOF'。 – 2015-02-24 11:07:00

+0

编辑问题并向我们显示为'partner_list'分配值的代码。 – 2015-02-24 11:07:33

+0

我已添加片段。我还将单引号添加到合作伙伴列表中。我正在循环该文件,并根据需要添加逗号,qoutes和换行符。 – pradipti 2015-02-24 11:28:21

回答

1

更新了我的整个解决方案的设计

想了一夜后,我已经放弃了。 感谢Aaron和mplf的投入。

我已经决定我的解决方案从基于文件的基于表改变。我将阅读partner.txt文件并将合作伙伴插入虚拟临时表中。然后,我可以轻松地在其他表格上制定查询。

事实上,我想这应该是我的第一个设计:)有可能是一些很轻微的,我在以前的设计缺失。但无论如何,这将会容易得多 我希望我的团队领导评论设计而不是代码格式问题:P

+0

另一种解决方案是使用一个真正的编程语言,而不是在那里你可以创建一个没有惊喜和数据库驱动程序,可以让你避免一切的怪癖和安全漏洞(如发布您的密码,任何人在同一台计算机上)sqlplus的字符串。 http://stackoverflow.com/questions/13476419/suppressing-passwd-when-calling-sqlplus-from-shell-script – 2015-02-25 09:11:14

0

的更多细节,你可以用$“\ n”用来打印一个换行符这将使你的榜样

if [ `expr ${counter} % 10` -eq 0 ] 
then 
    partnerListLine=${partnerListLine}${partnerline}"',"$'\n'"'" 
else 
    ... 

例子:

$ echo hello"',"$'\n'"'" 
hello', 
' 
+0

我很抱歉,我错过了提我使用KSH。编辑了这个问题。谢谢你。 – pradipti 2015-02-24 11:47:21

0

我没有一个有效的解决方案,但一个提示:'\n'的意思是“插入反斜线后跟n“。所以你告诉shell离开这个字符串。

尝试NL=$(echo -e '\n')或类似的来获取一个实际上包含换行符的字符串变量。然后,您可以定义CE=",$NL"

shell在处理字符串时可能会保留此新行字符。

或者使用像awk一个工具来创建与分配给partner_listpartner_list=$(awk ...),以防止外壳进行任何类型的值的处理换行符的字符串值。

如果不工作,你可能不得不将数据写入一个文件(新线)。