27.5 ADD_DML_ARRAY_ROWプロシージャ

このプロシージャは、現在の配列の子行またはp_column_nameとして指定された配列列を追加します。カーソルは指定された配列列内の新しい行に移動し、SET_VALUEへの後続のすべてのコールは、この新しい配列要素の属性をターゲットとします。RESTデータ・ソースのDMLコンテキスト内でのみサポートされます。

階層構造は現在、RESTソース・タイプまたはプラグインがそのような構造を処理できる場合、RESTデータ・ソースでのDMLでのみサポートされています。ローカル表またはREST対応SQLに基づくDMLでは、配列列は無視されます。

指定された配列列は、現在の配列列の直接の子である必要があります。パス構文および階層内の別の位置へのジャンプはサポートされていません。

構文

APEX_EXEC.ADD_DML_ARRAY_ROW (
    p_context               IN t_context,
    p_column_name           IN VARCHAR2        DEFAULT NULL,
    p_column_position       IN PLS_INTEGER,
    p_operation             IN t_dml_operation DEFAULT NULL )

パラメータ

パラメータ 説明
p_context OPEN ファンクションのいずれかを使用して取得したコンテキスト・オブジェクト。
p_column_name 新しい行を追加する配列列の名前(現在のコンテキスト内に存在する必要があります)。
p_column_position DMLコンテキスト内の値を設定する列の位置。
p_operation この行で実行されるDML操作。定数c_dml_operation_*を使用します。省略すると、子行は親から操作を継承します。

declare
    l_columns apex_exec.t_columns;
    l_context apex_exec.t_context;

begin

    --
    -- I. Define DML columns    
    --
    -- 1. row-level columns
    --
    apex_exec.add_column( 
        p_columns      => l_columns,
        p_column_name  => 'CUSTOMER_NAME',
        p_data_type    => apex_exec.c_data_type_varchar2 );

    apex_exec.add_column( 
        p_columns      => l_columns,
        p_column_name  => 'ORDER_DATE',
        p_data_type    => apex_exec.c_data_type_date );

    apex_exec.add_column( 
        p_columns      => l_columns,
        p_column_name  => 'ORDER_ITEMS',
        p_data_type    => apex_exec.c_data_type_array );

    --
    -- 2. child columns of the ORDER_ITEMS array column
    --
    apex_exec.add_column( 
        p_columns            => l_columns,
        p_column_name        => 'PRODUCT_ID',
        p_data_type          => apex_exec.c_data_type_number,
        p_parent_column_path => 'ORDER_ITEMS' );

    apex_exec.add_column( 
        p_columns            => l_columns,
        p_column_name        => 'PRODUCT_NAME',
        p_data_type          => apex_exec.c_data_type_varchar2,
        p_parent_column_path => 'ORDER_ITEMS' );

    apex_exec.add_column( 
        p_columns            => l_columns,
        p_column_name        => 'UNIT_PRICE',
        p_data_type          => apex_exec.c_data_type_number,
        p_parent_column_path => 'ORDER_ITEMS' );

    apex_exec.add_column( 
        p_columns            => l_columns,
        p_column_name        => 'AMOUNT_ORDERED',
        p_data_type          => apex_exec.c_data_type_number,
        p_parent_column_path => 'ORDER_ITEMS' );

    --
    -- II. Open the context object    
    --
    l_context := apex_exec.open_rest_source_dml_context(
                     p_columns    => l_columns,
                     p_static_id  => '{module static id}' );

    --
    -- III: Provide DML data
    -- 
    -- 1. the first row
    --
    apex_exec.add_dml_row(
        p_context   => l_context,
        p_operation => apex_exec.c_dml_operation_insert );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'CUSTOMER_NAME',
        p_value        => 'John Doe' );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'ORDER_DATE',
        p_value        => date'2024-03-15' );

    -- 
    -- 1.1. the first line item of the first row
    --
    apex_exec.add_dml_array_row(
        p_context      => l_context,
        p_operation    => apex_exec.c_dml_operation_insert,
        p_column_name  => 'ORDER_ITEMS');

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'PRODUCT_ID',
        p_value        => 100 );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'PRODUCT_NAME',
        p_value        => 'Men''s Jeans size L' );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'UNIT_PRICE',
        p_value        => 30.99 );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'AMOUNT_ORDERED',
        p_value        => 10 );

    --
    -- 1.2. the second line item of the first row
    --
    apex_exec.add_dml_array_row(
        p_context      => l_context );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'PRODUCT_ID',
        p_value        => 101 );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'PRODUCT_NAME',
        p_value        => 'Ladies Jeans size S' );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'UNIT_PRICE',
        p_value        => 30.99 );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'AMOUNT_ORDERED',
        p_value        => 10 );

    -- 
    -- 2. the second row
    --
    apex_exec.add_dml_row(
        p_context   => l_context,
        p_operation => apex_exec.c_dml_operation_insert );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'CUSTOMER_NAME',
        p_value        => 'Jane Doe' );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'ORDER_DATE',
        p_value        => date'2024-03-16' );

    -- 
    -- 2.1. the first line item of the second row
    --
    apex_exec.add_dml_array_row(
        p_context      => l_context,
        p_operation    => apex_exec.c_dml_operation_insert,
        p_column_name  => 'ORDER_ITEMS');

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'PRODUCT_ID',
        p_value        => 100 );

    -- :

    apex_exec.add_dml_array_row(
        p_context      => l_context,
        p_operation    => apex_exec.c_dml_operation_insert );

    -- :

    -- IV: Set "cursor" back to the first child in order to change a value

    apex_exec.set_array_current_row(
        p_context         => l_context,
        p_current_row_idx => 1 );

    apex_exec.set_value(
        p_context      => l_context,
        p_column_name  => 'AMOUNT_ORDERED',
        p_value        => 20 );

    -- V: Execute the DML statement

    apex_exec.execute_dml(
        p_context           => l_context,
        p_continue_on_error => false);

    apex_exec.close( l_context );
exception
    when others then
        apex_exec.close( l_context );
        raise;
end;