代码之家  ›  专栏  ›  技术社区  ›  Luke

PL/SQL大容量插入到具有未知结构的表中

  •  1
  • Luke  · 技术社区  · 6 年前

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

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

    因此,在运行时,我的_表可以这样填充,例如:

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

    编辑: 你读过这些问题吗,还是只读了标题中的几个词?链接问题询问如何绑定变量,该问题询问如何批量发布动态语句。是的,两个问题中都有“插入”和“表格”两个词。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bob Jarvis - Reinstate Monica    6 年前

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

    因此,可能有一些方法可以满足您的需要,但在将数据插入数据库之前,如果不知道数据源的具体情况以及如何处理这些数据,很难说这些方法是否适用。

    祝你好运。