前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用shell帮助解决ORA问题

用shell帮助解决ORA问题

作者头像
jeanron100
发布2018-03-13 17:01:34
6120
发布2018-03-13 17:01:34
举报

今天碰到一个设计的严重问题,由于使用了外部文件来和sqlplus交互

sql大体结构如下

代码语言:javascript
复制
select xxxxx from xxxxx where table_name in ( "解析外部文件“)

在测试环境中没有什么问题,当某个用户表比较多的时候,就开始报如下的错误

代码语言:javascript
复制
*
ERROR at line 1003:
ORA-01795: maximum number of expressions in a list is 1000
********************************************************************************

因为需要,一定要解析这个外部文件,所以只能从别的方面进行考虑进行解决。

我加了了分页的改进,没500条记录分为一页,这样循环调用就可以生成最终的文件了。

代码语言:javascript
复制
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.

然后开始循环,控制下标,

代码语言:javascript
复制
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

输出结果如下:

代码语言:javascript
复制
from:1
end:500
page no: 1
...............................

数据内容

代码语言:javascript
复制
from:501
end:1000
page no: 2
...............................
xxx

这样不管数据量有多大,都可以灵活的进行拆分。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档