oracle 中 update trigger 中 嵌入 select 语句出错
CREATE OR REPLACE TRIGGER BFINSERT_uup_company_baseinfo
BEFORE INSERT OR UPDATE
ON uup_company_baseinfo
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
c_num NUMBER;
BEGIN
if inserting then
SELECT COUNT(*) INTO c_num FROM uup_company_baseinfo t
WHERE NVL(t.is_deleted,'0')='0' AND t.active_mark='0'
AND t.status_code='20' AND t.bsp_company_code=:NEW.bsp_company_code;
IF c_num > 0 THEN
RAISE_APPLICATION_ERROR(-20001, '客户公司已存在');
END IF;
end if;
if updating then
SELECT COUNT(*) INTO c_num FROM uup_company_baseinfo t
WHERE NVL(t.is_deleted,'0')='0' AND t.active_mark='0'
AND t.status_code='20' AND t.bsp_company_code=:NEW.bsp_company_code;
if :NEW.IS_DELETED='0' AND :NEW.ACTIVE_MARK='0' AND :NEW.STATUS_CODE='20' AND c_num > 0 THEN
RAISE_APPLICATION_ERROR(-20001, '更新错误,改公司已存在');
END IF;
end if;
END;
--------------------反正就是不能在update 里面 嵌入 select语句 嵌入 就报错,我菜鸟 求高手指点。。。
追问:求 正确 修改 : 应该如何修改 ???这个不就是 修改的的新sal不能小于 老的 sal嘛 少就抛错 这个跟我的问题有什么出路哦,我的问题是 不能在update 里面嵌套 select 语句 而且 是 求修改正确 !!! 谢谢 回答!!!大哥啊 我需要 用NEW.bsp_company_code这个字段查数据库啊 , 我的意思是:不想在修改数据后 数据库有重复的记录 跪求 大侠 大哥 大嫂 们 我是一只小小的菜鸟 求给力啊!!!!!!
答案:Oracle 的 FOR EACH ROW 触发器, 不允许在 触发器里面,
SELECT / UPDATE / DELETE 自己这个表。
你的触发器是
BEFORE INSERT OR UPDATE
ON uup_company_baseinfo
FOR EACH ROW
但是触发器代码里面有
SELECT ... FROM uup_company_baseinfo
是不允许的。
因此要抱错。
其他:create or replace trigger check_sal_cq
before update of sal on emp
for each row
when (new.sal < old.sal)
begin
raise_application_error(-20001, '工资不能比以前的少!');
end;
能看明白的话,你这个问题就有点好理解了 SELECT COUNT(*) INTO c_num FROM uup_company_baseinfo t
WHERE NVL(t.is_deleted,'0')='0' AND t.active_mark='0'
AND t.status_code='20' AND t.bsp_company_code=:NEW.bsp_company_code;
你看看可不可以把下上面select 的语句改成
if NVL(old.is_deleted , '0') = '0' and old.active_mark = '0' and old.status_code = '20' .....then
c_num = 1;
end if; 如果仅仅是查重,最好创建unique index 让数据库帮你维护唯一性,而不是用trigger。
上一个:关于Oracle初学者的几个简单问题
下一个:求Oracle rac或者dataguard相关视频?