我可以在oracle中创建参数化视图吗

Can I create parameterized views in oracle

我有这样的查询

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

而且我每个月都需要它,所以我想把它放在一个视图中,但是由于日期每个月都在变化,所以最好有一个日期参数,我可以在调用它时将其传递给视图.有什么办法可以实现这一目标吗? 我是 oracle 的新手,感谢您的帮助。谢谢你。

本次查询return上个月的数据,即查询时当月的前一个月(=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')

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

如果您的查询真的只是从一个 table 中选择,并且仅以日期作为谓词,那么视图也不会增加太多价值。您可以使用绑定变量创建 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. 表示命令行上的第一个参数等)

从 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   

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

  • 使用一个table来存储参数,基本上你需要参数值和参数描述。
  • 当输入是参数名称时,使用函数检索该参数的值
  • 在视图中使用函数调用。
  • 然后您可以通过修改参数 table 的值自动操作视图。

Table

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' );