ORACLE 实际返回的行数超出请求的行数
这是我创建的过程:createorreplaceproceduretest(p_idinwf_countries.region_id%type,p_elevationin...
这是我创建的过程:
create or replace procedure test
(p_id in wf_countries.region_id%type,
p_elevation in wf_countries.HIGHEST_ELEVATION%type,
p_name out wf_countries.country_name%type) is
begin
select country_name into p_name
from wf_countries
where region_id = p_id
and HIGHEST_ELEVATION > p_elevation;
end test;
这是我创建的调用上面过程的代码:
declare
a_name wf_countries.country_name%type;
begin
test(5,2000,a_name);
DBMS_OUTPUT.PUT_LINE(a_name);
end;
但运行调用的时候,提示“ORA-01422: 实际返回的行数超出请求的行数"这个错误。有高手帮我修改下吗?谢谢了! 展开
create or replace procedure test
(p_id in wf_countries.region_id%type,
p_elevation in wf_countries.HIGHEST_ELEVATION%type,
p_name out wf_countries.country_name%type) is
begin
select country_name into p_name
from wf_countries
where region_id = p_id
and HIGHEST_ELEVATION > p_elevation;
end test;
这是我创建的调用上面过程的代码:
declare
a_name wf_countries.country_name%type;
begin
test(5,2000,a_name);
DBMS_OUTPUT.PUT_LINE(a_name);
end;
但运行调用的时候,提示“ORA-01422: 实际返回的行数超出请求的行数"这个错误。有高手帮我修改下吗?谢谢了! 展开
1个回答
展开全部
原因:
用where region_id = p_id and HIGHEST_ELEVATION > p_elevation这个条件查询返回的记录肯定不止一行,也就是说有多个country_name满足条件。
改正方法:
select top 1 country_name into p_name……
或者 …where region_id = p_id and HIGHEST_ELEVATION > p_elevation and rownum = 1
加上top 1 或rownum=1 限制只取查询结果的第一行,这样赋值就是唯一的了。
用where region_id = p_id and HIGHEST_ELEVATION > p_elevation这个条件查询返回的记录肯定不止一行,也就是说有多个country_name满足条件。
改正方法:
select top 1 country_name into p_name……
或者 …where region_id = p_id and HIGHEST_ELEVATION > p_elevation and rownum = 1
加上top 1 或rownum=1 限制只取查询结果的第一行,这样赋值就是唯一的了。
追问
我知道。但我就是想要返回多行记录。那这样的话该怎么改呢?
追答
那就只能用oracle pl/sql游标了,但是只能一条一条的处理,不要加函数传出值了。
给你个参考:
create or replace procedure test
(p_id in wf_countries.region_id%type,
p_elevation in wf_countries.HIGHEST_ELEVATION%type) is
declare
cursor my_cursor is
select country_name from wf_countries where region_id = p_id and HIGHEST_ELEVATION > p_elevation;
p_name wf_countries.country_name%type;
begin
open my_cursor;
loop
fetch my_cursor into p_name;
exit when my_cursor%not found;
DBMS_OUTPUT.PUT_LINE(p_name);
end loop;
close my_cursor;
end;
再直接调用 test(5,2000)就行。
我没调试不知道能不能跑通,你最好看看oracle游标这方面的介绍,再自己动手做做,祝顺利!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询