Oracle 19c使用INSERT ALL批量插入时为何需加SELECT * FROM dual?
为什么Oracle INSERT ALL必须加SELECT * FROM dual
Oracle的INSERT ALL属于多表插入语句,这类语句的核心逻辑是基于一个查询的结果集,把数据插入到一个或多个目标表中——它本质是「查询驱动插入」的语法,必须依赖一个数据源来触发执行。
当你用INSERT ALL插入固定值的多条数据时,不需要从现有业务表取数据,这时候就需要一个能稳定返回1行数据的数据源:
- Oracle自带的
dual是虚拟表,它永远只返回1行数据,刚好满足需求。 - 加上
SELECT * FROM dual后,相当于告诉Oracle:基于这个1行的结果集,执行所有INTO子句里的插入操作,也就是把你写的4条记录一次性插入到students表中。
如果不加这个查询部分,Oracle的语法解析器会直接报错,因为多表插入语句要求必须有对应的查询数据源来驱动整个插入流程。其实你也可以换成其他返回1行的查询(比如SELECT 1 FROM dual),但SELECT * FROM dual是最通用的写法。
内容的提问来源于stack exchange,提问作者Abdellah karani
相关产品推荐
相关产品推荐

