Fork me on GitHub

在触发器中使用sql%roucount遇到的坑

触发器代码如下:

CREATE OR REPLACE TRIGGER XXX
DECLARE
id varchar(20),
c1 char(1),
c2 char(2)
BEGIN
...
...

UPDATE my_table
SET 
c1=c1,
c2=c2
where
id=id;

IF SQL%ROUCOUNT=0 THEN
    INSERT INTO my_table(id,c1,c2) VALUSE(id,c1,c2);
END IF; 
END;
/

出现一个很奇妙的问题,当my_table不为空时,根本不insert任何数据!
推测肯定是update时除了问题,于是:

DBMS_OUTPUT.put_line(sql%rowcount);

发现每次触发器启动时,打印出的rowcount恰好为my_table的记录数?!
百思不得其解,还以为在触发器中使用SQL%ROWCOUNT会有什么限制或者问题,于是翻了oracle触发器官方实例,发现也有类似的用法。
苦恼了一阵之后,猜测是不是由于变量名和列名一致所导致的问题,于是把变量名全部修改之后,发现触发器正确运行了!
真是大坑啊,浪费了近一个小时的时间。

posted @ 2017-05-30 21:38  alchimistin  阅读(325)  评论(0编辑  收藏  举报