creating parameterized views in oracle11g

前端 未结 3 1590
Happy的楠姐
Happy的楠姐 2020-11-28 12:20

I have a big query with nesting and left join and Ineed to create a view out of it so as not to run it from the application. The issue is I need the date range and some othe

3条回答
  •  [愿得一人]
    2020-11-28 12:35

    To use parameters in a view one way is to create a package which will set the values of your parameters and have functions that can be called to get those values. For example:

    create or replace package MYVIEW_PKG as
      procedure SET_VALUES(FROMDATE date, TODATE date);
    
      function GET_FROMDATE
        return date;
    
      function GET_TODATE
        return date;
    end MYVIEW_PKG;
    
    create or replace package body MYVIEW_PKG as
      G_FROM_DATE   date;
      G_TO_DATE     date;
    
      procedure SET_VALUES(P_FROMDATE date, P_TODATE date) as
      begin
        G_FROM_DATE := P_FROMDATE;
        G_TO_DATE := P_TODATE;
      end;
    
      function GET_FROMDATE
        return date is
      begin
        return G_FROM_DATE;
      end;
    
      function GET_TODATE
        return date is
      begin
        return G_TO_DATE;
      end;
    end MYVIEW_PKG;
    

    Then your view can be created thus:

    create or replace view myview as
        select 
            d.dateInRange as dateval,
            eventdesc,
            nvl(td.dist_ucnt, 0) as dist_ucnt
        from (
            select 
                MYVIEW_PKG.GET_FROMDATE + rownum - 1 as dateInRange
            from all_objects
            where rownum <= MYVIEW_PKG.GET_FROMDATE - MYVIEW_PKG.GET_TODATE + 1
        ) d
        left join (
            select 
                to_char(user_transaction.transdate,'dd-mon-yyyy') as currentdate,
                count(distinct(grauser_id)) as dist_ucnt,
                eventdesc 
            from
                gratransaction, user_transaction 
          where gratransaction.id = user_transaction.trans_id and 
          user_transaction.transdate between MYVIEW_PKG.GET_FROMDATE and MYVIEW_PKG.GET_TODATE
            group by  to_char(user_transaction.transdate, 'dd-mon-yyyy'), eventdesc 
        ) td on td.currentdate = d.dateInRange order by d.dateInRange asc;
    

    And to run it you must set the values first:

    exec MYVIEW_PKG.SET_VALUES(trunc(sysdate)-1,trunc(sysdate));
    

    And then calls to it will use these values:

    select * from myview;
    

提交回复
热议问题