【问题标题】:Set a value if null inserted in Oracle SQL如果在 Oracle SQL 中插入 null,则设置一个值
【发布时间】:2015-03-22 15:41:12
【问题描述】:

我创建了一个触发器,它会自动将第一列的值设置为后续的阶乘数。但是,另外,我想将第二列的值设置为第一个增加 5 的值,以防插入空值。这是我现在尝试的:

create or replace trigger test_tr
before insert on myT
for each row 
begin

IF :new.mNumb is null 
THEN       
    UPDATE myT
    SET mNumb = :new.tab_id + 5;
END IF;


SELECT fac(test_seq.NEXTVAL)
INTO   :new.tab_id
FROM   dual;


end;

但显然我错过了一些东西,因为什么也没发生,插入的 null 仍然是空的。

【问题讨论】:

  • 您使用的是什么版本的 Oracle?另外,为什么要插入阶乘数字?在开始遇到数字溢出之前,您只能根据序列添加 83 行!很可能,问题在于 :new.tab_id 为空,并且 null + 仍然为空。
  • 插入阶乘不是我个人的目标,这只是大学练习。为什么 tab_id 会为空?
  • 我不知道;你没有提到你的数据库版本、你的表结构或任何示例数据,所以我做了一个猜测。

标签: sql oracle triggers insert null


【解决方案1】:

据我所知,这一切都按预期工作,使用 Emmanuel 的建议删除更新 stmt。这是我使用的测试用例:

drop table test;

create table test (col1 number, col2 number);

create trigger test_trg
before insert on test
for each row 
begin

IF :new.col2 is null 
THEN       
    :new.col2 := :new.col1 + 5;
END IF;

:new.col1 := dbms_random.value;

end;
/

insert into test values (1, 1);

insert into test values (1, null);

insert into test values (null, null);

commit;

select * from test;

产生以下输出:

      COL1       COL2
---------- ----------
.617580128          1
.030570358          6
.555066268           

也许如果你在处理 null col2 场景之前设置 :new.col1 ,那对你来说会更好吗?这样做会产生:

      COL1       COL2
---------- ----------
.302670917          1
.024927489 5.02492749
.667568400 5.66756840

【讨论】:

    【解决方案2】:

    不要重新更新触发器中的表,直接更新你给出的行:

    ...
    
    IF :new.mNumb is null 
    THEN       
        :new.mNumb = :new.tab_id + 5;
    END IF;
    
    ...
    

    【讨论】:

    • 好的,这是一个有效的观点。我做到了,但还是不行。
    • 这行不行?如果它不起作用,为什么会被接受?
    猜你喜欢
    • 2018-04-13
    • 2019-01-21
    • 2011-10-28
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多