如何在数据库视图内读取值?



我有如下视图:

CREATE OR REPLACE VIEW vw_myview AS
SELECT
emp_joining_dt,
emp_joining_dt+365 as emp_reminder_dt
FROM EMP
/

员工入职满1年后,需要发送提醒。Daily job读取emp_reminder_dt并触发它

365天基本上是恒定的。但是,要求是公司可能希望将其更改为183或730。

因此,值365是在表中配置并从DB中读取的。

CREATE OR REPLACE VIEW vw_myview AS
SELECT
emp_joining_dt,
emp_joining_dt+MyPackage.get_reminder_days as emp_reminder_dt
FROM EMP
/

上述方法的问题是,每次查询视图时,它都会调用数据库从配置表中读取值。

应该避免频繁地查询数据库。

是否有一种方法来读取值365第一次从数据库,然后从一些缓存。然后,当值被改变,读第一次从数据库,然后从一些缓存?

使用缓存只是我的猜测,但还有其他方法吗?

我将创建一个用于更改参数的特殊表。最简单的方法之一是这样的(SCD类型2):

create table emp_reminder_dt(
emp_reminder_dt int,
modified_dt date default sysdate,
active varchar2(1 byte) not null check(active in ('Y','N')),
active_uniq varchar2(1) invisible generated always as (case when active='Y' then 'Y' end),
constraint c_active_uniq unique (active_uniq)
);

所以你可以总是有一个活动记录:不可见列active_uniq(和它的唯一约束)不允许有超过1个活动记录。

然后插入当前值:

insert into emp_reminder_dt(emp_reminder_dt,active)
values(365, 'Y');
commit;

现在你可以很容易地获得活动值:

CREATE OR REPLACE VIEW vw_myview AS
SELECT
emp_joining_dt,
emp_joining_dt
+ (select r.emp_reminder_dt 
from emp_reminder_dt r 
where r.active_uniq='Y'
) 
as emp_reminder_dt
FROM EMP

之后,您可以轻松地将活动行更改为active='N',并添加具有新值的新记录,因此您将拥有简单的更改历史记录。

此外,您可以使用其他SCD类型来允许不同的时间间隔有不同的值。

任何合理的应用程序都可能有几十个这样的项目,您不希望硬编码一个值。对于这些,我通常创建一个General_Parameters表。这是@SayanMalakshinov建议的概括。类似以下语句:

create table general_parameters(
parm_name    varchar2(64)
, parm_integer integer 
, parm_date    date
, parm_text    varchar2(4000) 
-- other parameter types
, constraint general_parameters_pk
primary key (parm_name)  
); 
insert into general_parameters(parm_name, parm_integer) 
values ('emp reminder interval',365); 

创建视图:

create or replace view emp_reminder_view as
select emp_id
, emp_joining_dt 
, emp_joining_dt
+ (select parm_integer
from general_parameters
where parm_name = 'emp reminder interval'
)
as emp_reminder_dt
from emp; 

更改提醒间隔是更新表项的简单问题。
注意:添加emp_id以查看2个日期而不带任何限定符在匆忙中变得无用。

最新更新