存储过程/函数中对查询条件的判断处理
如图,select * from user 后面根据传入参数是否为空来判断是否要加上条件,目前我这样写
是不对的,会报错.请教要如何处理比较妥当
图中源代码如下:
CREATE OR REPLACE FUNCTION FUN_GETUSERDATA(userid_array IN VARCHAR2)
RETURN user_type_array AS
USER_REC_ARRAY user_type_array := user_type_array();
BEGIN
BEGIN
FOR record IN (select * from user u
if(length(userid_array) > 0)
where u.id in (userid_array)
end if;) LOOP
USER_REC_ARRAY.EXTEND();
USER_REC_ARRAY(USER_REC_ARRAY.COUNT) := user_type(record.id,
record.name,
record.no);
END LOOP;
END;
RETURN DECLARE_REC_ARRAY;
END FUN_GETUSERDATA;
------解决方案--------------------把if写出来试试
------解决方案--------------------sql语句里写个if?这样是不行的……没有这样的语法
select * from user u where u.id in (userid_array) or length(userid_array) = 0
可以这样写,但是性能就要受到影响了……
要么写成
if(length(userid_array) > 0) then
FOR record IN (select * from user u
where u.id in (userid_array)
) LOOP
xxx;
END LOOP;
else
FOR record IN (select * from user u
) LOOP
xxx;
END LOOP;
end if;
看起来也不甚好看……
根本原因,可能你用了别的数据库的思路来做oracle,这可能是行不通的。。。
据我猜测,userid_array里面可能含有多个userid?但是你直接把它放进sql语句,就成了绑定的变量了,也就是只当做一个值来处理。。。