【问题标题】:PL/SQL bulk INSERT into a table with an unknown structurePL/SQL 批量插入到具有未知结构的表中
【发布时间】:2018-12-01 15:26:13
【问题描述】:

您可以向具有未知结构的表发出 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);

编辑:您是否阅读了这些问题,或者您只是阅读了标题中的几个字?链接的问题询问如何绑定变量,此问题询问如何批量发布动态语句。是的,两个问题中都有“插入”和“表格”这两个词。

【问题讨论】:

标签: sql oracle plsql bulkinsert


【解决方案1】:

不,您不能动态构建和动态执行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 谓词中的匹配条件进行批量插入。

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

祝你好运。

【讨论】:

  • INSERT ALL 会导致 PL/SQL 引擎和 SQL 引擎之间进行一次切换还是每行一次切换?
  • INSERT ALL 是一个单独的 SQL 语句,它会完整地传递给 SQL 引擎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多