我正在寻找一个好的方法来执行多行插入到Oracle 9数据库。以下内容在MySQL中可以工作,但在Oracle中似乎不受支持。
INSERT INTO TMP_DIM_EXCH_RT
(EXCH_WH_KEY,
EXCH_NAT_KEY,
EXCH_DATE, EXCH_RATE,
FROM_CURCY_CD,
TO_CURCY_CD,
EXCH_EFF_DATE,
EXCH_EFF_END_DATE,
EXCH_LAST_UPDATED_DATE)
VALUES
(1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
9条答案
按热度按时间iq0todco1#
在Oracle中,要将多行插入到表t中,列为col1、col2和col3,可以使用以下语法:
在Oracle 23c中,可以使用以下简化语法插入多行:
对于插入大量行,新语法比旧的
INSERT ALL
方法快得多,与UNION ALL
方法差不多快。但是,由于解析时间呈指数级增长,您仍然希望避免一次插入超过大约1000行。hgtggwj02#
在Oracle中工作:
这里要记住的是使用
from dual
语句。4jb9z9bj3#
使用SQL*Loader。这需要一点设置,但如果这不是一个一次性的,它的价值。
创建表
创建CSV文件
创建Loader控制文件
运行SQL*Loader命令
确认插入
SQL*Loader有很多选项,可以将几乎任何文本文件作为输入。如果需要,您甚至可以将数据内联到控制文件中。
这里是一个页面,有更多的细节-> SQL*Loader
km0tfn4u4#
每当我需要这样做时,我都会用一个本地过程构建一个简单的PL/SQL块,如下所示:
5us2dqdw5#
如果已经有要插入到另一个表中的值,则可以从select语句插入。
否则,您可以列出一堆单行插入语句,并批量提交几个查询,以保存在Oracle和MySQL中工作的时间。
@Espo的解决方案也是一个很好的解决方案,如果你的数据还没有在表中,它可以在Oracle和MySQL中工作。
3duebb1j6#
如果你想插入一些随机值,你可以使用循环插入。
llycmphe7#
也可以使用游标,尽管它是低效的。下面的stackoverflow文章讨论了游标的用法:
INSERT and UPDATE a record using cursors in oracle
x7yiwoj48#
以下是在Oracle中插入多行的非常有用的分步指南:
https://livesql.oracle.com/apex/livesql/file/content_BM1LJQ87M5CNIOKPOWPV6ZGR3.html
最后一步:
dddzy1tm9#
在我的例子中,我能够使用一个简单的insert语句,只使用TABLE_B中的一列将许多行批量插入TABLE_A,并从其他地方获取其他数据(序列和硬编码值):
结果:
等等