【问题标题】:Oracle: ORA-01422: exact fetch returns more than requested number of rowsOracle:ORA-01422:精确提取返回的行数超过了请求的行数
【发布时间】:2020-11-02 07:33:02
【问题描述】:

我有两个表COURSESCOURSE_PRICELIST,我创建了这个函数来获取一个值并将这个值放入一个变量中:

create or replace function "GET_PUBLIC_COURSE_AMMOUNT" (course_id in number)
  return number
is
  TC_Ammount number;
begin
  select COURSE_PRICELIST.PRICE
    into TC_Ammount
    from COURSES
    join COURSE_PRICELIST 
      on COURSES.ID = COURSE_PRICELIST.COURSE_ID
   where COURSE_PRICELIST.ACTIVE = 1
     and COURSES.ID = course_id;
  return TC_Ammount;
end;

问题是当我运行这个select 语句时它只返回一行(这正是我想要的),但是当我试图将此语句用作函数时:

DECLARE
    TCPL NUMBER;
BEGIN
    TCPL := GET_PUBLIC_COURSE_AMMOUNT(90);  
END;

我有这个错误:

ORA-01422:精确提取返回的行数超过了请求的行数

ORA-06512:在“PAADB.GET_PUBLIC_COURSE_AMMOUNT”,第 8 行

ORA-06512:在第 4 行

ORA-06512:在“SYS.DBMS_SQL”,第 1721 行

我确定这个函数的结果只有一行,我不想使用cursor

【问题讨论】:

  • 好吧,显然你的SELECT 确实返回不止一行。您需要检查您的参数并使用完全相同的course_id 执行函数。
  • 感谢您的回复!由于每个 course_id 的限制 (COURSE_PRICELIST.ACTIVE =1),我只有一个有效价格,我对其进行了三次检查。也许问题是因为 course_id 是我的第二个表(COURSE_PRICELIST)的 fk,并且允许在此表中添加多次相同的 course_id....例如,我在此表中有三个 course_id = 90 但只有一个是活跃。

标签: oracle oracle-sqldeveloper


【解决方案1】:

您的问题是函数参数course_id 与表COURSE_PRICELIST 中的列同名。因此在select 中,它的行为类似于1 = 1 并返回所有行。

在 PL/SQL 中为变量和参数添加前缀是一种很好的做法,这样就不会发生此类错误,一些示例:

  • 变量:v_
  • 常量:c_
  • 光标:cur_
  • 参数:p_
  • 类型:t_(或附加 _tabt/_rect)
  • 还有很多其他的......

试试:

create or replace function GET_PUBLIC_COURSE_AMMOUNT (p_course_id in number)
  return number
is
  v_TC_Ammount number;
begin
  select COURSE_PRICELIST.PRICE
    into v_TC_Ammount
    from COURSES
    join COURSE_PRICELIST 
      on COURSES.ID = COURSE_PRICELIST.COURSE_ID
   where COURSE_PRICELIST.ACTIVE = 1
     and COURSES.ID = p_course_id;
  return v_TC_Ammount;
end;

【讨论】:

  • 很高兴,请不要忘记将您的问题标记为已回答。祝你有美好的一天。
猜你喜欢
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2021-06-14
  • 2019-01-27
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多