Oracle SQL 动态拼接Where后面的筛选条件

本文深入探讨了SQL查询优化的关键步骤,包括创建临时表、使用自定义函数拼接筛选条件以及执行SQL操作以提高数据处理效率。通过实例演示,展示了如何在PL/SQL环境中实现复杂查询,确保数据检索快速准确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TBL_NAME COLM_NAME OPER_CODE RULE_CMPAR_VALUE AND_OR_OR
STORE_DISTRO RTE_ID = 22410034 A
STORE_MASTER ZONE = 贵州


需要拼接成:

 STORE_DISTRO.RTE_ID='22410034' and  STORE_MASTER.ZONE='贵州' 



1. 创建临时表存放查询后的数据,临时表可以根据实际查询结果创建(create table wmedi.wave_distro_filter... ..)

2. 创建自定义函数get_wave_query_param,用来拼接完整的Where条件

3. 定义sql字符,后面接上get_wave_query_param函数返回的筛选条件,通常情况下PL/SQL是不能直接运行的,需要用到execute immediate执行SQL,写入临时表,最后从临时表读取数据,(如果直接用execute immediate ‘select ... from ...’,很难返回出结果集,所以采用临时表存放数据)


declare strsql varchar2(3000);
strwhere varchar2(1000);
begin
execute immediate 'truncate table wmedi.wave_distro_filter';
strsql:='insert into wmedi.wave_distro_filter select store_distro.* ' ||
'from store_distro  '||
'inner join store_master on store_distro.store_nbr=store_master.store_nbr' ||
' where ' ;
select get_wave_query_param('201207110076') into strwhere from dual;
strsql:=strsql || strwhere;
execute immediate strsql;
end;


create or replace function get_wave_query_param (p_wave_nbr in carton_hdr.wave_nbr%type)
return varchar as
v_query_param varchar2(1000);
begin

select replace(text,';','') into v_query_param  from (
select row_number()over(partition by groupname order by groupname,lvl desc) rn,groupname,text from (
select t.groupname,level lvl,SYS_CONNECT_BY_PATH(t.strwhere,' ; ') text from (
select row_number()over(partition by rule_sel_dtl.rule_id order by rule_sel_dtl.sel_seq_nbr) id,'sqlwhere' groupname,tbl_name||'.'||colm_name||oper_code||''''||rule_cmpar_value||''' '||(case and_or_or when 'A' then 'and' when 'O' then 'or' else '' end) strWhere
  from rule_sel_dtl
where rule_id in (select rule_id
                     from wave_rule_parm
                    where wave_parm_id in
                          (select wave_parm_id
                             from wave_parm
                            where wave_nbr = p_wave_nbr)
                      and rule_prty = 1)
) t connect by t.groupname=prior t.groupname and id-1=prior id
) t
) t where t.rn=1;

return v_query_param;
exception
  when others then
    return null;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值