1

次のエラーに直面しています:

[Error] PLS-00049 (12: 11): PLS-00049: bad bind variable 'NEW.OPTION_D'

私は以下を実行しようとしています:

create or replace trigger check_option_for_stage
before insert on lot_option
for each row
when (new.stage_id > 0 and new.option_id > 0)
declare 
not_existing_option exception;
num_count number;
begin
    select count(*) into num_count 
    from option_cost os
    where :new.option_id = os.option_id and :new.stage_id = os.stage_id;
    if num_count = 1 then
        DBMS_OUTPUT.PUT_LINE('The option can be applied to the lot at the current stage');
    ELSE
        raise not_existing_option;    
    end if;
exception
    when not_existing_option then
        DBMS_OUTPUT.PUT_LINE('The option is not available on this stage, therefore rejected');
    when others then
        DBMS_OUTPUT.PUT_LINE('Oops!, something went wrong, it needs your attention!');
end;
/

なぜ私はこれに直面しているのですか?バインド変数が悪いのはなぜですか? 入力することで新しい値にアクセスできる必要があることを知っています:new.whateverthecolumnname

Oracle 11g を使用しています。

私が遊んでいるテーブルの定義

SQL> desc option_cost
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COST                                      NOT NULL NUMBER
 OPTION_ID                                 NOT NULL NUMBER(38)
 STAGE_ID                                  NOT NULL NUMBER(38)

SQL> desc lot_option;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 LOT_ID                                    NOT NULL NUMBER(38)
 OPTION_ID                                 NOT NULL NUMBER(38)
 COST                                      NOT NULL NUMBER
 DATE_CREATED                                       DATE
 STAGE_ID                                  NOT NULL NUMBER(38)
4

1 に答える 1

3

列はoption_id(id末尾に がある) か、それともoption_d( がないi) だけですか? option_idより理にかなっているように思われます。option_id正しいと仮定すると、 inSELECTが欠落しているステートメントにタイプミスがあります。あなたは次のようなものが欲しいiid

select count(*) 
  into count 
  from option_cost oc
 where :new.option_id = oc.option_id 
   and :new.stage_id = oc.stage_id;

もちろん、countは予約語なので、 という名前のローカル変数を宣言するのは得策ではありませんcountl_countたとえば、その変数に名前を付けるか、他の命名規則を使用してローカル変数を識別し、予約語の使用を避ける方がはるかに理にかなっています。

于 2012-11-26T21:50:43.827 に答える