用shell幫助解決ORA問題
阿新 • • 發佈:2022-05-04
今天碰到一個設計的嚴重問題,由於使用了外部檔案來和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 echo ............................... 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` v_len=`expr ${v_page} * ${v_page_size}` done
輸出結果如下:
from:1
end:500
page no: 1
...............................
資料內容
from:501
end:1000
page no: 2
...............................
xxx
這樣不管資料量有多大,都可以靈活的進行拆分。