【问题标题】:Trying to use a FORALL to insert data dynamically to a table specified to the procedure尝试使用 FORALL 将数据动态插入到过程指定的表中
【发布时间】:2018-03-14 20:37:36
【问题描述】:

我需要动态知道与许多其他表具有相同数据结构的表的名称,并且我可以传入具有相同结构的通用关联数组。这是过程

PROCEDURE INSRT_INTER_TBL(P_TABLE_NAME IN VARCHAR2, P_DATA IN tt_type)

IS

BEGIN
    FORALL i IN P_DATA.FIRST .. P_DATA.LAST
        EXECUTE IMMEDIATE
          'INSERT INTO ' || P_TABLE_NAME ||
          ' VALUES  :1'
        USING P_DATA(i);
END INSRT_INTER_TBL;

我收到以下错误

ORA-01006: 绑定变量不存在

我在这里错过了什么?

所以我必须在插入语句中指定插入表所需的所有列,例如:

PROCEDURE INSRT_INTER_TBL(P_TABLE_NAME IN VARCHAR2, P_DATA IN inter_invc_ln_item_type)

IS

BEGIN
    FORALL i IN P_DATA.FIRST .. P_DATA.LAST
        EXECUTE IMMEDIATE
          'INSERT INTO ' || P_TABLE_NAME || ' (ITEM_PK, pk, units, amt) ' ||
          ' VALUES  (:P_INVC_LN_ITEM_PK, :PK, :UNITS, :AMT)'
        USING IN P_DATA(i).item_pk, P_DATA(i).pk, P_DATA(i).units, P_DATA(i).amt;
END INSRT_INTER_TBL;

【问题讨论】:

    标签: oracle associative-array dynamic-sql execute-immediate forall


    【解决方案1】:

    试试VALUES (:1),即在:1周围加括号

    【讨论】:

    • 试过了,但没有运气,但这确实带来了一个好点。这个 AA 有 5ish 列,我需要指定值中的所有列吗? IE 指定所有列名和所有值?该表在所有关联表中是唯一的,除了 1 列,我通过创建一个新类型来解决这个问题:这对于作为 FK、pk 值的那一列是通用的,所以它不像 clm_pk,它只是我的 pk记录类型
    • 如果表中的列不只是列,那么,是的,除非您指定要插入的列,否则它将不起作用:insert into table1 (col1) values (:1) 或您对所有列所做的操作
    【解决方案2】:

    TABLE 操作符比FORALL 更有效。它使用的代码更少,并且可能会跳过一些 SQL 到 PL/SQL 的上下文切换。

    --Simple record and table type.
    create or replace type tt_rec is object
    (
        a number,
        b number
    );
    
    create or replace type tt_type is table of tt_rec;
    
    --Sample schema that will hold results.
    create table test1(a number, b number);
    
    --PL/SQL block that inserts TT_TYPE into a table.
    declare
        p_table_name varchar2(100) := 'test1';
        p_data             tt_type := tt_type(tt_rec(1,1), tt_rec(2,2));
    begin
        execute immediate
        '
            insert into '||p_table_name||'
            select * from table(:p_data)
        '
        using p_data;
        commit;
    end;
    /
    

    你可以在this SQL Fiddle运行上面的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2011-07-08
      相关资源
      最近更新 更多