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

存储过程/函数中对查询条件的判断处理

如图,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语句,就成了绑定的变量了,也就是只当做一个值来处理。。。