oracle存储过程 拼sql,Oracle存储过程中使用参数游标结合动态sql拼接

前提

今天在编写业务的存储过程时,需要使用到AND条件的拼接,而根据业务逻辑要求存在多达10种排列组合,以往只有两三种排列组合时,我直接使用了PL/SQL的IF语句分支进行判断,简洁明了。

由于排列组合较多,并且sql语句也一致,便希望将sql抽取出来,作为全局的sql,再由WHERE拼接语句。这样一来,排列组合一次sql一次的情况得以解决,存储过程的代码冗余也就大大降低了。

问题

使用参数游标,即: [参数名] OUT sys_refcursor

游标最基本的使用方式,PL/SQL如下:

OPEN myCur FOR

SELECT * FROM person;

那如果需要在存储过程中使用输出游标结合动态sql拼接,该如何做呢?

解决方法

例子如下:

DECLARE

p_person_id varchar(255);

p_person_phone varchar(255);

SQL_Text varchar2(32760) := 'SELECT * FROM person WHERE 1 = 1 ';

myCur sys_refcursor;

BEGIN

IF p_person_id IS NOT NULL THEN

SQL_Text := SQL_Text || 'AND person_id = '' ' || p_person_id || ''' ';

END IF;

IF p_person_phone IS NOT NULL THEN

SQL_Text := SQL_Text || 'AND person_phone = '' ' || p_person_phone || ''' ';

END IF;

dbms_output.put_line(SQL_Text);

OPEN myCur FOR SQL_Text;

END;

注意事项:

使用参数游标时,OPEN-FOR可以直接使用来代替EXECUTE IMMEDIATE

动态SQL(SQL_Text)的长度是有限制的,保证自己的动态SQL拼接完毕之后长度不会溢出(网上也有其他方式以支持更长长度,请自行查询)

WHERE 1 = 1 用于方便拼接条件,并且注意空格的合理应用

开发时使用输出语句打印一下动态SQL,查看语句是否正确

原文:https://www.cnblogs.com/zhuang229/p/12381294.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值