首页 > 解决方案 > PL/SQL 批量插入到具有未知结构的表中

问题描述

您可以向具有未知结构的表发出 FORALL 批量 INSERT 吗?这意味着,您可以在 FORALL 构造中动态构建 INSERT 命令而不知道编译时的字段数吗?

字段的数量和名称在运行时检索并存储在集合中:

TYPE RowType is TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(50);
TYPE TableType is TABLE OF RowType;
my_table TableType;

所以在运行时 my_table 可以这样填充,例如:

my_table(1)('FIELD1') = 'VALUE1A';
my_table(1)('FIELD2') = 'VALUE2A';
my_table(1)('FIELD3') = 'VALUE3A';
my_table(2)('FIELD1') = 'VALUE1B';
my_table(2)('FIELD2') = 'VALUE2B';
my_table(2)('FIELD3') = 'VALUE3B';
my_table(3)('FIELD1') = 'VALUE1C';
my_table(3)('FIELD2') = 'VALUE2C';
my_table(3)('FIELD3') = 'VALUE3C';

因此,应该批量执行的插入语句是:

INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1A,VALUE2A,VALUE3A);
INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1B,VALUE2B,VALUE3B);
INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1C,VALUE2C,VALUE3C);

编辑:您甚至阅读问题还是仅阅读标题中的几个单词?链接的问题询问如何绑定变量,此问题询问如何批量发布动态语句。是的,两个问题中都有“插入”和“表格”这两个词。

标签: sqloracleplsqlbulkinsert

解决方案


不,您不能动态构建和动态执行FORALL...INSERT...语句。但是,您可以动态构建以下形式的 INSERT 语句:

INSERT ALL
  INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1A,VALUE2A,VALUE3A)
  INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1B,VALUE2B,VALUE3B)
  INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1C,VALUE2C,VALUE3C)

或者,如果您要插入表中的数据位于另一个表中,您可能会发现如下INSERT...(subquery)语句

INSERT INTO TABLENAME
  SELECT FIELD1, FIELD2, FIELD3
    FROM OTHER_TABLE
    WHERE something <> something_else

或者您可以使用类似于的 MERGE 语句

MERGE INTO TABLENAME t
  USING (SELECT FIELD1, FIELD2, FIELD3 FROM OTHER_TABLE) o
    ON (t.FIELD1 = o.FIELD1)
  WHEN NOT FOUND THEN
    INSERT (FIELD1, FIELD2, FIELD3) VALUES (o.FIELD1, o.FIELD2, o.FIELD3)

它将根据子句中指定的数据和谓词USING中的匹配条件进行批量插入。ON

因此,可能有一些方法可以做你想做的事情,但在不知道数据源的细节以及在将数据插入数据库之前如何操作数据的情况下,很难说它们中的任何一个是否适用。

祝你好运。


推荐阅读