我可以在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' );
我有这样的查询
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' );