意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

【Oracle】在视图中使用变量

来源:恒创科技 编辑:恒创科技编辑部
2023-12-06 14:30:59

文中使用的Oracle版本为10g。

这众所周知,视图(view)中是不能直接使用变量的,但视图可以调用包(package),那我们可以改变使用方式,通过package为视图传参。

第一步:创建全局变量(简单的get/set方法)


【Oracle】在视图中使用变量

create or replace package p_countyarea_param is
--为视图创建变量
function set_param(datetime varchar2) return varchar2;
function get_param return varchar2;
end p_countyarea_param;

在package中先定义两个函数set_param和get_param,这种做法跟Java的getter/setter非常相似。

这里传一个类型为varchar2的变量datetime。

create or replace package body p_countyarea_param is
--记住日期时间的
paramValue varchar2(10);

function set_param(datetime varchar2) return varchar2 is
begin
paramValue := datetime;
return datetime;
end;

function get_param return varchar2 is
begin
return paramValue;
end;
end p_countyarea_param;

在package body中正式编写函数逻辑,在set_param函数中将datetime赋值给package body的全局变量paramValue,而在get_param函数获取的时候直接获取paramValue变量即可。

是不是很容易理解。


第二步:在视图中调用变量

create or replace view p_view_user as
select id,
realName,
address
from tbl_info
where id = p_countyarea_param.get_param();

可以看出在视图中是可以通过p_countyarea_param.get_param()给where条件对应的字段动态赋值的。


第三步:在查询中调用变量

select * 
from p_view_user
where p_countyarea_param.set_param(<param>)=<param>

如上所示,在调用视图的时候加上where条件,在where条件中为set_param内变量设值即可。

有同学可能会说创建视图(view)本就不应该带where条件以适配查询的,你这种做法不是多此一举吗?

是的,如果是简单的调用当然不需要这样写下来了。这种做法主要是针对结构单一但动态组合的业务场景而诞生的,本方法也同样适用于多表连接且多表嵌套条件传递使用。

上一篇: mysql直接拷贝data目录下数据库源文件还原数据库方法 下一篇: 数据库回收站