【问题标题】:Trigger for updating insert content更新插入内容的触发器
【发布时间】:2014-01-28 01:02:17
【问题描述】:

我正在构建一个触发器以在插入之前执行两件事: - 拒绝给定的值(作品) - 更新空值(不能让它工作)

触发器表如下所示:

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;

一切都会编译,但是当我将空值作为名称时,它不会将空值更新为 No_%。

请告诉我我做错了什么?

这是 Oracle 数据库。

【问题讨论】:

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


    【解决方案1】:

    由于 :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;
    

    这也会更新名称和表格。

    【讨论】:

    • 是的,就是这样,非常感谢,但如果你能向我解释这背后的逻辑,因为我想知道它是如何运作的,而不仅仅是它是如何运作的。所以 :NEW.name 是一个指针,直到触发器结束我可以随意调整它的值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多