ORA-00933 SQL命令未正确结束 INSERT INTO ... SELECT
最近在修改数据库存储过程时,出现了一个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 BY或INNER JOIN子句的INSERT语句 - 使用了含有
ORDER BY或INNER 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分别被命名为b和f做了关联),
但是这并没有关系,关键是这个自连接的条件里面不能有涉及自连接表的字段进行比较,
(上例中的b.QLRID = f.QLRID就不符合这一点,所以执行失败,尝试了一下移除这个条件,
便可以执行了)
总结
会造成ORA-00933的原因分为三种:
- 使用了含有
ORDER BY或INNER JOIN子句的INSERT、DELETE语句 - 使用了含有
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
ORA-00933 SQL命令未正确结束 INSERT INTO ... SELECT的更多相关文章
- 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束
Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...
- MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束
最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...
- Oracle.EntityFrameworkCore使用时报错:ORA-00933:SQL命令未正确结束
如果你在使用 Oracle.EntityFrameworkCore 在执行一些分页查询或者其他数据操作时,遇到“ORA-00933:SQL命令未正确结束”, 请先检查你的DbContext中UseOr ...
- JAVA 拼接了一个sql 语句,但是最后运行报错——SQL 命令未正确结束
错误原因: 拼接的时候因为引号里的部分是直接引起来的,所以将这些语句整个拼接起来的时候就会成为一个“没有断句”的sql语句,如下面我的错误 将整句话拼接起来就相当于 select * from B ...
- ORACLE ORA-00933: SQL 命令未正确结束,
这个错误害我花了一天时间排查,最后原来是因为结束符,这种语句不能是分号,将分号即可执行成功. MERGE INTO MO_TRADE_COUNT_DAY A USING ( SELECT MAX(fl ...
- mybatis+oracle批量插入报不符合协议和sql未正确结束
在Java中循环save,需要加useGeneratedKeys="false",否则报错不符合协议 mybatis批量插入,也需要在insert里加入 useGeneratedK ...
- sql: sybase与oracle中insert into select和select into的用法
1. sybase与oracle中insert into select和select into的用法 http://wjlvivid.iteye.com/blog/1921679 Sybase 一.首 ...
- 关于mybatis的 insert into select 命令未结束问题
关于mybatis的 insert into select 命令未结束问题,最后以为是sql写错了,可是,在plsql运行又没问题.最后还是解决这个问题. 是设置问题. ### Cause: java ...
- SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】
今天运行壹個小程序,功能是读取指定目录下的 SQL 脚本,并加载到内存中批量执行,之前的程序运行良好.但是今天相关开发人员更新了其中壹個 SQL 脚本,于是程序运行的时候就出错了,错误提示信息如下:批 ...
随机推荐
- C指针(3)——指向指针的指针(程序讲解)
int **q可以分成两部分,即int* 和 (*q),后面的 “q” 中的* 表示q是一个指针变量,前面的int*表示指针变量q只能存放int*型变量的地址.int** q表示为指针变量q只能存放i ...
- bedtools-Documentation
https://media.readthedocs.org/pdf/bedtools/latest/bedtools.pdf
- MVC保存二进制到数据库,并显示文件的方法(图片显示)
通过两篇文章解决了数据库存储图片并显示到View的方法: http://blog.sina.com.cn/s/blog_6da396a50101639u.htmlhttp://www.cnblogs. ...
- 【BZOJ1176】[BOI2007]Mokia 摩基亚
[BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...
- JavaScript事件及BOM和DOM
1. 事件 1.1 事件绑定 # 写在html元素中<button onclick="code..."></div># 把事件当做元素对象的方法btnEl ...
- java中的比较:instanceof、equals(hashcode)、==
import javassist.expr.Instanceof; class Person{ String s; Person(String s){ this.s=s; } } class Man ...
- pycharm 3.4 亲测可使用到2019年2月的注册码,要用者从速
注册码: D87IQPUU3Q-eyJsaWNlbnNlSWQiOiJEODdJUVBVVTNRIiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1l ...
- python学习笔记03 --------------程序交互与格式化输出
1.读取用户输入内容 语法:input() 例: name = input('你的名字是?) print('你好'+name) 程序会等待用户输入名字后打印:你好(用户输入的名字) 注意:input接 ...
- JS变量定义时连续赋值的坑!
在定义变量时,可以将值相同的变量采用连续赋值的方式,如下代码: var a = b = c = ''; 其实这里面有一个很大很大的坑,以代码说明问题: <script language=&quo ...
- 两种缓存淘汰算法LFU&LRU
LRU全称是Least Recently Used,即最近最久未使用的意思. LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...