15.30 OPEN_REMOTE_DML_CONTEXTファンクション

このファンクションは、リモート・データベースに基づいてDMLコンテキストを開きます。

構文

function open_remote_dml_context (
    p_server_static_id      in varchar2,
    --
    p_columns               in t_columns               default c_empty_columns,
    p_query_type            in t_query_type,
    --     
    p_table_owner           in varchar2                default null,
    p_table_name            in varchar2                default null,
    p_where_clause          in varchar2                default null,  
    --
    p_sql_query             in varchar2                default null,
    p_plsql_function_body   in varchar2                default null,
    --
    p_with_check_option     in boolean                 default true,
    p_optimizer_hint        in varchar2                default null,
    --
    p_dml_table_owner       in varchar2                default null,
    p_dml_table_name        in varchar2                default null,
    p_dml_plsql_code        in varchar2                default null,
    --
    p_lost_update_detection in t_lost_update_detection default null,
    p_lock_rows             in t_lock_rows             default null,
    p_lock_plsql_code       in varchar2                default null,
    --
    p_sql_parameters        in t_parameters            default c_empty_parameters ) return t_context;

パラメータ

表15-28 OPEN_REMOTE_DML_CONTEXTファンクションのパラメータ

パラメータ 説明

p_server_static_id

ORDS REST対応SQLインスタンスの静的IDです。

p_columns

データ・ソースに渡すDML列。

p_query_type

データ・ソースに渡すDML列。データ・ソースのタイプを示します。使用可能な値は次のとおりです。
  • c_query_type_table: 単純な表をデータ・ソースとして使用します。
  • c_query_type_sql_query: SQL問合せをデータ・ソースとして使用します。
  • c_query_type_func_return_sql: PL/SQLファンクションによって返されたSQL問合せを使用します。

p_table_owner

問合せタイプTABLEの場合: 表の所有者

p_table_name

問合せタイプTABLEの場合: 表名

p_where_clause

問合せ型TABLEの場合: WHERE句

p_sql_query

問合せタイプSQL QUERYの場合: 問合せ

p_plsql_function_body

問合せタイプPLSQLの場合: SQL問合せを返すPL/SQLファンクション

p_with_check_option

WITH CHECK OPTIONをデータ・ソースに追加するかどうかを指定します。true (デフォルト)に設定した場合、挿入または更新される行はWHERE句に違反できません。

p_optimizer_hint

DML句に追加するオプティマイザ・ヒント

p_dml_table_owner

設定した場合、DML文がこの表に対して実行されます

p_dml_table_name

設定した場合、DML文がこの表に対して実行されます

p_dml_plsql_code

DML文のかわりに実行されるカスタムPL/SQLコード

p_lost_update_detection

ロストアップデートの検出タイプ。使用可能な値は次のとおりです。
  • c_lost_update_implicit: APEXは行の値からチェックサムを計算します。
  • c_lost_update_explicit: p_columnsのいずれかにis_checksum属性が設定されています
  • c_lost_update_none: ロストアップデートを検出しません

p_lock_rows

ロストアップデート検出から実際のDML文までの(短い)時間に行をロックするかどうかを指定します。使用可能な値は次のとおりです。
  • c_lock_rows_automatic: SELECTを使用します。FOR UPDATE
  • c_lock_rows_plsql: カスタムPL/SQLコードを使用して行をロックします
  • c_lock_rows_none: 行をロックしません

p_dml_plsql_code

行のロックに使用するカスタムPL/SQLコード

p_sql_parameters

使用するバインド変数

次の例は、REST対応SQLサービスのEMP表に1つの行を挿入しています。

declare
    l_columns        apex_exec.t_columns;
    l_context        apex_exec.t_context;
begin
    -- I. Define DML columns
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'EMPNO',
       p_data_type      => apex_exec.c_data_type_number,
       p_is_primary_key => true );
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'ENAME',
       p_data_type      => apex_exec.c_data_type_varchar2 );
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'JOB',
       p_data_type      => apex_exec.c_data_type_varchar2 );
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'HIREDATE',
       p_data_type      => apex_exec.c_data_type_date );
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'MGR',
       p_data_type      => apex_exec.c_data_type_number );
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'SAL',
       p_data_type      => apex_exec.c_data_type_number );
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'COMM',
       p_data_type      => apex_exec.c_data_type_number );
    apex_exec.add_column(
       p_columns        => l_columns,
       p_column_name    => 'DEPTNO',
       p_data_type      => apex_exec.c_data_type_number );
    
    -- II. Open the context object
    l_context := apex_exec.open_remote_dml_context(
       p_server_static_id      => '{remote server static id}',
       p_columns               => l_columns,
       p_query_type            => apex_exec.c_query_type_sql_query,
       p_sql_query             => 'select * from emp where deptno = 10',
       p_lost_update_detection => apex_exec.c_lost_update_none );
    
    -- III. Provide DML data
        
    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_position => 1,
       p_value           => 4711 );
    apex_exec.set_value(
       p_context         => l_context,
       p_column_position => 2,
       p_value           => 'DOE' );
    apex_exec.set_value(
       p_context         => l_context,
       p_column_position => 3,
       p_value           => 'DEVELOPR' );
    apex_exec.set_value(
       p_context         => l_context,
       p_column_position => 4,
       p_value           => sysdate );
    apex_exec.set_value(
       p_column_position => 6,
       p_value           => 1000 );
    apex_exec.set_value(
       p_context         => l_context,
       p_column_position => 8,
       p_value           => 10 );
    
    -- IV: 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;

戻り値

DMLハンドルを表すコンテキスト・オブジェクト。