【问题标题】:Can I create parameterized views in oracle我可以在 oracle 中创建参数化视图吗
【发布时间】:2020-07-17 08:30:20
【问题描述】:

我有这样的查询

SELECT ID,REF_ID,BATCHNO FROM reporttbl
where POSTING_DT >= '06/01/2020' and POSTING_DT <= '06/30/2020'

而且我每个月都需要它,所以我想把它放在一个视图中,但是随着每个月的日期都在变化,有一个日期参数可以在调用它时传递给视图会很棒。有没有办法让我做到这一点? 我是甲骨文的新手,感谢每一个帮助。谢谢你。

【问题讨论】:

  • 你从哪里调用它?例如,来自 SQL Developer/Plus/Toad 的应用程序?
  • @TonyAndrews from oracle sql developer
  • 您想查看当前月份 trunc(sysdate,'MM') 还是上个月 add_months(trunc(sysdate,'MM'),-1)

标签: oracle view parameterized


【解决方案1】:

从 19.6 开始,您可以使用 SQL macros 创建参数化视图。

create or replace function get_month (
  tab dbms_tf.table_t, start_date date, end_date date
) return varchar2 sql_macro as
  retval int;
begin
  return 'select * from tab 
    where dt >= start_date and dt < end_date + 1';
end get_month;
/

create table t (
  c1 int, dt date
);

insert into t 
with rws as (
  select level c1, add_months ( date'2019-12-25', level ) dt 
  from   dual
  connect by level <= 10
)
  select * from rws;
  
select * from get_month ( 
  t, date'2020-06-01', date'2020-07-01' 
);

C1    DT                     
    6 25-JUN-2020 00:00:00    

select * from get_month ( 
  t, date'2020-08-01', date'2020-09-01' 
);

C1    DT                     
    8 25-AUG-2020 00:00:00   

【讨论】:

  • 感谢今天的每天学习一个新的 Oracle 功能
【解决方案2】:

此查询返回上个月的数据,即查询时当前月份之前的月份 (= sysdate)。

您使用 trunc'MM' 来获得月份的第一个,然后使用 add_months 来计算算术

SELECT ID,REF_ID,BATCHNO FROM reporttbl
where POSTING_DT >= add_months(trunc(sysdate,'MM'),-1) and POSTING_DT <  trunc(sysdate,'MM')

【讨论】:

    【解决方案3】:

    另一种方法是使用从表中检索参数的函数,因此您无需操作任何 DDL。这里的想法是

    • 使用表格存储参数,基本上需要参数值和参数说明。
    • 当输入为参数名称时,使用函数检索该参数的值
    • 在视图中使用函数调用。
    • 然后您可以通过修改参数表的值来自动操作视图。

    表格

    create table my_param_table 
    ( param_description varchar2(100) , 
      param_value varchar2(100),
      enabled     varchar2(1)
    ) ;
    

    功能

    create or replace function f_retr_param  ( p_value in varchar2 )
    return varchar2
    is 
    declare
    v_value my_param_table.value_param%type;
    begin
      select value into v_value from my_table_of_parameters 
      where upper(value_param) = upper(p_value) ;
      return v_value;
      exception when others then raise;
    end;
    / 
    

    查看

    create or replace force view my_view as 
    SELECT ID,REF_ID,BATCHNO FROM reporttbl
    where POSTING_DT >= f_retr_param ( p_value => 'p_start_date' );
    and POSTING_DT <= f_retr_param ( p_value => 'p_end_date' );
    

    【讨论】:

      【解决方案4】:

      有一些方法可以“参数化”视图,例如使用 Oracle 上下文,但它们通常不是很有用,当然也不适合您的情况。

      如果您的查询真的只是从一个仅将日期作为谓词的表中进行选择,那么视图也不会增加太多价值。您可以使用绑定变量创建 SQL 脚本(在文件中,例如 myquery.sql):

      SELECT ID,REF_ID,BATCHNO FROM reporttbl
      where POSTING_DT >= to_date(:from_date) and POSTING_DT <= to_date(:to_date);
      

      然后每个月您都可以打开文件并运行它,它会提示您输入 2 个日期。或者你可以像这样运行一个脚本,它也会提示你:

      @myquery.sql
      

      或者,如果您使用替换字符串“&1”。和“&2”。而是:

      SELECT ID,REF_ID,BATCHNO FROM reporttbl
      where POSTING_DT >= to_date('&1.') and POSTING_DT <= to_date('&2.');
      

      然后你可以像这样在命令行中传递日期:

      @myquery '06/01/2020' '06/30/2020'
      

      (因为&1.表示命令行中的第一个参数等)

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 2018-10-24
        • 2020-01-12
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        • 2012-02-19
        相关资源
        最近更新 更多