带有查询的Oracle存储过程,其中可能缺少某些搜索条件

时间:2018-07-27 17:41:56

标签: oracle stored-procedures plsql oracle12c

我正在使用Oracle 12c,并且具有一个存储过程,该存储过程接受4个输入字段,使用相同的字段查询数据库并返回结果集。但是,这4个输入字段是来自前端的用户输入值,因此用户可能会或可能不会输入所有4个输入字段。我将需要使用接收到的任何值来执行存储过程,而忽略其余部分。

存储过程定义:

procedure retrieve_data (
p_sn_no in integer,
p_name in varchar2,
p_city in varchar 2,
p_phone in integer,
return_msg out number)
is begin
  select count(*) into return_msg from <table_name> 
    where sn_no=p_sn_no and name=p_name
    and city=p_city and phone=p_phone
end

要求是使用任何或所有输入参数来调用上述存储过程,但是如何在具有全部或少量输入字段的存储过程中准备select语句,而不是像select count(*) into return_msg from <table_name> where sn_no=p_sn_no传递所有4个输入字段?

2 个答案:

答案 0 :(得分:0)

存储过程调用仍会传递所有输入参数值,只有用户未提供的那些参数才具有NULL值,因此您的查询应利用该参数:

select count(*) into return_msg from <table_name> 
where (sn_no=p_sn_no or p_sn_no is null) 
  and (name=p_name or p_name is null) -- etc.
  ...

答案 1 :(得分:0)

尝试一下:

procedure retrieve_data 
  (return_msg out number, 
   p_sn_no in integer DEFAULT NULL, 
   p_name in varchar2 DEFAULT NULL, 
   p_city in varchar2  DEFAULT NULL, 
   p_phone in integer DEFAULT NULL) 
is 
begin 
  select count(*) 
    into return_msg 
    from 
    where sn_no = NVL(p_sn_no, sn_no) 
      and name = NVL(p_name, name) 
      and city = NVL(p_city, city) 
      and phone = NVL(p_phone, phone) 
end