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

Oracle:ORA-01422:精确提取返回的行数多于请求的行数

宗安宁
2023-03-14
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;
DECLARE
    TCPL NUMBER;
BEGIN
    TCPL := GET_PUBLIC_COURSE_AMMOUNT(90);  
END;

ORA-06512:在“sys.dbms_sql”处,第1721行

我确信这个函数的结果只有一行,我不想使用游标

共有1个答案

梁丘高朗
2023-03-14

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

在PL/SQL中给变量和参数加前缀是很好的做法,这样就不会发生这样的错误,例如:

  • 变量:v_
  • 常数:C_
  • 游标:cur_
  • 参数:P_
  • 类型:t_(或append_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;
 类似资料: