带有可能缺少某些搜索条件的查询的 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 &lt;table_name&gt; 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_nonamecityphone 是否都定义为 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: 缺少右括号

Oracle SQL - 使用 Case 语句缺少关键字错误的更新查询

oracle 中查询按某种要求条件查询结果,如何能够提高效率?