2015-02-24 70 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 ...),以防止外殼進行任何類型的值的處理換行符的字符串值。

如果不工作,你可能不得不將數據寫入一個文件(新線)。