前言
我们知道Oracle和MySQL数据库有存储过程,方便将通用的数据处理流程保存下来,可以像个函数一样直接调用很方便。
ODPS(MaxCompute) 里面也有一个阉割版的存储过程---参数化视图。我们知道视图是将固定的计算逻辑存储下来,通过调用视图简化代码。而参数化视图就是可以在视图代码里调用入参变量,从而达到更灵活的使用视图,一个通用逻辑供多种场景使用。
参数化视图支持传入任意表或其它变量,定制视图的行为。
语法
create [or replace] [if not exists] <view_name>( <variable_name> <variable_type> [, <variable_name> <variable_type> ...])
[returns <return_variable> table (<col_name> <col_type> comment <col_comment> [,<col_name> <col_type> comment <col_comment>])]
[comment <view_comment>]
as
{<select_statement> | begin <statements> end}
- view_name:必填。视图名称。
- variable_name:必填。视图变量名称。
- variable_type:必填。视图变量参数类型。
- return_variable:可选。视图返回的变量名称。
- col_name:可选。视图返回列的名称。
- col_type:可选。视图返回列的类型。
- col_comment:可选。视图返回列的注释。
- view_comment:可选。视图的注释。
- select_statement:条件必选。
select 子句。 - statements:条件必选。视图脚本。
样例
固定返回格式
定义参数化视图?
CREATE OR REPLACE VIEW tmp_param_view1(
-- 入参 (可以是任意类型任意个数)
@input_a TABLE (
ida STRING COMMENT '主键'
,name STRING COMMENT '姓名'
,* ANY
)
,@input_b TABLE (
idb STRING COMMENT '主键'
,class STRING COMMENT '班级'
,* ANY
)
,@www ANY COMMENT '其他参数'
)
-- 定义固定出参类型
returns @res TABLE (
web STRING COMMENT '网站'
,id STRING COMMENT '主键'
,name STRING COMMENT '姓名'
,class STRING COMMENT '班级'
)
COMMENT '测试视图_固定返回'
AS
select
@www as web
,a.ida
,a.name
,b.class
from @input_a a -- 例子里的表都是入参,也可以是指定的表名
join @input_b b
on a.ida = b.idb
;
上面的代码中定义了一个参数化视图tmp_param_view1,有三个入参(@input_a,@input_b,@www),其中前两个是表类型参数(表结构中的'* ANY' 表示入参的表除了前两个id ,name字段以外也可以有其他任意个数的任意类型字段),第三个@www 标记'ANY' 关键字表示任意类型,也可以使用String/Bigint等关键字指定类型。 返回参数@res?为表类型。
调用参数化视图
-- 准备数据
with tmp_a as(
select 1 as ida,'Rick' as name,'30' as age
)
,tmp_b as(
select 1 as idb,'A' as class,'SH' as city
)
-- 调用视图
select * from tmp_param_view1(tmp_a,tmp_b,'CSDN');
可以看到,我们只需要将准备好的数据(表,临时表皆可) 传递到视图内就可以灵活调用。
不定返回格式
定义参数化视图?
CREATE OR REPLACE VIEW tmp_param_view2(
-- 入参
@input_a TABLE (
ida STRING COMMENT '主键'
,name STRING COMMENT '姓名'
,* ANY -- input_a表里面的字段可以有除了ida,name以外的任意个数任意字段
)
,@input_b TABLE (
idb STRING COMMENT '主键'
,class STRING COMMENT '班级'
,* ANY
)
,@www STRING COMMENT '其他参数'
)
-- 不指定出参格式
COMMENT '测试视图_不定返回'
AS
select
@www as web,* -- 同时将a,b两个表的全部入参字段返回
from @input_a a
join @input_b b
on a.ida = b.idb
;
上面的代码中定义了一个参数化视图tmp_param_view2,有三个入参(@input_a,@input_b,@www),其中前两个是表类型参数(表结构中的'* ANY' 表示入参的表除了前两个id ,name字段以外也可以有其他任意个数的任意类型字段),第三个@www 标记'ANY' 关键字表示任意类型,也可以使用String/Bigint等关键字指定类型。 返回值不定义,因为我们期望把a,b表里面的全部字段都返回。
调用参数化视图
-- 准备数据
with tmp_a as(
select 1 as ida,'Rick' as name,'30' as age
)
,tmp_b as(
select 1 as idb,'A' as class,'SH' as city
)
-- 调用视图
select * from tmp_param_view2(tmp_a,tmp_b,'CSDN');
可以看到,这个视图和上面的视图的差异在于,返回格式不固定,会根据入参的字段动态调整。
在实际应用中,灵活的使用,会减少很多重复劳动,提示工作效率,会有意想不到的效果,建议大家都去试试。
有任何疑问都可以在下方留言,我会尽量进行解答!
希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!
|