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
oracle游标的使用
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,查看语句是否正确

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。