2017-07-03 26 views
0

こんにちは、Oracle 12cではサポートされていないため、いくつかの更新文からbypass_ujvcヒントを取り除くことを任されました。マージステートメントでは不都合なことに、これらの更新ステートメントの1つに返す節とバルクコレクトがあるため、マージステートメントが返される節を使用しないため、これにどのようにアプローチするのかは分かりません。どんなアドバイスも大歓迎です。クエリは以下のとおりです。12cでバイナリを変換する際のbypass_ujvcヒントをマージ文に変換する

UPDATE /*+ bypass_ujvc */ (SELECT caco.surr_id, 
             caco.lead_item_yn, 
             caco.case_reference, 
             caco.logically_deleted_y 
           FROM TABLE (CAST(l_cc_surr_id AS db_surr_id_type_tab)) cc 
           JOIN case_contexts caco ON (caco.cc_surr_id = cc.COLUMN_VALUE) 
           JOIN cases cas ON (cas.REFERENCE = caco.case_reference) 
           WHERE caco.logically_deleted_y IS NULL 
           AND cas.status IN ('INP', 'TOS')) 
    SET logically_deleted_y = 'Y' 
    RETURNING   surr_id, lead_item_yn, case_reference 
    BULK COLLECT INTO l_caco_surr_id, l_lead_item, l_all_cases; 
+0

あなたは 'forall'アプローチを見ることができます。後で時間がかかるなら、私は例をまとめます。 –

+0

ウィリアムさん、ありがとうございました –

答えて

0

bulk collectforallを使用してのアプローチは次のようになります。

begin 
    select caco.surr_id, caco.lead_item_yn, caco.case_reference 
    bulk collect into l_caco_surr_id, l_lead_item, l_all_cases 
    from table(l_cc_surr_id) cc 
      join case_contexts caco on caco.cc_surr_id = cc.column_value 
      join cases cas on cas.reference = caco.case_reference 
    where caco.logically_deleted_y is null 
    and cas.status in ('INP', 'TOS'); 

    forall i in 1..l_caco_surr_id.count 
     update case_contexts 
     set logically_deleted_y = 'Y' 
     where surr_id = l_caco_surr_id(i); 
end; 

あなたはlimit句でループしているを置きたいかもしれませんが、これは一般的なアイデアを与える必要があります。

関連する問題