2012-04-25 7 views
1

このトリガーに問題があります。私は、給与が一定の境界内にあるかどうかを確認する手順を作成しました。特定の範囲内に収まらない場合は、例外を発生させます。この問題は、プロシージャがエラーなしでコンパイルされても、トリガはプロシージャを見つけることができません。トリガー・コール・プロシージャー・エラー

set serveroutput on; 
create or replace procedure check_salary (
    tmp_id in varchar2, 
    tmp_sal in number 
) 
IS 
v_sal number(6,0) := tmp_sal; 
v_min number(6,0); 
v_max number(6,0); 
ex_fail exception; 
cursor cur_select is 
    select min_salary, job_id, max_salary 
    from jobs where job_id = tmp_id; 

BEGIN 

for rec_something in cur_select loop 
    v_min := rec_something.min_salary; 
    v_max := rec_something.max_salary; 
    if v_sal >= v_min and v_sal <= v_max then 
     raise ex_fail; 
    end if; 
end loop; 
exception 
    when ex_fail then 
    dbms_output.put_line('Invalid salary ' || v_sal || ' must be between ' || v_min || ' and ' || v_max ||'.'); 
END; 
/
show errors; 


create or replace trigger check_salary_trg 
    after insert or update on employees 
    for each row 
declare 

begin 
    IF UPDATING or INSERTING THEN 
    execute check_salary(:NEW.job_id, :NEW.salary); 
    end if; 
end; 
/
show errors; 

エラーメッセージ:

PROCEDURE check_salary compiled 
No Errors. 
TRIGGER check_salary_trg compiled 
Warning: execution completed with warning 
5/13   PLS-00103: Encountered the symbol "CHECK_SALARY" when expecting one of the following: 

    := . (@ % ; immediate 
The symbol ":=" was substituted for "CHECK_SALARY" to continue. 
+0

は、代わりに '' execute'のcall'を使用してみてください – GregHNZ

答えて

2

変更し、それに:

あなたがPL/SQLブロック内のプロシージャを実行している
create or replace trigger check_salary_trg 
    after insert or update on employees 
for each row 
begin 
    IF UPDATING or INSERTING THEN 
    check_salary(:NEW.job_id, :NEW.salary); 
    end if; 
end; 
/
0

を確認することができ、スタックオーバーフロー例外は、dbms_output.put_linecheck_salary内部の手順の使用によるものです。

SQL * Plusのコマンドset serveroutput onはデフォルトでリトル・サイズを予約しているため、バッファ・サイズを指定するか、またはcheck_salaryプロシージャからdbms_output.put_lineを削除する必要があります。

デフォルトのバッファサイズの使用を増加させるためには、この:

set serveroutput on size 1000000

関連する問題