用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
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)

原文发表时间:2014-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维小白

10.8 ps命令

监控系统状态 ps 查看系统进程 用法:ps aux、ps -elf STAT部分说明 D 不能中断的进程 R run状态的进程 S sleep状态的进程 ...

1746
来自专栏Linyb极客之路

redis主从复制简介

一. Redis主从复制简介 Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。 1) master可以有多个 slave。 2) 除了多...

39710
来自专栏惨绿少年

MongoDB的备份与恢复

1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore      有以上两组命...

5096
来自专栏Java技术

基于Spring AOP和Groovy日志模板配置的日志记录框架的二次实现与使用案例

https://git.oschina.net/xuliugen/ufind-businesslog.git

513
来自专栏PHP技术

PHP非阻塞实现方法

如果 PHP 与 Web 服务器使用了 PHP-FPM(FastCGI 进程管理器),那通过 fastcgi_finish_request() 函数能马上结束会...

972
来自专栏编程坑太多

springboot(14)redis实现session共享

2094
来自专栏不想当开发的产品不是好测试

性能测试 -- 实际问题

现象: 自动化云主机(10.199.146.xx )上的osp-cart服务过一段时间会自动停掉 分析过程: 1、通过top命令,查看整理的资源情况,发现osp...

1739
来自专栏杨建荣的学习笔记

服务器增加内存后无法重启数据库的问题及解决 (36天)

前几天生产环境需要做服务器的扩容,把原本64G的内存扩到了128G.然后调整了一些其他的kernel参数,在此基础上需要调整sga的大小,以便分配更多的缓存。 ...

2685
来自专栏iMySQL的专栏

MySQL FAQ 系列 : 不同的 binlog_format 会导致哪些 SQL 不会被记录

MySQL Replication 可以支持比较灵活的 binlog 规则,可以设置某些库、某些表记录或者忽略不记录。 我经过比较简单的测试,对不同的 binl...

1120
来自专栏林欣哲

MySQL数据库备份和恢复

952

扫描关注云+社区