使用 Oracle 创建触发器的问题

Posted

技术标签:

【中文标题】使用 Oracle 创建触发器的问题【英文标题】:Problems Creating a trigger using Oracle 【发布时间】:2015-05-26 10:11:50 【问题描述】:

我的问题是:

一个触发器,它自动将销售代理存储在一个名为“ExcellentSale”的单独表中 名称,车型和制造商名称,每次约定的价格 SalesTransaction 是汽车要价的 20% 以上。 (注:您需要创建 执行此触发器之前的“ExcellentSale”表。要创建主键,请使用 从 1 开始并以 1 递增的序列。

我正在使用这些表格

Manufacturer(manufacturerID, name, region)

Model(modelNo, name, type, previousModel, manufacturerID)

Car(VIN, dateAcquired, yearBuilt, purchasedPrice, askingPrice,
currentMileage, modelNo)

SalesAgent(agentID, name, DOB)

SalesTransaction(VIN, custID, agentID, dateOfSale, agreedPrice)

这是我的尝试

create sequence ggenerateKey
start with 1
increment by 1;
CREATE TABLE ExcellentSale(
recordNo NUMBER,
agentName VARCHAR2(20) NOT NULL,
modelName VARCHAR2(20) NOT NULL,
manufacturerName VARCHAR2(20) NOT NULL,
PRIMARY KEY(recordNo));
create or replace trigger AutoStore
before insert on SalesTransaction
for each row
declare
agentName varchar2(50);
modelName varchar2(50);
manufacturerName varchar2(50);
askingprice number;
agreedprice number;
begin
select sa.name, mo.name, mu.name, c.askingprice, st.agreedprice
into agentName, modelName, manufacturerName, askingprice, agreedprice
from manufacturer MU, Model MO, Car C, SalesAgent SA, SalesTransaction ST
where mu.manufacturerid = mo.manufacturerid
and st.vin = c.vin
AND c.vin = :new.vin
AND sa.agentID = :new.agentID;
IF :new.agreedPrice > (1.2 * askingPrice) THEN 
INSERT INTO ExcellentSale
VALUES
(ggenerateKey.nextval, agentName, modelName, manufacturerName);
END IF; 
end AutoStore;
/

触发器编译,当我尝试测试它时,我使用将插入到 SalesTransaction 中的这些值,这应该会触发触发器但显示为错误。

insert into SalesTransaction
values
('2B7JB33R9CK683376', '1', '1', to_date('01-02-2013','dd-mm-yyyy'), 586000 );

显示的错误是这样的

insert into SalesTransaction
            *
ERROR at line 1:
ORA-01403: no data found 
ORA-06512: at "JTLA.AUTOSTORE", line 8 
ORA-04088: error during execution of trigger 'JTLA.AUTOSTORE' 

【问题讨论】:

首先,您的触发器是 SalesTransaction 表上的插入前触发器,但您试图在触发器主体的 select 语句中加入 SalesTransaction 表。你肯定知道约定的价格和 vin 吗?它们是 :new.agreedprice 和 :new.vin。接下来,SalesAgent 是否真的与 select 中的其他表相关?我认为您可能需要将该表拉出到它自己的选择语句中。最后,你最好考虑一下如果你没有从你的任何选择中得到一条回线应该发生什么。它应该出错吗?你应该使用默认值吗?还有什么? 【参考方案1】:

此错误意味着您的带有“into”子句的 select 语句不会产生任何行。 为了避免这个错误,我通常在每一列上使用聚合函数 MAX(),它保证 1 行结果集,在“没有匹配的行”的情况下生成空值,并且不会出现异常

【讨论】:

以上是关于使用 Oracle 创建触发器的问题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle触发器使用case语句创建

通过 JDBC (oracle) 创建触发器

SQL server与Oracle触发器的创建与使用

ORACLE PLSQL 使用由 :new 用户名和密码标识的触发器创建用户

如何在运行时使用 Oracle 环境中的触发器和/或过程创建外键

如何在oracle表单12c中为Shift + A按键创建触发器