我正在构建一个触发器,在插入之前执行两项操作: - 拒绝给定值(工程) - 更新空值(无法使其工作)
触发器表如下所示:
CREATE TABLE peeps(
name VARCHAR(20),
surname VARCHAR(20)
);
虽然触发器本身看起来像这样:
CREATE OR REPLACE TRIGGER name_a_i
BEFORE INSERT ON krasnoludki FOR EACH ROW
DECLARE
v_count NUMBER := 0;
BEGIN
IF initcap(:new.name) LIKE 'Adrian%' THEN
raise_application_error(-20001, 'Name starting with Adrian is prohibited');
ELSE
IF :new.name = '' OR :new.name IS NULL THEN
SELECT count(*) INTO v_count
FROM peeps
WHERE initcap(name) LIKE 'No_%';
UPDATE peeps
SET name = concat('No_', v_count + 1)
WHERE name = :new.name;
END IF;
END IF;
END name_a_i;
所有内容都会编译,但是当我将null值作为名称时,它不会将null值更新为No _%。
请告诉我,我做错了什么?
这是Oracle DB。
答案 0 :(得分:0)
因为:NEW.name为NULL,此更新
Update peeps set name = concat('No_',v_count+1) where name = :NEW.name;
将无效,因为name =:NEW.name将无效。
你需要改变你的逻辑。
我认为你正在寻找这样的东西:
select count(*) into v_count from peeps where initcap(name) like 'No_%';
:NEW.name := concat('No_',v_count);
Update peeps set name = concat('No_',v_count+1) where name = :NEW.name;
这也将更新名称和表格。