oracle 如何在SQL中创建此触发器?[重复]

lztngnrs  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(166)

此问题已在此处有答案

Update columns with Null values(5个答案)
4天前关闭。
我有下面的表订单(Student_ID,Order_ID,order_date,completed,payment,card_no,total_price)。我想创建一个触发器,如果付款是卡,则禁止按顺序插入值,但缺少card_info。

create or replace trigger check_card_info
before insert on orders
for each row
begin
if (:new.Payment='card' and :new.card_No=null) then
raise_application_error(-20002,'card info is missing');
end if;
end;
.

我已经尝试过了。它创建的触发器没有错误,但逻辑不起作用。按逻辑它应该禁止插入以下值,但它没有。
insert into orders values (21200122, 11,'01-FEB-2023','no', 'card', null, 150);

k97glaaz

k97glaaz1#

为什么不向表中添加约束?

ALTER TABLE orders
  ADD CONSTRAINT chk_payment_card_no_not_null   
CHECK ( ( payment  = 'card' AND card_No IS NOT NULL)
       OR payment != 'card' );
9lowa7mx

9lowa7mx2#

如果它必须是一个触发器,那么你写的代码是 close;只是没有东西 * 等于 * null。你不能检查是否card_no = null,而是检查是否card_no is null
在代码的其余部分,有几个反对意见:

  • 在触发器中,使用when子句而不是if-then-else
  • 执行插入时,请始终指定要插入数据的列名。按照这种方法,不可能知道哪个值代表什么
  • 而且,似乎你插入的是日期值。如果是这样,那么就不要插入字符串(这就是'01-FEB-2023'),并且不依赖于隐式数据类型转换。(哪一个?这取决于那些设置)。插入适当的日期数据类型值,或者作为日期文字(这就是我在下面的示例中所做的),或者使用具有适当格式模型的to_date函数

因为你没有提供表的描述,我猜。

SQL> create table orders
  2  (order_id   number,
  3   col2       number,
  4   order_date date,
  5   status     varchar2(5),
  6   payment    varchar2(10),
  7   card_no    varchar2(10),
  8   col7       number);

Table created.

触发器:

SQL> create or replace trigger check_card_info
  2    before insert on orders
  3    for each row
  4    when (new.payment = 'card' and new.card_no is null)
  5  begin
  6    raise_application_error(-20002, 'card info is missing');
  7  end;
  8  /

Trigger created.

测试:第一行无效(缺少card_no):

SQL> insert into orders (order_id, col2, order_date, status, payment, card_no, col7)
  2    values (21200122, 11, date '2023-02-01', 'no', 'card', null, 150);
insert into orders (order_id, col2, order_date, status, payment, card_no, col7)
            *
ERROR at line 1:
ORA-20002: card info is missing
ORA-06512: at "SCOTT.CHECK_CARD_INFO", line 2
ORA-04088: error during execution of trigger 'SCOTT.CHECK_CARD_INFO'

有效行:

SQL> insert into orders (order_id, col2, order_date, status, payment, card_no, col7)
  2    values (21200122, 11, date '2023-02-01', 'no', 'card', 'Card 123', 150);

1 row created.

SQL>

相关问题