PL/SQL 批量插入到具有未知结构的 table

PL/SQL bulk INSERT into a table with an unknown structure

您能否将 FORALL 批量插入到具有未知结构的 table 中?这意味着,您能否在编译时不知道字段数的情况下在 FORALL 构造中动态构建 INSERT 命令?

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

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);

编辑: 你甚至读了问题还是只读了标题中的几个字?链接的问题询问如何绑定变量,这个问题询问如何批量发布动态语句。是的,两个问题中都有'insert'和'table'两个词。

不,您不能动态构建和执行 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)

或者,如果您要插入 table 的数据位于另一个 table 中,您可能会发现 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 谓词中的匹配条件进行批量插入。

所以可能有一些方法可以做你想做的事,但不知道你的数据来源的具体细节以及你在将数据插入数据库之前如何操作这些数据,很难说是否有任何他们会申请。

祝你好运。