简介
最近我们公司生产上的服务器突然报错java.sql.SQLException: ORA-00600:,这个错误,一般情况下都没有报错,只有在查询列表时如果某些字段varchar2字段大小为4000的时候就会报错。
出现问题的场景
由于前段时间数据库迁移,然后旧数据库的oracle版本为10gR2的搬迁后的版本为12c,搬迁之前没有这个问题的,搬迁后就有了。具体报错如下:
报错的sql:SELECT * FROM (SELECT P.*, ROWNUM NUM FROM (SELECT NI.NEWS_ID, NI.NEWS_TITLE, NI.NEWS_CONT, NI.NEWS_TYPE, NI.MEMBER_ID, F_GET_STATUS_DESC(‘TF_NEWS_INFO’,‘NEWS_TYPE’,NEWS_TYPE) NEWS_TYPE_NAME, to_char(NI.SEND_DATE, ‘yyyy-mm-dd hh24:mi:ss’) SEND_DATE FROM TF_NEWS_INFO NI WHERE NI.STATUS =‘A’ ORDER BY SEND_DATE DESC ) P WHERE ROWNUM <= 20) TAB WHERE TAB.NUM > 0
放到plsql中执行的时候也是报错,但是如果我把外层的查询嵌套都去掉变成
SELECT NI.NEWS_ID, NI.NEWS_TITLE, NI.NEWS_CONT, NI.NEWS_TYPE, NI.MEMBER_ID, F_GET_STATUS_DESC(‘TF_NEWS_INFO’,‘NEWS_TYPE’,NEWS_TYPE) NEWS_TYPE_NAME, to_char(NI.SEND_DATE, ‘yyyy-mm-dd hh24:mi:ss’) SEND_DATE FROM TF_NEWS_INFO NI WHERE NI.STATUS =‘A’ ORDER BY SEND_DATE DESC
就是去掉分页内容后却可以查询,真是太奇怪了。
最终解决方法
后来我发现在我查询的字段中有一个varchar2的字段的大小为4000,我把它改成3500后就可以了。这边我上网查询了下12c的varchar2的最大值确实是4000没有问题的,但是多加一层select * from()后就会报错,我估计这是一个bug吧。如果有大佬知道具体原理原因的话多多指教哈。