18.4.8.11 ネストしたコレクションがあるビジネス・オブジェクトの書込み
APEX_EXEC
パッケージを使用して、プログラムで、親オブジェクトとそのネストした子オブジェクトを1つのペイロードで書き込みます。
ヒント:
作成、更新および削除のユースケースすべてが想定どおりの動作になるようにするには、トップレベルのRESTデータ・ソースを構成して「バルクDMLの使用」を「はい」に設定する必要があります。次の例を検討してください:
function quick_create_order_exec(
p_customer_id in number,
p_product_id1 in number,
p_quantity1 in number,
p_product_id2 in number,
p_quantity2 in number)
return number
is
l_ctx apex_exec.t_context;
l_order_id number;
begin
l_ctx := apex_exec.open_rest_source_dml_context(
p_static_id => 'orders_with_details',
p_columns => get_order_create_columns,
p_lost_update_detection => apex_exec.c_lost_update_none);
apex_exec.add_dml_row(l_ctx, apex_exec.c_dml_operation_insert);
apex_exec.set_value(l_ctx, 'CUSTOMERID', p_customer_id);
-- Set the context to the ORDERLINES array
-- and add the first row in the array
apex_exec.add_dml_array_row(l_ctx, 'ORDERLINES');
apex_exec.set_value(l_ctx, 'ORDERLINES_PRODUCTID', p_product_id1);
apex_exec.set_value(l_ctx, 'ORDERLINES_QUANTITY', p_quantity1);
if p_quantity2 is not null
and p_product_id2 is not null
then
-- ORDERLINES array is already current. Add another row to array
apex_exec.add_dml_array_row(l_ctx);
apex_exec.set_value(l_ctx, 'ORDERLINES_PRODUCTID', p_product_id2);
apex_exec.set_value(l_ctx, 'ORDERLINES_QUANTITY', p_quantity2);
end if;
-- Do the DML operation
apex_exec.execute_dml(l_ctx);
-- Retrieve system-assigned order number & return it
apex_exec.set_current_row(l_ctx,1);
l_order_id := apex_exec.get_varchar2(l_ctx,'APEX$RESOURCEKEY');
apex_exec.close(l_ctx);
return l_order_id;
end quick_create_order_exec;
前述のコード例では、get_order_create_columns()
を参照しています。次の例では、そのDML操作に関与する列を定義するapex_exec.t_column
レコードのapex_exec.t_columns
表が返されます。
function get_order_create_columns
return apex_exec.t_columns
is
l_columns apex_exec.t_columns;
begin
apex_exec.add_column( /* APEX$ResourceKey */
p_columns => l_columns,
p_column_name => 'APEX$RESOURCEKEY',
p_data_type => apex_exec.c_data_type_varchar2,
p_is_primary_key => true);
apex_exec.add_column( /* customerId */
p_columns => l_columns,
p_column_name => 'CUSTOMERID',
p_data_type => apex_exec.c_data_type_number);
apex_exec.add_column( /* orderLines.items */
p_columns => l_columns,
p_column_name => 'ORDERLINES',
p_data_type => apex_exec.c_data_type_array);
apex_exec.add_column( /* orderLines.productId */
p_columns => l_columns,
p_column_name => 'ORDERLINES_PRODUCTID',
p_data_type => apex_exec.c_data_type_number,
p_parent_column_path => '"ORDERLINES"');
apex_exec.add_column( /* orderLines.quantity */
p_columns => l_columns,
p_column_name => 'ORDERLINES_QUANTITY',
p_data_type => apex_exec.c_data_type_number,
p_parent_column_path => '"ORDERLINES"');
return l_columns;
end get_order_create_columns;