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.
4

3 に答える 3

2

次のように変更します。

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;
/
于 2012-04-25T06:10:53.620 に答える
0

dbms_output.put_lineスタック オーバーフロー例外は、内部check_salaryプロシージャの使用によるものです。

SQL*Plus コマンドはデフォルトで小さなサイズを予約します。バッファ サイズを指定するか、 fromプロシージャset serveroutput onを削除する必要があります。dbms_output.put_linecheck_salary

デフォルトのバッファ サイズを増やすには、次を使用します。

set serveroutput on size 1000000

于 2013-01-16T12:33:06.650 に答える
0

PL/SQL ブロック内でプロシージャを実行する場合、

 EXECUTE syntax

実行の詳細については、以下のリンクを確認してください。

http://docstore.mik.ua/orelly/oracle/prog2/ch23_01.htm

于 2012-04-25T11:08:52.813 に答える