动态SQL的应用案例

select 的 语句就用 open p_rc for

insert   update  delete 的语句就用  execute immediate 

下面给出具体实例:

动态SQL在select 语句上的使用:

create or replace procedure hq_cin(v_locCd_i     in varchar2,
                                   v_beginDate_i in varchar2,
                                   v_endDate_i   in varchar2,
                                   p_rc out sys_refcursor)
as
    v_beginDate varchar2(100);
    v_endDate   varchar2(100);
    v_sql_str   varchar2(30000);
    v_loc_i      varchar2(20);


begin
  v_loc_i:='@LOC'||v_locCd_i;
    v_beginDate := 'to_date(''' || v_beginDate_i || ' 0600'',' ||
                     '''YYYY-MM-DD HH24MI''' || ')';
    v_endDate   := 'to_date(''' || v_endDate_i || ' 0600'',' ||
                     '''YYYY-MM-DD HH24MI''' || ') +1 ';
                     
v_sql_str :='select ''HQ_POS_PROFIT'', ''HQ'', count(*), sum(hpf_sell_amt)
  from HQ_POS_PROFIT
  where hpf_location_cd =' || v_locCd_i || ' and hpf_rcre_date between '||
       v_beginDate || ' and ' || v_endDate ||
' union
  select ''HQ_POS_PROFIT'', ''CIN'', count(*), sum(hpf_sell_amt)
  from '|| 'HQ_POS_PROFIT'|| v_loc_i ||
 ' where hpf_location_cd ='|| v_locCd_i || ' and hpf_rcre_date between '||
       v_beginDate || ' and ' || v_endDate ||

      
' union
  select ''HQ_POS_STOCK_MOVE'', ''HQ'', count(*), sum(0)
  from HQ_POS_STOCK_MOVE
  where HQM_LOC_CD = '|| v_locCd_i ||' and HQM_RCRE_DATE between '||
       v_beginDate || ' and ' || v_endDate ||
' union
  select ''HQ_POS_STOCK_MOVE'', ''CIN'', count(*), sum(0)
  from '|| 'HQ_POS_STOCK_MOVE'|| v_loc_i ||
 ' where HQM_RCRE_DATE between '||
       v_beginDate || ' and ' || v_endDate;

dbms_output.put_line(sqlerrm);
open p_rc for  v_sql_str;
commit;
end hq_cin;


动态SQL在select 语句上的使用:

function MovePOS_STOCK(v_beginDate_i in varchar2,
                         v_endDate_i   in varchar2,
                         v_locCode_i   in varchar2,
                         v_exception_o OUT VARCHAR2) return string is
    v_beginDate varchar2(100);
    v_endDate   varchar2(100);
    v_sql_str   varchar2(8000);
    v_sql_str1  varchar2(800);
  
  begin
    if (v_beginDate_i is null or v_endDate_i is null) then
      v_beginDate := 'to_date(''' || to_char(sysdate - 2, 'yyyy-mm-dd') ||
                     ' 0600'',' || '''YYYY-MM-DD HH24MI''' || ')';
      v_endDate   := 'to_date(''' || to_char(sysdate, 'yyyy-mm-dd') ||
                     ' 0559'',' || '''YYYY-MM-DD HH24MI''' || ') + 1';
    else
      v_beginDate := 'to_date(''' || v_beginDate_i || ' 0600'',' ||
                     '''YYYY-MM-DD HH24MI''' || ')';
      v_endDate   := 'to_date(''' || v_endDate_i || ' 0559'',' ||
                     '''YYYY-MM-DD HH24MI''' || ') + 1';
    end if;
  
    update HQ_POS_STOCK_TEMP
       set HPC_REPEAT_FLG = 'Y'
     where (HPC_LOC_CD,HPC_DATA_RCRE_DATE,HPC_GOOD_ID,HPC_PLACE_ID,HPC_PLACE_TYPE) in (select HPC_LOC_CD,HPC_DATA_RCRE_DATE,HPC_GOOD_ID,HPC_PLACE_ID,HPC_PLACE_TYPE
                            from HQ_POS_STOCK_TEMP
                           where HPC_MEGRE_FLG = 'N'
                             AND HPC_REPEAT_FLG = 'N'
                           group by HPC_LOC_CD,HPC_DATA_RCRE_DATE,HPC_GOOD_ID,HPC_PLACE_ID,HPC_PLACE_TYPE
                          having count(*) > 1)
       and HPC_TIMESTAMP not in (select max(HPC_TIMESTAMP)
                           from HQ_POS_STOCK_TEMP
                           where HPC_MEGRE_FLG = 'N'
                             AND HPC_REPEAT_FLG = 'N'
                          group by HPC_LOC_CD,HPC_DATA_RCRE_DATE,HPC_GOOD_ID,HPC_PLACE_ID,HPC_PLACE_TYPE
                         having count(*) > 1);
    commit;
  
    v_sql_str := 'merge into HQ_POS_STOCK P
       using (select *
               from HQ_POS_STOCK_TEMP
              where HPC_DATA_RCRE_DATE between ' ||
                 v_beginDate || ' and ' || v_endDate;
    if v_locCode_i is not null then
      v_sql_str := v_sql_str || ' and HPC_LOC_CD = ' || v_locCode_i;
    end if;
    v_sql_str := v_sql_str || ' and HPC_MEGRE_FLG =''N'' and HPC_REPEAT_FLG=''N'' order by HPC_TIMESTAMP) T
      ON (P.HPC_LOC_CD = T.HPC_LOC_CD and P.HPC_GOOD_ID=T.HPC_GOOD_ID 
          and P.HPC_PLACE_ID=T.HPC_PLACE_ID and P.HPC_PLACE_TYPE=T.HPC_PLACE_TYPE and P.HPC_DATA_RCRE_DATE=T.HPC_DATA_RCRE_DATE)
      when matched then
        update
           set 
               P.HPC_COUNT          = T.HPC_COUNT
      when not matched then
        insert
          (P.HPC_DATA_RCRE_DATE,
           P.HPC_LOC_CD,
           P.HPC_PLACE_TYPE,
           P.HPC_PLACE_ID,
           P.HPC_GOOD_ID,
           P.HPC_COUNT)
        values
              (T.HPC_DATA_RCRE_DATE,
               T.HPC_LOC_CD,
               T.HPC_PLACE_TYPE,
               T.HPC_PLACE_ID,
               T.HPC_GOOD_ID,
               T.HPC_COUNT)';
  
    v_sql_str1 := 'update HQ_POS_STOCK_TEMP
         set HPC_MEGRE_FLG = ''Y'', HPC_MEGRE_TIME = sysdate
       where HPC_REPEAT_FLG=''N'' and HPC_DATA_RCRE_DATE between ' ||
                  v_beginDate || ' and ' || v_endDate;
    if v_locCode_i is not null then
      v_sql_str1 := v_sql_str1 || ' and HPC_LOC_CD = ' || v_locCode_i;
    end if;
    execute immediate v_sql_str;
    execute immediate v_sql_str1;
    commit;
    return 0;
  exception
    when others then
      v_exception_o := sqlerrm;
      return 4;
  end MovePOS_STOCK;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值