oracle存储过程多个参数,Oracle 当存储过程中的多个输入参数容许为空时

场景:

有一个存储过程p_test 带有多个输入参数code、name、number

p_test(code IN VARCHAR2,nameIN VARCHAR2,number IN VARCHAR2,resultList OUT sys_refcursor)

但是业务上要求这三个参数都允许为空,也就是都不是必填项

原本sql语句是写成这样的:

select * from temptbl a where a.code=code and a.name=name and a.number=number

设想:

一开始想到的是分别对每个参数进行空值判断,然后拼接sql,不为空的参数就写到where条件里去。但是对于简单的sql好说,对于复杂的sql不太可行,这样做代码会很乱。

结论:

百度后找到一个很有用的函数叫COALESCE(表达式1,表达式2,.....,表达式n)

它的作用是返回多个表达式中第一个非null的值,从左到右找寻,找到后即停止寻找并返回该非null值。

例子:coalesce(null,2,3)  返回值为:2

当然参数中的2和3也可写成表示式,如3+3、4+5之类的。或者其他数据类型。

回到刚刚的问题,此问题可以结合coalesce函数和like完成(或许还有更好的办法不过我现在只想到这个)

sql语句可以改为:

select * from temptbl a where a.code like coalesce(code,'%%') and a.name like coalesce(name,'%%') and a.number like coalesce(number,'%%')

那么当输入参数code为null时条件就变成a.code like '%%',即不限制a.code的值(不过a.code为null的值会过滤掉,如果实际业务要展示null值,需另行判断);当输入参数code不为null时条件就变成a.code like code,由于未加通配符,此查询等同于a.code=code。其他参数依次类推。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java,可以使用JDBC来调用存储过程,并将数组作为参数传递给存储过程。具体步骤如下: 1. 首先,需要创建一个连接到Oracle数据库的JDBC连接。 2. 然后,需要创建一个CallableStatement对象,该对象表示要执行的存储过程。 3. 接下来,使用setArray()方法将数组作为参数传递给存储过程。该方法需要两个参数,第一个参数存储过程参数名称,第二个参数一个java.sql.Array对象,该对象包含了要传递给存储过程的数组。 4. 最后,调用execute()方法执行存储过程。 以下是示例代码: ```java import java.sql.*; import oracle.jdbc.*; import oracle.sql.*; public class TestArray { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; try { // 创建JDBC连接 conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "username", "password"); // 创建CallableStatement对象 cs = conn.prepareCall("{call my_proc(?)}"); // 创建一个包含整数的数组 int[] array = {1, 2, 3, 4, 5}; // 将数组作为参数传递给存储过程 ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("MY_ARRAY_TYPE", conn); ARRAY inputArray = new ARRAY(descriptor, conn, array); cs.setArray(1, inputArray); // 执行存储过程 cs.execute(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (cs != null) cs.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 在上面的示例代码,假设存储过程参数名称为my_param,数组类型为MY_ARRAY_TYPE。可以使用ArrayDescriptor.createDescriptor()方法创建一个ArrayDescriptor对象,该对象表示数组类型。然后,使用该对象创建一个java.sql.Array对象,并将其作为参数传递给存储过程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值