多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案

Posted

技术标签:

【中文标题】多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案【英文标题】:Multiple row insert: Best alternative for INSERT ALL statement working on Oracle 8i 【发布时间】:2015-12-20 11:52:48 【问题描述】:

下面显示的在 Oracle 8i 版本中可用的 INSERT ALL 语句的最佳和最推荐替代方案是什么?非常不幸的是,这个特定的语句在 8i 中不起作用,因为它的简单性和可读性。如果您能提供一些输入,那就太好了。谢谢。

插入所有语句

INSERT ALL
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;

此外,如果您的建议之一由于某些原因与下面显示的查询不同,那会更好。

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
      select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

非常感谢!

【问题讨论】:

为什么不简单地写三个insert 语句呢?如果包裹在事务中,那么复杂的 insert all 语法几乎没有任何区别,而且它也没有更多的类型。另外:你为什么使用一个已经失去支持超过十年的版本? 【参考方案1】:

如果您想将这些行作为一个事务插入,只需:

BEGIN 
  SAVEPOINT some_name;
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
EXCEPTION WHEN OTHERS THEN 
     ROLLBACK TO some_name;
     RAISE; -- reraise current error
END;
/

这模拟了INSERT ALL 的行为INSERT ALL 是单个命令,因此当发生某些错误时,此事务所做的所有更改都会回滚(请参阅语句级原子性 这里:http://docs.oracle.com/cd/E25054_01/server.1111/e25789/transact.htm)

【讨论】:

以上是关于多行插入:在 Oracle 8i 上工作的 INSERT ALL 语句的最佳替代方案的主要内容,如果未能解决你的问题,请参考以下文章

Atitit 索引技术--位图索引

在单个事务中插入多行时 Oracle 查询性能下降

插入上的 Oracle 变异触发器

查询在 Oracle 11g 上有效,但在 Oracle 8i 上失败

Oracle 11g - 插入多行的最有效方式

SQL Server 和 Oracle 兼容的多行插入?