【问题标题】:Yet another bad bind variable in triggers触发器中的另一个错误绑定变量
【发布时间】:2014-04-24 20:14:08
【问题描述】:

得到一个错误的绑定变量“old.seatsremain”和“new.seatsremain”。如果席位可用于特定产品,则尝试使此触发器自动减少产品的席位数量。我是否必须在前面声明所有变量:????我的两张桌子是:

enrollments
{sid number,
offerno number;)

offering
{offerno number,
courseno varchar2(10),
instructor varchar2(10),
seatsremain number;}

更新的代码测试: 好的,所以我合并了 Fumble 给我的编码,它清除了最初弹出的错误,但是我测试了这个新代码,我仍然有一些剩余的错误,因为我不知道为什么的 EXCEPTION 子句,因为我仔细检查的语法应该是正确的。有什么想法吗??

create or replace trigger enroll_bef_ins_row
before insert on enrollments
for each row
declare
    originstruct    offering.instructor%type;
    origcourseno    offering.courseno%type;
    original    offering.seatsremain%type;
    seatsremain_already_full    exception;
begin
    Select seatsremain, instructor, courseno into original, originstruct, origcourseno from offering where offerno= :new.offerno;
    if original > 0 then
        update offering set seatsremain= seatsremain - 1;
        dbms_output.put_line ('Seats available in offering'||offerno||'have decreased from'||original|| 'to' ||(seatsremain));
    else if original = 0 then
        raise seatsremain_already_full;
        dbms_output.put_line ('Offering'||offerno||'is already full!');
    else
        update offering set offerno = :old.offerno;
        update offering set courseno = origcourseno;
        update offering set instructor = originstruct;
        update offering set seatsremain = original;

    end if;

exception
    when seatsremain_already_full then
        raise_application_error (-20001, 'Cannot allow insertion');
commit;
end;
/

现在出现此错误: PLS-00103:在期待一个时遇到符号“例外” 以下的: 开始 case 声明 goto 的结束退出 if loop mod null pragma 在使用时提高返回选择更新

PLS-00103:预期时遇到符号“文件结尾” 以下之一: end not pragma final 可实例化顺序覆盖静态

【问题讨论】:

  • 对产品的提交需要一个 pragma autonomus_transaction。我将更新我的示例代码。
  • 嗯尝试了编译指示以及在异常之前将提交向上移动......它仍然抛出相同的错误
  • ahhh nvm im 愚蠢的 ELSE IF 应该是 ELSIF
  • 那么你让它工作了吗?
  • 我做到了!!!非常感谢您的帮助!

标签: variables plsql bind


【解决方案1】:

您正在使用表中的相关名称,而不是为其创建触发器的表。尝试将 oldSeatsRemain 和 NewSeatsRemain 声明为触发器中的变量。

试试这个(注意:这个示例尚未执行)。它包括我在 cmets 中描述的编辑。

    create or replace trigger enroll_bef_ins_row
    before insert on enrollments
    for each row

    declare
        offerrow offering%rowtype;
        seatsremain_already_full    exception;
        pragma autonomus_transaction;
    begin
        Select seatsremain into offerrow from offering where offerno= :new.offerno;
        if offerrow.seatsremain > 0 then
            update offering set seatsremain= offerrow.seatsremain - 1;
            dmbs_output.put_line ('Seats available in offering ' |offerno| ' have decreased from ' |offerrow.seatsremain| ' to ' |offerrow.seatsremain-1|);
        else if original = 0 then
            dbms_output.put_line ('Offering ' |offerno| ' is already full!');
            raise seatsremain_already_full;
        else
            insert into offering
            values(offering.offerno,offering.courseno,offering.instructor,offering.seatsremain);
        end if;
        commit;
    exception
        when seatsremain_already_full
        raise_application_error (-20001, 'Cannot allow insertion');
    end
    /

【讨论】:

  • 所以我应该声明变量,然后通过 select 将它们传递给语句吗?
  • 您已经声明了“原始”,其中保留了您的旧席位。您真正需要做的就是更改“更新提供设置席位保留=席位保留 - 1;”到“更新提供集座位保留=原始 - 1;”。您的 dbms_output 行将失败,因为它们正在引用另一个表,因此请将它们注释掉。
  • 除非您将这些字段添加到您的选择语句中,否则您的插入也会失败。是的,您必须声明局部变量来存储它们。你曾经使用 %RowType 来声明一个行变量吗?
  • 我将其更改为“更新提供 set seatremain= original-1”,但仍然抛出 old.seatsremain 和 new.seatsremain 错误。
  • 您的查询中不应有任何对 old.seatsremain 和 new.seatsremain 的引用。您是否注释掉了使用它们的 dbms_output 行?
猜你喜欢
  • 2012-11-04
  • 2021-09-20
  • 2017-08-11
  • 2013-02-06
  • 2012-09-24
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多