今天在做oracle数据库数据整理的工作,本来数据库方面就很弱势,在工作的这一年多,天天抱着hibernate不放,纯正的SQL更是忘记的七七八八,现在用到的时候问题多多,下面就把遇到的问题或刚刚学到的东西记录下来加深记忆吧。
1.关于sequence
众所周知,在hibernate中,用到自增序列时,我们只需要做如下配置。
今天在整理数据对于一些确实的记录要写SQL生成新的记录,对于自增id我就遇到麻烦了,幸好可以用P6spy跟踪hibernate执行过程,才知道是这样获取下一个序列值的,见笑了哦!
2.循环中用preparedstatement遇到[color=red]错误打开游标过大[/color]
在批量更新数据的时候,在执行中途就会抛游标过大异常。
虽然通过修改数据库游标值可以解决问题,但是觉得还是有些牵强的感觉,于是就在执行过程定位超出游标的部分,然后在这里增加preparedstatement关闭操作。结果问题依然存在,之前声明的是全局preparedstatement变量,于是改成局部变量,再在执行到相同位置进行关闭,这样又可以了。很不解这里面的机制,虽然没完全理解来龙去脉,但是还是清楚在循环中要时刻记得关闭创建的preparedstatement就行了。
修改游标大小:
3.被遗忘的nvl
用like %% 模糊查询,null值不能被匹配到,用到遗忘很久的 nvl(xx,' ') like %%就能匹配出来了。
4.深刻的体会了一把内外连接,左右连接查询的关系。。。不同情况效率确实不一样。
5.统计重复数据
数据继续整理中,问题持续更新.....
1.关于sequence
众所周知,在hibernate中,用到自增序列时,我们只需要做如下配置。
<generator class="sequence">
<param name="sequence">sequence_name</param>
</generator>
今天在整理数据对于一些确实的记录要写SQL生成新的记录,对于自增id我就遇到麻烦了,幸好可以用P6spy跟踪hibernate执行过程,才知道是这样获取下一个序列值的,见笑了哦!
select sequence_name.nextval from dual;
2.循环中用preparedstatement遇到[color=red]错误打开游标过大[/color]
在批量更新数据的时候,在执行中途就会抛游标过大异常。
虽然通过修改数据库游标值可以解决问题,但是觉得还是有些牵强的感觉,于是就在执行过程定位超出游标的部分,然后在这里增加preparedstatement关闭操作。结果问题依然存在,之前声明的是全局preparedstatement变量,于是改成局部变量,再在执行到相同位置进行关闭,这样又可以了。很不解这里面的机制,虽然没完全理解来龙去脉,但是还是清楚在循环中要时刻记得关闭创建的preparedstatement就行了。
修改游标大小:
alter system set open_cursors=2000;
3.被遗忘的nvl
用like %% 模糊查询,null值不能被匹配到,用到遗忘很久的 nvl(xx,' ') like %%就能匹配出来了。
4.深刻的体会了一把内外连接,左右连接查询的关系。。。不同情况效率确实不一样。
5.统计重复数据
select BANK_CAR_NO,count(*) from USER_BANKCARD group by BANK_CAR_NO having count(*) > 1
数据继续整理中,问题持续更新.....