【发布时间】: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