日期:2014-05-17  浏览次数:20756 次

求一存储过程的写法(简单逻辑处理)
有这样一个存储过程,四个输入参数,一个输出参数。

create   procedure   searchUsers(
              i_usr_id   in   userinfo.usr_id%type;
              i_usr_name   in   userinfo.usr_name%type;
              i_usr_name   in   userinfo.usr_name%type;
              i_usr_name   in   userinfo.usr_name%type;
              o_resulet   out   cursor;
)   is
begin
...
end;

我想在存储过程中用四个输入参数对userinfo表进行查询。将结果保存在cursor中。

执行查询的时候,我这样写
select   (...)   from   userinfo   where   usr_id   =   i_usr_id   and   usr_name   =   i_usr_name   ...

问题在这里,这四个参数都允许为空,比如usr_id为空的话,就得写成where   usr_id   is   null...(就不能用等号了,否则执行会报错)

那这个逻辑我该如何来实现呢?


对pl/sql我实在了解甚少,还请朋友们指点。不胜感激。

------解决方案--------------------
--类似这样就可以了
create procedure searchUsers(
i_usr_id in userinfo.usr_id%type;
i_usr_name in userinfo.usr_name%type;
i_usr_name in userinfo.usr_name%type;
i_usr_name in userinfo.usr_name%type;
o_resulet out sys_refcursor;
) is
sqlstr varchar2(4000);
begin
sqlstr:= 'select * from table1 where '
if i_usr_id is null then
sqlstr:=sqlstr|| ' i_usr_id is null ';
else
sqlstr:=sqlstr|| ' i_usr_id = ' ' '||i_usr_id|| ' ' ' ';
end if;
if i_usr_name is null then
sqlstr:=sqlstr|| ' and i_usr_name is null ';
else
sqlstr:=sqlstr|| ' and i_usr_name = ' ' '||i_usr_name|| ' ' ' ';
end if;
...................
open o_resulet for sqlstr;
end;
------解决方案--------------------
如果i_usr_id为空则查询全部,如果不为空则查询相应条件。
(i_usr_id is null or usr_id = i_usr_id)

如果i_usr_id为空则查询usr_id为空的记录,用:
nvl(usr_id, '@@@@@ ') = nvl(i_usr_id, '@@@@@ ')
usr_id中不能保存有@@@@@这种记录。