【问题标题】:Error(24,66): PL/SQL: ORA-00984: column not allowed here错误(24,66):PL/SQL:ORA-00984:此处不允许列
【发布时间】:2017-04-05 17:47:38
【问题描述】:

我正在制作一个触发器,检查一个人是否可以参加世界锦标赛或欧洲锦标赛,如果他们开车,计算他们在燃料上的花费(燃料成本 * 花费 * 距离/100)。我需要将该信息放在另一个表中,但我收到此消息:

Error(24,66): PL/SQL: ORA-00984: column not allowed here

那是因为我在代码底部的 INSERT 语句中添加了“fuelcost * 花 * :new.distance/100”。我的问题是,我怎样才能以某种不同的方式将该值计入餐桌成本。列 cost.money 不是计算列,因为它不仅仅是该表中的燃料成本,因此这不是解决方案。

CREATE OR REPLACE TRIGGER check_norm_fuel_cost 
  INSTEAD OF INSERT OR UPDATE ON insert_travel_view
  FOR EACH ROW
  DECLARE 
    hasnorm char(1);
    spends number;
    fuelcost number;

  BEGIN
    SELECT norms.norm INTO hasnorm
      FROM norms JOIN competitions
        ON competitions.competitionID=norms.competitionID
      WHERE :new.personID = norms.personID 
           AND (competitions.name LIKE 'European championship' 
              OR competitions.name LIKE 'World championship');

      IF hasnorm = 'Y' OR hasnorm IS NULL THEN
        INSERT INTO travel(travelID, personID, competitionID, vehicleID, distance) 
          VALUES (:new.travelID, :new.personID, :new.competitionID, :new.vehicleID, :new.distance);
        IF :new.distance IS NOT NULL THEN
          SELECT vehicles.consumption INTO spends FROM vehicles 
            WHERE :new.vehicleID = vehicles.vehicleID;
          SELECT fuels.cost INTO fuelcost FROM fuels JOIN vehicles ON vehicles.fuelID = fuels.fuelID
            WHERE :new.vehicleID = vehicles.vehicleID;

          INSERT INTO COSTS(costID, costtype, travelID, money)
            VALUES(35, 'fuel', :new.travelID, fuelcost*spends*:new.distance/100);

        END IF;
      END IF;
  END;

【问题讨论】:

  • 计算中的distance 是否应该是:new.distance 的最终插入?
  • 是的,但它不能解决这个错误。我认为 INSERT 无法在 VALUES EDIT 中得到算术表达式的问题:我编辑了有问题的代码。
  • 这就是问题所在,尽管您还有另外两个问题 - 添加 :new: 时错误消息是否更改?
  • 不,很遗憾,还是一样。如果它只是:新。我可能会自己得到它。你说的还有哪两个问题?
  • values 列表中的表达式完全正常,它们不是错误的原因。

标签: sql plsql oracle11g oracle-sqldeveloper


【解决方案1】:

尝试将插入语句中的显式值更改为 select like insert into(...) select .... from ,很抱歉从移动端写入格式错误。

【讨论】:

  • 对不起,你到底是什么意思?
  • 我的意思是改变 insert into() values(); with insert into tablename () select your_col_list from tablename where 子句。
【解决方案2】:

你似乎有三个问题; ORA-00984 是因为您的最终插入正在执行:

VALUES(35, 'fuel', :new.travelID, fuelcost*spends*distance/100);

distance 被解释为列名,因为范围内没有具有该名称的变量;大概应该是:

VALUES(35, 'fuel', :new.travelID, fuelcost*spends*:new.distance/100);

虽然您可以避免使用 spendsfuelcost 局部变量,而改为使用 insert ... select

INSERT INTO COSTS(costID, costtype, travelID, money)
SELECT 35, 'fuel', :new.travelID, fuels.cost*vehicles.consumption*:new.distance/100
FROM fuels JOIN vehicles ON vehicles.fuelID = fuels.fuelID
WHERE vehicles.vehicleID = :new.vehicleID;

您似乎还有两个错别字:

    INSERT INTO travel(travelID, personID, competitonID, vehicleID, distance)

缺少i,应该(我认为)是:

    INSERT INTO travel(travelID, personID, competitionID, vehicleID, distance)

和:

        WHERE :new.vehicleID = vehicle.vehicleID;

缺少s 并且应该(我认为)是:

        WHERE :new.vehicleID = vehicles.vehicleID;

【讨论】:

  • 谢谢,这两个错别字是在将名称 od 变量从克罗地亚语翻译成英语时出现的,它们在我的代码中没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多