Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有查询的Oracle存储过程,其中可能缺少某些搜索条件_Oracle_Stored Procedures_Plsql_Oracle12c - Fatal编程技术网

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

带有查询的Oracle存储过程,其中可能缺少某些搜索条件,oracle,stored-procedures,plsql,oracle12c,Oracle,Stored Procedures,Plsql,Oracle12c,我使用的是Oracle12c,有一个存储过程,它接受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

我使用的是Oracle12c,有一个存储过程,它接受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 count*into return_msg from where sn_no=p_sn_no)准备select语句,而不是传递所有4个输入字段

存储过程调用仍然传递所有输入参数值,只有用户未提供的参数值才具有空值,因此您的查询应该利用这一点:

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.
  ...
试试这个:

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

欢迎来到SO。请接受并阅读并发布一个“KRISHT”,你可以考虑接受这个答案:亲爱的朋友:“巴巴罗斯·昂詹,是的,这个答案是有效的,但我没有找到一个选项来回答这个问题,接受的答案是SNNO,姓名,城市和电话都被定义为非空列。phone=phone只有在phone不为null的情况下才是真的。您需要将这些条件括在一起,因为默认的优先级将给出不同的结果。@WilliamRobertson谢谢,您当然是对的,而且显式分组运算符是一个好习惯。编辑。