【问题标题】:ORA-01403: no data found error in businesshr triggerORA-01403: businesshr 触发器中未找到数据错误
【发布时间】:2019-10-22 23:22:16
【问题描述】:

我正在尝试在以下表格上触发 oracle sqlplus

SQL> create table Employees1727
  2  (
  3  emp_id number(4) primary key,
  4  last_name varchar2(15),
  5  first_name varchar2(15),
  6  email varchar2(30),
  7  phone_no varchar2(12),
  8  hire_date date,
  9  job_id varchar2(10), 
 10  salary number(10),
 11  commission_pct number(2,2),
 12  manager_id number(4) references Employees1727(emp_id), 
 13  dept_id number(3)
 14  );

表已创建。

SQL> 
SQL> 
SQL> create table Departments1727
  2  (
  3  dept_id number(4),
  4  dept_name varchar2(15),
  5  manager_id number(4) references Employees1727(emp_id), 
  6  loc_id number(4)
  7  );

表已创建。

SQL> create or replace trigger businesshr
  2  before insert or update or delete on Employees1727
  3  for each row
  4  begin
  5  if to_char(sysdate, 'hh24') >= '05' AND
  6     to_char(sysdate, 'hh24') <= '18'
  7  then
  8  select * into 
  9  :new.emp_id,
 10  :new.last_name,
 11  :new.first_name,
 12  :new.email,
 13  :new.phone_no,
 14  :new.hire_date,
 15  :new.job_id, 
 16  :new.salary,
 17  :new.commission_pct,
 18  :new.manager_id, 
 19  :new.dept_id
 20  from Employees1727 ;
 21  else
 22  raise_application_error (-20000, 'Employee info may not be modified at this time!') ;
 23  end if;
 24  end businesshr;
 25  /

触发器已创建。

SQL> insert into Employees1727 values(1,'Patil','Pratik','Pratik@gmail.com',23994723, '12-FEB-2010',101,15000,0,1,2);
insert into Employees1727 values(1,'Patil','Pratik','Pratik@gmail.com',23994723, '12-FEB-2010',101,15000,0,1,2)
        *

第 1 行出现错误:
ORA-01403: 未找到数据
ORA-06512:在“SCOTT.BUSINESSHR”,第 5 行
ORA-04088: 执行触发器“SCOTT.BUSINESSHR”时出错

【问题讨论】:

  • 您的顾虑还不清楚...也格式化代码删除行号。

标签: oracle sqlplus


【解决方案1】:

在触发器中,您不应该从正在运行触发器的表中选择,因为您可能会收到mutating table 错误。在这种情况下根本不需要选择,只需写在这里:

create or replace trigger businesshr
  before insert or update or delete on Employees1727 
  for each row
  begin
    if to_char(sysdate, 'hh24') < '05' or '18' < to_char(sysdate, 'hh24') then
      raise_application_error (-20000, 'Employee info may not be modified at this time!') ;
    end if;
  end businesshr;

【讨论】:

  • 是的,但我只想在营业时间对数据库执行操作,这就是为什么我必须使用 select into 在营业时间插入记录。
  • 这就是这个触发器的作用。如果您尝试在营业时间之前或之后插入数据,则会引发错误。否则插入会成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2013-12-27
  • 2015-01-23
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多