【问题标题】:Oracle Update with the Case When Exists clause使用 Case When Exists 子句进行 Oracle 更新
【发布时间】:2019-02-02 04:14:02
【问题描述】:

DN_NUM 列的一个值与不同表的 MSISDN 列值匹配时,我需要一个触发器来更新表 DIRECTORY_NUMBER(RNPH_REQUETS_DETAILS) 在不同的架构 (NKADM) 下。每当 DIRECTORY_NUMBER 表中有新条目时,触发器就会运行。根据几个条件,需要更新 DN_STATUS 列和其他一些列的值。如果满足条件,则 DN_STATUS 列的更新值为“r”,如果不满足条件,则为“w”。我的代码的活动部分如下:

UPDATE d 
  SET d.DN_STATUS = CASE WHEN EXISTS (SELECT 1 from NKADM.RNPH_REQUESTS_DETAILS n where n.MSISDN = d.DN_NUM AND n.PROCESS_STATE_ID = 4 AND n.ACTION='IN' AND n.FAILED_STATUS IS NULL AND TRUNC(n.MODIFICATION_DATE) = TRUNC(SYSDATE))
                      THEN 'r' 
                      ELSE 'w'
                      END,
    d.DN_MODDATE = SYSDATE,
    d.BUSINESS_UNIT_ID = 2,
    d.HLCODE = 5
  WHERE d.DN_ID =: NEW.DN_ID
  AND d.PLCODE = 1004
  AND d.DN_STATUS = 'f'
  FROM DIRECTORY_NUMBER d;

我收到以下错误:

错误(48,1): PL/SQL: SQL 语句被忽略

错误(60,3):PL/SQL:ORA-00933:SQL 命令未正确结束

只有当我删除引用时,错误才会得到解决。但这给出了与预期不同的结果。当代码如下:

UPDATE DIRECTORY_NUMBER 
  SET DN_STATUS     = CASE WHEN EXISTS (SELECT 1 from NKADM.RNPH_REQUESTS_DETAILS where MSISDN = DN_NUM AND PROCESS_STATE_ID = 4 
                                        AND ACTION='IN' AND FAILED_STATUS IS NULL AND TRUNC(MODIFICATION_DATE) = TRUNC(SYSDATE))
                      THEN 'r' 
                      ELSE 'w'
                      END,
    DN_MODDATE      =SYSDATE,
    BUSINESS_UNIT_ID=2,
    HLCODE          =5
  WHERE DN_ID       =:NEW.DN_ID
  AND PLCODE        =1004
  AND DN_STATUS     ='f';

  COMMIT;

即使 CASE WHEN EXISTS 条件为真(独立运行时返回结果),DN_STATUS 的值也会更新为“w”。

更新:我尝试使用以下代码:

UPDATE DIRECTORY_NUMBER
    SET DN_STATUS     = 'r',
    DN_MODDATE      =SYSDATE,
    BUSINESS_UNIT_ID=2,
    HLCODE          =5
  WHERE DN_ID       =:NEW.DN_ID
  AND PLCODE        =1004
  AND DN_STATUS     ='f';
  AND DN_NUM in (select MSISDN from NKADM.RNPH_PROCESS_DETAILS where PROCESS_STATE_ID = 4);

这也不起作用。如果我删除最后一个条件,结果行的 DN_STATUS 值为“f”,并且 MSISDN 位于 NKADM.RNPH_PROCESS_DETAILS 表中,PROCESS_STATE_ID = 4。我不明白为什么它不起作用。

我做错了什么?

【问题讨论】:

    标签: sql-update exists case-when


    【解决方案1】:

    在每个行的更新/插入触发器之前,您可以修改当前处理的记录数据。您无需调用额外的 UPDATE 来更改数据。

    换句话说,你可以做这样的事情

    IF :NEW.PLCODE = 1004 AND :NEW.DN_STATUS = 'f' THEN
    
      :NEW.DN_MODDATE       := SYSDATE;
      :NEW.BUSINESS_UNIT_ID := 2;
      :NEW.HLCODE           := 5;
    
      -- this query you can wrap in a function and call this function
      SELECT COUNT(1) 
        INTO lv_count
        FROM NKADM.RNPH_REQUESTS_DETAILS n 
       WHERE n.MSISDN = :NEW.DN_NUM 
         AND n.PROCESS_STATE_ID = 4 
         AND n.ACTION = 'IN' 
         AND n.FAILED_STATUS IS NULL 
         AND TRUNC(n.MODIFICATION_DATE) = TRUNC(SYSDATE);
    
      IF lv_count > 0 THEN
        :NEW.DN_STATUS := 'r';
      ELSE
        :NEW.DN_STATUS := 'w';
      END IF;   
    
    END IF;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2016-02-23
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多