用shell帮助解决ORA问题

作者: admin 分类: 公众号存档            1 次浏览 发布时间: 2014-03-07 09:04

公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2014-03-07 09:04:25 · 原文链接

今天碰到一个设计的严重问题,由于使用了外部文件来和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

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

杨建荣的学习笔记,微信号:jianrong-notes

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

更多阅读