当前位置: 首页 > 知识库问答 >
问题:

PL/SQL触发器错误:EXCECT fetch返回的行数超过了请求的行数

濮泳
2023-03-14

我很难理解PL/SQL触发器的问题所在。错误为:错误报告-SQL错误:ORA-01422:精确提取返回的行数超过请求的行数ORA-06512:在“System.trg_late_return”处,第6行ORA-04088:触发器“System.trg_late_return”执行过程中的错误01422。00000-“精确提取返回的行数超过请求的行数”*原因:精确提取中指定的行数小于返回的行数。*操作:重写查询或更改请求的行数

create or replace trigger trg_late_return
before update of DETAIL_RETURNDATE, DETAIL_DUEDATE on TY_DETAILRENTAL

declare 
  temp_date DATE:= SYSDATE;
  temp_due_date DATE:= SYSDATE;

BEGIN
  select DETAIL_RETURNDATE
  into temp_date
  from TY_DETAILRENTAL;

  select DETAIL_DUEDATE
  into temp_due_date
  from TY_DETAILRENTAL;

  IF temp_date is null
  THEN
    update TY_DETAILRENTAL
    set DETAIL_DAYSLATE=null;
  END IF;

  if temp_date <> null
  THEN
    if temp_date = trunc(temp_due_date) + 1
    then
      update TY_DETAILRENTAL
      set DETAIL_DAYSLATE=0;
    end if;

    if temp_date > trunc(temp_due_date) + 1
    then
      update TY_DETAILRENTAL
      set DETAIL_DAYSLATE = DETAIL_RETURNDATE - DETAIL_DUEDATE;
    end if;  
  end if;

END;
/ 

共有1个答案

黄跃
2023-03-14

您的所有查询或更新都没有过滤器(where子句),因此您正在处理整个表--这不可能是您想要的。您试图将这些列的所有值转换为标量变量,而标量变量只能容纳一个值。

触发器还针对您正在查询和更新的同一个表,这表明您实际上是指(或需要)行级触发器,而不是语句级触发器。

这意味着您需要为每一行添加,而不是请求和更新表,您可以对可用于行级触发器的newpseudorecord进行操作。

create or replace trigger trg_late_return
before update of detail_returndate, detail_duedate
on ty_detailrental
for each row
begin
  if :new.detail_returndate is null
  then
    :new.detail_dayslate := null;
  else
    if :new.detail_returndate = trunc(:new.detail_duedate) + 1
    then
      :new.detail_dayslate := 0;
    elsif :new.detail_returndate > trunc(:new.detail_duedate) + 1
    then
      :new.detail_dayslate := :new.detail_returndate - :new.detail_duedate;
    end if;  
  end if;
end;
/

当最终更新数据库中实际匹配的行时,将使用对newpseudorecord所做的更改。

阅读更多关于新/旧伪oreords的信息,以及关于触发器的信息。

 类似资料:
  • 在第1行声明 * 错误: ORA-01422:精确提取返回的行数超过请求的行数 ORA-06512:在第11行 这是我的代码。

  • Select语句在Resault中返回多行。是否可以用此函数获得resault中的所有行? ORA-01422:精确提取返回的行数多于请求的行数

  • 剧本: 新的SQL和PL/SQL,所以我将感谢任何帮助。

  • 主要内容:创建触发器,示例在本章中,我们将讨论和学习PL/SQL中的触发器。 触发器是存储的程序,在发生某些事件时会自动执行或触发。事实上,触发器是为了响应以下任何事件而被执行的 - 数据库操作(DML)语句(,或) 数据库定义(DDL)语句(,或)。 数据库操作(,,,或)。 可以在事件关联的表,视图,模式或数据库上定义触发器。 使用触发器的好处 触发器可以用于以下目的 - 自动生成一些派生列值 强化参照完整性 事件记录

  • 问题内容: 我有一些代码需要调试帮助,但我认为,如果我能运行其中之一,我将可以得到其余的代码(哦,我希望如此)。 我正在尝试通过sqlplus在我学校的服务器上运行的表上执行此操作,如果有帮助的话。 问题答案: 遇到错误时,指定什么错误总是有帮助的。触发器中的调用中存在语法错误。该过程需要两个参数,一个数字和一个字符串。您传入的是一个长字符串的单个参数。 假设您的表格中有一列,则该值应有效。