带有查询的Oracle存储过程,其中可能缺少某些搜索条件
我使用的是Oracle12c,有一个存储过程,它接受4个输入字段,使用相同的字段查询数据库并返回结果集。但是,这4个输入字段是来自前端的用户输入值,因此用户可以输入也可以不输入所有4个输入字段。我需要使用它接收到的任何值执行存储过程,并忽略其余的值 存储过程定义:带有查询的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
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谢谢,您当然是对的,而且显式分组运算符是一个好习惯。编辑。