我有以下視圖。
CREATE OR REPLACE VIEW vw_myview as
SELECT
emp_joining_dt,
emp_joining_dt 365 as emp_reminder_dt
FROM EMP
/
員工入職1年后,需要發送一份提醒函。日常作業讀取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
/
上述方法的問題是,每次視圖被查詢時,它都會呼叫資料庫 以從配置表中讀取值。
有人提出,應該避免頻繁地查詢資料庫。
是否有一種方法可以在第一時間從資料庫中讀取值,然后再從一些快取中讀取。 然后當值被改變時,第一次從資料庫中讀取,然后再從一些快取中讀取。
使用快取只是我的猜測,但還有其他方法嗎?
uj5u.com熱心網友回復:
我將創建一個特殊的表格來改變引數。其中一個最簡單的方法看起來像這樣(SCD type 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'/span>, 'N'))。)
active_uniq varchar2(1) 無形的生成總是作為(case when active='Y' then 'Y' end)。)
約束 c_active_uniq unique (active_uniq)
);
所以你可以永遠有一條活動記錄:隱形列active_uniq(和它的唯一約束)不允許有多于1條活動記錄。
然后只需插入你的當前值:
insert into emp_reminder_dt(emp_reminder_dt,active)
values(365, 'Y'/span>)。
commit。
現在你可以很容易地得到活動值:
CREATE OR REPLACE VIEW vw_myview as
SELECT
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型別來允許不同的值用于不同的時間間隔。
uj5u.com熱心網友回復:
任何合理的應用程式都可能有幾十個這樣的一次性專案,你不希望硬編碼一個值。對于這些,我通常會創建一個General_Parameters表。這是對 @SayanMalakshinov 的建議的一個概括。大致如下:
create table general_parameters(
parm_name varchar2(64)
, parm_integer integer ?
, parm_date date ?
, parm_text varchar2(4000)
--其他引數型別。
, 限制條件 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個日期很快就會變得無用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309424.html
標籤:
