触发更新插入内容

时间:2014-01-09 12:54:41

标签: sql oracle triggers sql-update sql-insert

我正在构建一个触发器,在插入之前执行两项操作:   - 拒绝给定值(工程) - 更新空值(无法使其工作)

触发器表如下所示:

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。

1 个答案:

答案 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;

这也将更新名称和表格。