使用来自两个表的变量的 SQL 触发器

Posted

技术标签:

【中文标题】使用来自两个表的变量的 SQL 触发器【英文标题】:SQL Trigger with Variables from two tables 【发布时间】:2011-12-11 22:32:48 【问题描述】:

以下是两个表的查询:

SQL> describe order_line;
Name                                                                    Null?    Type
----------------------------------------------------------------------- -------- ------------------
O_ID                                                                    NOT NULL NUMBER(8)
INV_ID                                                                  NOT NULL NUMBER(10)
OL_QUANTITY                                                             NOT NULL NUMBER(4)

SQL> describe inventory; 

Name                                                                    Null?    Type
----------------------------------------------------------------------- -------- ------------------
INV_ID                                                                  NOT NULL NUMBER(10)
ITEM_ID                                                                          NUMBER(8)
COLOR                                                                            VARCHAR2(20)
INV_SIZE                                                                         VARCHAR2(10)
INV_PRICE                                                                        NUMBER(6,2)
INV_QOH                                                                          NUMBER(4)

如果库存中相应的 inv_qoh 小于 100,我试图在删除 order_line 中的一行时触发触发器。这是我目前的代码:

create or replace trigger ol_bef_del
before delete on order_line for each row
declare
    inv_inv_id number;
    inv_inv_qoh number;
    little_inv_error exception;
begin
    select inv_id, inv_qoh into inv_inv_id, inv_inv_qoh from inventory
    where inv_inv_id = inv_id;
if inv_inv_qoh < 100
raise little_inv_error;
end if;
exception
when little_inv_error then
    raise_application_error (-20002,
    'Wait a minute - too little in Inventory');
end;
/

我做错了什么?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您需要使用 :OLD 来访问被删除行的值,如下所示:

select inv_id, inv_qoh into inv_inv_id, inv_inv_qoh from inventory
where inv_inv_id = :old.inv_id;
--                 ^^^^

【讨论】:

以上是关于使用来自两个表的变量的 SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章

插入表需要来自另一个表的特定条件

sql server 触发器 从一个表添加到另个表是否两个表对应的字段必须相同呢

ORACLE PL/SQL 触发器使用两个不同的表

SQL触发器

作用于表的触发器vs作用于数据库的触发器(包含SQL语言与触发器个别相关知识)

SQL语句中两个表的连接