1

他の多くのテーブルと同じデータ構造を持つテーブルの名前を動的に知る必要があり、同じ構造の汎用連想配列を渡すことができます。ここに手順があります

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: バインド変数が存在しません

ここで何が欠けていますか?

したがって、次のように、insert ステートメントでテーブルに挿入するために必要なすべての列を指定する必要がありました。

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

2 に答える 2

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

この SQL Fiddleで上記のコードを実行できます。

于 2017-10-04T02:54:41.630 に答える