多行插入:在 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 语句的最佳替代方案的主要内容,如果未能解决你的问题,请参考以下文章