Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 触发器调用过程错误_Sql_Oracle_Stored Procedures_Triggers_Oracle10g - Fatal编程技术网

Sql 触发器调用过程错误

Sql 触发器调用过程错误,sql,oracle,stored-procedures,triggers,oracle10g,Sql,Oracle,Stored Procedures,Triggers,Oracle10g,我的扳机有点问题。我创建了一个程序来检查工资是否在某个范围内。如果它不在某个范围内,则引发异常。问题是,即使过程编译时没有错误,触发器也找不到过程 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 numb

我的扳机有点问题。我创建了一个程序来检查工资是否在某个范围内。如果它不在某个范围内,则引发异常。问题是,即使过程编译时没有错误,触发器也找不到过程

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;
将其更改为:

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;
/

在PL/SQL块中执行过程时,不使用

 EXECUTE syntax
有关执行的更多信息,请查看以下链接


堆栈溢出异常是由于使用了
dbms\u输出。请将行
放入
检查
过程中

SQL*Plus命令
set serveroutput on
默认保留较小的大小,您必须指定缓冲区大小或删除
dbms\u输出。从
检查
过程中放入行

要增加默认缓冲区大小,请使用以下命令:


将serveroutput设置为1000000大小

尝试使用
调用
而不是
执行
 EXECUTE syntax