PL/Sql 查询执行错误

Posted

技术标签:

【中文标题】PL/Sql 查询执行错误【英文标题】:PL/Sql query execution error 【发布时间】:2015-05-27 16:32:43 【问题描述】:

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

ERROR at line 23: PL/SQL: ORA-00942: table or view does not exist
1. create or replace trigger filltable
2. after insert on salestransaction
3. for each row
4. declare

触发器的代码是:

create or replace trigger filltable
after insert on salestransaction
for each row
declare
aname varchar2(25);
modname varchar2(25);
manfname varchar2(25);
askpr number;
agrpr number;
begin
select sa.name,m.name,mf.name
into   aname,modname,manfname
from   manufacturer mf,model m, car c, salestransaction st, salesagent sa
where mf.manufacturerid = m.manufacturerid and
m.modelno = c.modelno and
c.vin = st.vin and
st.agentid = sa.agentid;

select askingprice,agreedprice
into askpr,agrpr
from car c,salestransaction st
where c.VIN = St.vin;

if(agrpr > askpr*1.2) then

insert into excellentsales values(agent_seq.nextval,aname,modname,manfname);

end if;

end filltable;

/


create table excellentsales
(agentid varchar2(5) not null,
agentname varchar2(25),
carmodel varchar2(25),
mfname varchar2(25),
primary key(agentid))

CREATE SEQUENCE agent_seq START WITH 1 INCREMENT BY 1;

【问题讨论】:

首先创建表,然后排序,最后执行您的触发器。 用户是否有插入、选择所有指定表的特权? 到目前为止,您问了多少关于该触发器的问题? 3? 4?最好坚持一个问题并改进它,直到它起作用为止。 不同的用户(here和here),或者至少是账户;实际上是一个人,还是不同的人处理相同的任务? 【参考方案1】:

您不需要在 SALESTRANSACTION 的行触发器中查询 SALESTRANSACTION - 您应该在调用触发器的 SALESTRANSACTION 行上使用 :NEW 值。我建议将您的触发器重写为:

create table excellentsales
(EXCELLENTSALES_ID  NUMBER
   CONSTRAINT PK_EXCELLENTSALES
   PRIMARY KEY
     USING INDEX,
agentid varchar2(5) not null,
agentname varchar2(25),
carmodel varchar2(25),
mfname varchar2(25))

CREATE SEQUENCE EXCELLENTSALES_SEQ
  START WITH 1
  INCREMENT BY 1;

create or replace trigger filltable
  after insert on salestransaction
  for each row
declare
  aname varchar2(25);
  modname varchar2(25);
  manfname varchar2(25);
  askpr number;
  agrpr number;
begin    
  SELECT m.NAME, mf.NAME, c.ASKINGPRICE
    INTO modname, manfname, askpr
    FROM CAR c
    INNER JOIN MODEL m
      ON m.MODELNO = c.MODELNO
    INNER JOIN MANUFACTURER mf
      ON mf.MANUFACTURERID = m.MANUFACTURERID
    WHERE c.VIN = :NEW.VIN;

  SELECT sa.NAME
    INTO aname
    FROM SALESAGENT sa
    WHERE sa.AGENTID = :NEW.AGENTID;

  agrpr := :NEW.AGREEDPRICE;

  if agrpr > askpr * 1.2 then
    insert into excellentsales (EXCELLENTSALES_ID, AGENTID, AGENTNAME, CARMODEL, MFNAME)
      values(EXCELLENTSALES_SEQ.nextval, :NEW.AGENTID, aname, modname, manfname);
  end if;
end filltable;

我还重新设计了您的 EXCELLENTSALES 表以包含一个不是 AGENTID 的主键。正如最初设计的那样,EXCELLENTSALES 没有记录实际的 AGENTID(显然应该来自 SALESTRANSACTION),而在现实世界中可能需要它,例如支付佣金。

【讨论】:

在excellentsales表中输入值时显示错误.. ORA-00984: column not allowed here

以上是关于PL/Sql 查询执行错误的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL SELECT INTO 错误 (ORA-00905)

ORA-06504: PL/SQL: 执行时返回结果集变量的类型

选择查询中的 PL/SQL 存储错误

为啥这个 PL/SQL 查询不使用 ODP.NET 执行

PL/SQL 和 SQL Developer 的结果不同

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)