查看: 20126|回复: 18

[SQL] 【大话IT】求助一条SQL,报ORA-00920错误 无效的关系运算符

[复制链接]
论坛徽章:
1
优秀写手
日期:2015-02-12 06:00:15
发表于 2015-1-21 10:10 | 显示全部楼层 |阅读模式
最近进行程序部署发现这么一个错误:

一条SQL语句在ORACLE正式库执行报ORA-00920错误,但是这个SQL在别的ORACLE下执行没有问题:

没有问题的ORACLE 数据库:单机数据库,版本11.2.0.1.0(64位)

出现这个问题的ORACLE数据库:ORACLE(RAC),版本11.2.0.3.0(64位)

具体SQL语句如下:

select A.*,B.* from eqbasic A

  left join dic_organization B on (A.eqid,B.id) in

  (select m.eqid,regexp_substr(m.province_ids,'[^,]',1,level) ids from eqbasic m connect by level <= length(m.province_ids) - length(replace(m.province_ids,'1') ) +1 )

where A.eqtime = (select max(eqtime) from eqbasic)

  order by A.eqid

执行这条SQL的时候报ora-00920,PL/SQL 提示为regexp_substr函数中level处报错,很是奇怪,同样的SQL语句在11.2.0.1.0版本中执行没有问题。

现将各表数据罗列如下,希望能帮忙指点下是那里的问题,莫非真是oracle 版本的问题么:

eqbasic 数据表内容:

EQID                           EQTIME                    EQLATITUDE    EQLONGITUDE    EQMAG    EQDIRECTION     EQDEPTH    ADDRESS     PROVICE_IDS     PICTURE_ADDRESS
------------------------         -------------------------       ------------------     --------------------    ---------      -------------------     -------------     ------------     -----------------      --------------------------
20150116091121         2015/1/16 9:11:21     29.670             119.350             5.5                                  10.0            C:\B9           20

dic_oranization 数据表内容

ID         NAME        CODE            OTYPE
----------  -------------   ---------------     ------------------
1          单位1                            3
20        单位2         33000000     1

其中,left join 条件中的sql语句单独执行是没i有问题的,就是这部分SQL:select m.eqid,regexp_substr(m.province_ids,'[^,]',1,level) ids from eqbasic m connect by level <= length(m.province_ids) - length(replace(m.province_ids,'1') ) +1,执行结果如下:


EQID                          IDS
-------------------------        -------------------------
20150116091121        20




以上,很奇怪为什么同样的SQL在不同版本下执行会出现问题,在正式数据库中报无效的关系运算符错误,请各位指教一下,不胜感激!!!



论坛徽章:
23
2014年世界杯参赛球队: 哥斯达黎加
日期:2014-06-06 15:02:04沸羊羊
日期:2015-06-17 14:51:07天枰座
日期:2015-07-17 09:51:12金牛座
日期:2016-03-21 21:10:40摩羯座
日期:2016-03-29 15:07:30娜美
日期:2016-06-22 19:49:29奥运会纪念徽章:篮球
日期:2016-09-02 09:45:25奥运会纪念徽章:现代五项
日期:2016-09-23 16:25:05布鲁克
日期:2017-03-21 09:35:18山治
日期:2018-01-04 21:26:16
发表于 2015-1-21 10:22 | 显示全部楼层
是你的select m.eqid,regxp_substr(m.province_ids,'[^,]',1,level) ids from eqbasic m connect by level <= length(m.province_ids) - length(replace(m.province_ids,'1') ) +1这条语句,在不同数据库,返回的数据不一样导致的吧。

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2015-1-21 11:04 | 显示全部楼层
你确认是regxp_substr,而不是regexp_substr?

使用道具 举报

回复
求职 : 数据库管理员
认证徽章
论坛徽章:
11
ITPUB社区千里马徽章
日期:2013-06-09 10:15:34懒羊羊
日期:2015-03-04 14:52:11懒羊羊
日期:2015-02-10 13:36:05马上有对象
日期:2015-02-02 12:29:02红宝石
日期:2015-01-19 09:44:10马上有车
日期:2014-11-11 14:16:07马上有车
日期:2014-03-27 15:59:39优秀写手
日期:2014-03-12 06:00:13马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09
发表于 2015-1-21 11:08 | 显示全部楼层
bfc99 发表于 2015-1-21 11:04
你确认是regxp_substr,而不是regexp_substr?

不要在意这些细节

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2015-02-12 06:00:15
 楼主| 发表于 2015-1-21 11:24 | 显示全部楼层
IT渔夫 发表于 2015-1-21 10:22
是你的select m.eqid,regxp_substr(m.province_ids,'[^,]',1,level) ids from eqbasic m connect by level

刚才我又检查了下!
两个库返回的结果是一样的,因为是同样的建表工具建表导入数据!

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2015-02-12 06:00:15
 楼主| 发表于 2015-1-21 11:24 | 显示全部楼层
bfc99 发表于 2015-1-21 11:04
你确认是regxp_substr,而不是regexp_substr?

这个是笔误,书写错误!

使用道具 举报

回复
论坛徽章:
23
2014年世界杯参赛球队: 哥斯达黎加
日期:2014-06-06 15:02:04沸羊羊
日期:2015-06-17 14:51:07天枰座
日期:2015-07-17 09:51:12金牛座
日期:2016-03-21 21:10:40摩羯座
日期:2016-03-29 15:07:30娜美
日期:2016-06-22 19:49:29奥运会纪念徽章:篮球
日期:2016-09-02 09:45:25奥运会纪念徽章:现代五项
日期:2016-09-23 16:25:05布鲁克
日期:2017-03-21 09:35:18山治
日期:2018-01-04 21:26:16
发表于 2015-1-21 11:46 | 显示全部楼层
haojianjian404 发表于 2015-1-21 11:24
刚才我又检查了下!
两个库返回的结果是一样的,因为是同样的建表工具建表导入数据!

两个库,相同数据,执行上面的select m.eqid,regexp_substr(m.province_ids,'[^,]',1,level) ids from eqbasic m connect by level <= length(m.province_ids) - length(replace(m.province_ids,'1') ) +1,一个OK,一个报错?????

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-1-21 12:02 来自手机 | 显示全部楼层
难道是版本问题?

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2015-02-12 06:00:15
 楼主| 发表于 2015-1-21 12:06 | 显示全部楼层
IT渔夫 发表于 2015-1-21 11:46
两个库,相同数据,执行上面的select m.eqid,regexp_substr(m.province_ids,'[^,]',1,level) ids from eq ...

不是的,单单这部分SQL,两个库都能执行!但是完整的:
select A.*,B.* from eqbasic A

  left join dic_organization B on (A.eqid,B.id) in

  (select m.eqid,regexp_substr(m.province_ids,'[^,]',1,level) ids from eqbasic m connect by level <= length(m.province_ids) - length(replace(m.province_ids,'1') ) +1 )

where A.eqtime = (select max(eqtime) from eqbasic)

  order by A.eqid

就是一个能执行,另一个报错!

使用道具 举报

回复
论坛徽章:
23
2014年世界杯参赛球队: 哥斯达黎加
日期:2014-06-06 15:02:04沸羊羊
日期:2015-06-17 14:51:07天枰座
日期:2015-07-17 09:51:12金牛座
日期:2016-03-21 21:10:40摩羯座
日期:2016-03-29 15:07:30娜美
日期:2016-06-22 19:49:29奥运会纪念徽章:篮球
日期:2016-09-02 09:45:25奥运会纪念徽章:现代五项
日期:2016-09-23 16:25:05布鲁克
日期:2017-03-21 09:35:18山治
日期:2018-01-04 21:26:16
发表于 2015-1-21 12:12 | 显示全部楼层
haojianjian404 发表于 2015-1-21 12:06
不是的,单单这部分SQL,两个库都能执行!但是完整的:
select A.*,B.* from eqbasic A

你这里唯一有计算的就这条语句,只能逐步分解,具体看看是哪里的问题咯。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表