2017-07-03 100 views
0

您好我一直被委托摆脱许多更新语句中的bypass_ujvc提示,因为它在Oracle 12c中不再受支持,所以我决定替换更新语句与合并声明,不幸的是其中一个更新语句有一个返回子句和一个批量收集,所以我不确定如何处理这个作为合并语句不使用返回子句。任何意见非常感谢。查询如下。在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第一个循环,但是这应该给一般的想法。