天天看點

用shell幫助解決ORA問題

今天碰到一個設計的嚴重問題,由于使用了外部檔案來和sqlplus互動

sql大體結構如下

select xxxxx from xxxxx where table_name in ( "解析外部檔案“)

在測試環境中沒有什麼問題,當某個使用者表比較多的時候,就開始報如下的錯誤

*

ERROR at line 1003:

ORA-01795: maximum number of expressions in a list is 1000

********************************************************************************

因為需要,一定要解析這個外部檔案,是以隻能從别的方面進行考慮進行解決。

我加了了分頁的改進,沒500條記錄分為一頁,這樣循環調用就可以生成最終的檔案了。

v_page_size=500

v_page=1

v_start=1

v_len=`expr ${v_page} \* ${v_page_size}`

minus_file_len=`cat ${minus_list}|wc -l` 

#pages_flag=`expr ${minus_file_len} / ${v_page_size}`

pages_float=`echo "scale=2 ; ${minus_file_len} / 500"|bc`

pages_num=`echo '' | awk -v a=$pages_float '{print int(a+0.999)}'`

--上面的這一段基本就是要實作oracle中ceil的部分,比如有700條記錄,500條一頁,這樣700/500就是1.4,根據需要,需要傳回2.

然後開始循環,控制下标,

while [ ${v_page} -le  ${pages_num} ]

do 

echo ...............................

echo 'from Source :' $S_DB_STR

echo  from:$v_start

echo end:$v_len

echo page no: $v_page

sed -n "${v_start},${v_len}p" ${minus_list} > $SCHEMA_DIR/table_list.log

minus_tab_list=`cat ${SCHEMA_DIR}/table_list._${v_page}.log|awk '{print "'\''" $1 "'\'',"}'`

get_tab_details  $S_DB_CONN_STR    --這個部分是調用sqlplus的部分,傳入連接配接串

v_start=`expr ${v_page} \* ${v_page_size} + 1`

#v_page=$[ $v_page + 1 ]

v_page=`expr ${v_page} + 1`

done

輸出結果如下:

from:1

end:500

page no: 1

...............................

資料内容

from:501

end:1000

page no: 2

xxx

這樣不管資料量有多大,都可以靈活的進行拆分。