ORACLE merge 更新链接列解决方案

oracle merge的确是个很好的命令,用一条命令就可以解决不少的逻辑关系,但是如果碰到需要更新目标表的连接列的时候,问题就出现了

Merge Into Srv_Instance Si
        Using (Select Array_Circuit(i).Circuit_Id Circuit_Id From Dual) o
        On (Si.Route_Id = o.Circuit_Id)
        When Matched Then
          Update Set Si.Route_Id = v_Pw_Id Where Si.Delete_State = '0'
        When Not Matched Then
          Insert(
 Inst_Id,Dis_Seq,Prod_Inst_Id,Srv_Id,Route_Id,
             Route_Type,Order_Seq,Opr_State_Id,Delete_State,
             Order_Layer,Act_Type,Old_Sp,Modify_Op,Modiry_Date)
          Values(
 Lpad(Seq_Srv_Instance_Inst_Id.Nextval, 24, '0'),
            To_Char(Systimestamp, 'missff') ||Seq_Srv_Instance_Inst_Id.Nextval,
            Trim('RefreshId' || To_Char(Systimestamp, 'YYMMDDhh24missff') ||
                  Lpad(Dbms_Random.Value(0, 1000), 5, '0')),
            '1010',
            v_Pw_Id,
            '1048',
            0,
            170003,
            0,
            0,
            '101',
            Gv_Old_Sp,
            '1',
            Sysdate);

如果执行这个代码的话就要报ora-38104错误了,我是这样解决的问题的,具体看代码

Update Srv_Instance Si
   Set Si.Route_Id = v_Pw_Id
 Where Si.Route_Id = Array_Circuit(i).Circuit_Id;


If (Sql%Rowcount = 0) Then
  Insert Into Srv_Instance
    (Inst_Id,
     Dis_Seq,
     Prod_Inst_Id,
     Srv_Id,
     Route_Id,
     Route_Type,
     Order_Seq,
     Opr_State_Id,
     Delete_State,
     Order_Layer,
     Act_Type,
     Old_Sp,
     Modify_Op,
     Modiry_Date)
  Values
    (Lpad(Seq_Srv_Instance_Inst_Id.Nextval, 24, '0'),
     To_Char(Systimestamp, 'missff') || Seq_Srv_Instance_Inst_Id.Nextval,
     Trim('RefreshId' || To_Char(Systimestamp, 'YYMMDDhh24missff') ||
          Lpad(Dbms_Random.Value(0, 1000), 5, '0')),
     '1010',
     v_Pw_Id,
     '1048',
     0,
     170003,
     0,
     0,
     '101',
     Gv_Old_Sp,
     '1',
     Sysdate);
End If;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值