带有可能缺少某些搜索条件的查询的 Oracle 存储过程
Posted
技术标签:
【中文标题】带有可能缺少某些搜索条件的查询的 Oracle 存储过程【英文标题】:Oracle stored procedure with a query where some search criteria may be missing 【发布时间】:2018-07-27 17:41:56 【问题描述】:我使用的是 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输入字段?
【问题讨论】:
欢迎来到 SO。请使用tour 并阅读How to Ask 并发布minimal reproducible example 【参考方案1】:试试这个:
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
【讨论】:
@KrishT 那么,亲爱的朋友,你可以考虑接受答案:) @BarbarosÖzhan,是的,这个答案有效,但我没有找到通过接受答案来关闭这个问题的选项sn_no
、name
、city
和 phone
是否都定义为 NOT NULL
列? phone = phone
仅在 phone
不为空时为真。【参考方案2】:
存储过程调用仍然传递所有输入参数值,只有那些不是由用户提供的值才会有 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.
...
【讨论】:
您需要将条件括起来,因为默认优先级会给出不同的结果。 @WilliamRobertson 谢谢,你当然是对的,无论如何,明确的运算符分组是一个好习惯。已编辑。以上是关于带有可能缺少某些搜索条件的查询的 Oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
具有更改查询的 Oracle SQL Tuning Advisor
ORACLE SQL 错误 - 缺少右括号 - 查询 [关闭]
带有 ORA-00936 的 SQL 查询实例:缺少表达式错误
执行 Oracle Ad Hoc 查询时绑定参数出错; ORA-00907: 缺少右括号