最近在修改数据库存储过程时,出现了一个ORA-00933错误,

执行的是 INSERT INTO...SELECT 语句,具体语句如下:

INSERT INTO BASP_DX.QLR@GT(BDCDYH, QSZT)
SELECT NVL(e.BDCDYH, ' '), b.LIFECYCLE AS QSZT
FROM DJ_DY as
LEFT JOIN DJ_XGDJGL d
ON d.ZSLBH = a.SLBH
LEFT JOIN DJ_DJB e
ON e.SLBH = d.FSLBH
AND e.SLBH = '0123456789'
LEFT JOIN DJ_QLRGL f
ON f.SLBH = e.SLBH
AND f.QLRLX = '权利人'
LEFT JOIN DJ_QLRGL b
ON b.SLBH = a.SLBH
AND (b.QLRLX = '抵押权人' OR (b.QLRLX = '抵押人' AND b.QLRID = f.QLRID))
WHERE a.SLBH = '20170318'
AND e.SLBH IS NOT NULL
AND b.QLRID IS NOT NULL
AND (a.LIFECYCLE = '0' OR a.LIFECYCLE IS NULL);

没毛病啊!!!谷狗上得来一篇文章

说造成ORA-00933的可能原因有:

  • 使用了含有ORDER BYINNER JOIN子句的INSERT语句
  • 使用了含有ORDER BYINNER JOIN子句的DELETE语句
  • 使用了含有INNER JOIN子句的UPDATE语句

然鹅,我的语句都没有啊!!!但是这给了我灵感,

会不会是JOIN后面的条件太多了被当成INNER JOIN

(没错,就是瞎猜的,脑洞大没办法~~~)

于是乎,我就傻里傻气的开始注释LEFT JOIN后的条件,

当我注释掉AND (b.QLRLX = '抵押权人' OR (b.QLRLX = '抵押人' AND b.QLRID = f.QLRID))

时,奇迹发生了,不报错了(当然,一下子插入了几千条,吓得小生鼠标都掉了),

接着,我将条件放到WHERE语句后面,成了如下形式:

INSERT INTO BASP_DX.QLR@GT(BDCDYH, QSZT)
SELECT NVL(e.BDCDYH, ' '), b.LIFECYCLE AS QSZT
FROM DJ_DY as
LEFT JOIN DJ_XGDJGL d
ON d.ZSLBH = a.SLBH
LEFT JOIN DJ_DJB e
ON e.SLBH = d.FSLBH
AND e.SLBH = '0123456789'
LEFT JOIN DJ_QLRGL f
ON f.SLBH = e.SLBH
AND f.QLRLX = '权利人'
LEFT JOIN DJ_QLRGL b
ON b.SLBH = a.
-- 条件原来在这里
WHERE a.SLBH = '20170318'
AND e.SLBH IS NOT NULL
-- LEFT JOIN后的条件移动到了这里
AND (b.QLRLX = '抵押权人' OR (b.QLRLX = '抵押人' AND b.QLRID = f.QLRID))
AND (a.LIFECYCLE = '0' OR a.LIFECYCLE IS NULL);

这样便可以运行成功,但是...这是为什么啊!!!Tell me Why???

最后小生想到了我大StackOverFlow,赶快上去提了个问题

经高人点拨,是一种叫做Triangular Join的东西导致的,

大致就是说语句里面有自连接(如上例中的DJ_XGDJGL分别被命名为bf做了关联),

但是这并没有关系,关键是这个自连接的条件里面不能有涉及自连接表的字段进行比较

(上例中的b.QLRID = f.QLRID就不符合这一点,所以执行失败,尝试了一下移除这个条件,

便可以执行了)

总结

会造成ORA-00933的原因分为三种:

  • 使用了含有ORDER BYINNER JOIN子句的INSERTDELETE语句
  • 使用了含有INNER JOIN子句的UPDATE语句
  • 使用了条件中含有自连接表字段比较的Triangular Join

参考链接:

http://www.databasestar.com/ora-00933/

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:4549764300346084350

http://stackoverflow.com/questions/42870062/ora-00933-sql-command-not-properly-ended-with-insert-into-select-statement

ORA-00933 SQL命令未正确结束 INSERT INTO ... SELECT的更多相关文章

  1. 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...

  2. MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束

    最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...

  3. Oracle.EntityFrameworkCore使用时报错:ORA-00933:SQL命令未正确结束

    如果你在使用 Oracle.EntityFrameworkCore 在执行一些分页查询或者其他数据操作时,遇到“ORA-00933:SQL命令未正确结束”, 请先检查你的DbContext中UseOr ...

  4. JAVA 拼接了一个sql 语句,但是最后运行报错——SQL 命令未正确结束

    错误原因: 拼接的时候因为引号里的部分是直接引起来的,所以将这些语句整个拼接起来的时候就会成为一个“没有断句”的sql语句,如下面我的错误 将整句话拼接起来就相当于   select * from B ...

  5. ORACLE ORA-00933: SQL 命令未正确结束,

    这个错误害我花了一天时间排查,最后原来是因为结束符,这种语句不能是分号,将分号即可执行成功. MERGE INTO MO_TRADE_COUNT_DAY A USING ( SELECT MAX(fl ...

  6. mybatis+oracle批量插入报不符合协议和sql未正确结束

    在Java中循环save,需要加useGeneratedKeys="false",否则报错不符合协议 mybatis批量插入,也需要在insert里加入 useGeneratedK ...

  7. sql: sybase与oracle中insert into select和select into的用法

    1. sybase与oracle中insert into select和select into的用法 http://wjlvivid.iteye.com/blog/1921679 Sybase 一.首 ...

  8. 关于mybatis的 insert into select 命令未结束问题

    关于mybatis的 insert into select 命令未结束问题,最后以为是sql写错了,可是,在plsql运行又没问题.最后还是解决这个问题. 是设置问题. ### Cause: java ...

  9. SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】

    今天运行壹個小程序,功能是读取指定目录下的 SQL 脚本,并加载到内存中批量执行,之前的程序运行良好.但是今天相关开发人员更新了其中壹個 SQL 脚本,于是程序运行的时候就出错了,错误提示信息如下:批 ...

随机推荐

  1. 笔记-sql语句

    笔记-sql语句 1.      sql语句基础 虽然经常使用sql语句,但没有一个整体式的文档,整理了一下. 1.1.    select foundation: select <colnum ...

  2. [WebService] 使用httpWebrequest 调用并调试WebService

    使用httpWebrequest 调用并调试WebService. 首先  使用httpWebrequest 调用WebService 代码: using System.Net;            ...

  3. 成都Uber优步司机奖励政策(1月26日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. 上海Uber优步司机奖励政策(1月11日~1月17日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. Ubuntu 18启动失败 Started Hold until boot procss finishes up

    原因: 启动ubuntu 的时候,磁盘空间不够了. 解决方法: 启动Ubuntu 的时候,选择Advanced options for Ubuntu 然后选择recovery 之后选择clean 清理 ...

  6. 笔记本ubuntu安装wifi驱动(未完成)

    1. 用联想E440,Ubuntu14.04,安装完之后,没有检查到wifi的驱动,所以需要安装.

  7. 关于iOS和Android的安装包更新笔记

    关于iOS和Android的安装包更新问题 1. Android更新apk 1)使用DownloadManager下载 2)使用HttpClient下载 apk的下载不能使用ssl,即不能使用http ...

  8. MyBatis-SpringMVC整合

    1.添加spring相关jar包 2.配置ehcache jar包. 3.添加ehcache mybatis 适配器jar包(在mybatis官网) 4.添加spring mybatis 适配器jar ...

  9. 你的APK安全吗?来WeTest免费测!

    腾讯安全联合实验室就曾在<2018上半年互联网黑产研究报告>指出,移动端黑产规模宏大,恶意推广日均影响用户超过千万. 尤其在网络强相关的APP流行年代,当APP应用客户端上传与获取信息,大 ...

  10. java 前后端 日期转换

    1.前传后 @DateTimeFormat(pattern="yyyy-MM-dd") private Date payTime; 2.后传前 @JsonFormat(patter ...