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;
親トピック: APEX_EXEC