当Oracle的存储过程的入参名称与表过滤字段名称相同时,编译都可以通过,但执行就会报如下的错误:
ORA-01422: 实际返回的行数超出请求的行数
如下面的的存储过程,就会报上面的错误
create or replace procedure poor.POrdersInsert(
EncounterID in varchar2 -- 就诊Id
)as
RegisterId number(10,0); --挂号Id
begin
--到这里就会提示返回多行而报错
select extension into RegisterId from prpa.EncounterII where encounterId=EncounterID;
dbms_output.put_line('挂号Id:'||RegisterId);
end;
解决方法很简单,只需要定义一个临时变量,用来存储 ‘存储过程’的的入参,当表的过滤条件使用到存储过程入参作为过滤条件时,全部用临时变量代替,所以上面有问题的sql改入如下:
create or replace procedure poor.POrdersInsert(
EncounterID in varchar2 --就诊Id
)as
V_EncounterId int; --定义临时变量
RegisterId number(10,0); --挂号Id
begin
V_EncounterId:=EncounterID; --使用临时变量来存储 ‘存储过程’的入参
select extension into RegisterId from prpa.EncounterII where encounterId=V_EncounterId; --过滤条件全部使用临时变量代替
dbms_output.put_line('挂号Id:'||RegisterId);
end;