Oracle指標級別判斷

2022-04-19 12:26:20 字數 1660 閱讀 8751

目前有乙個簡單的指標級別的判斷邏輯,其邏輯是在資料中通過oracle的function

進行判斷。

示例為:

select kpi1,get_kpi_level(kpi1當前值得,對比歷史值) kpi_evel from xx

但是使用者要求區分忙時和閒時。比如12和凌晨1點的閥值是不同的,重大節假日和平時是不同的, 甚至判斷的方式都有可能不同,遇到此類情況怎麼辦?

step 1:設計乙個二維表儲存指標的閥值得和判斷方式,示例格式為:

a指標表:

指標1 最小值1 最大值1 對應級別1 最小值2 最大值2 對應級別2 波動最小值1 波動最小值1 對應級別1 波動最小值2 波動最小值2 對應級別2...

時間段 假日標識

b假日表:

假日標識 開始時間 結束時間

在判斷的過程中使用游標進行提取當前時間段對方的指標閥值的資訊,進行判斷,得出指標級別。

step 2:思考對於大資料量的資料,每條資料都開啟游標進行取閥值資訊且這些資訊都是相同的(因為每次核查的時間範圍是固定的),應該怎麼減少游標的使用次數?

使用oracle package的全域性變數的特性.示例程式為:

create or replace package pkg_kpi_test is

procedure initialvalue;

function getvalue return varchar2;

type c_type is ref cursor;

end;

create or replace package body pkg_kpi_test

is first_result date;

hour_id number;

procedure initialvalue

ismycur c_type;

begin

open mycur for

select sysdate, 123 from dual;

dbms_output.put_line('全域性變數初始化完成');

fetch mycur

into first_result, hour_id;

end;

function getvalue

return varchar2

isbegin

return to_char(first_result,'yyyy-mm-dd hh24:mi:ss')||','||to_char(hour_id);

end;

end pkg_kpi_test;

每次執行時候都呼叫進行初始化:

begin

pkg_kpi_test.initialvalue;

end;

然後呼叫包的函式利用代表性變數進行判斷。

select pkg_kpi_test.getvalue from dual

這樣就達到了減少游標使用次數的問題。

step 3:如果取歷史值過於耗時過長或消耗的資源過多,而我們的核查頻率又過於頻繁,可以定時將根據相應的演算法將歷史值儲存生成乙個靜態配置表,每次對比都從此表中取相應的資料。

如此乙個小型簡單的指標閥值判斷的後台基礎框架即可搭建完成。

關於package的全域性變數特性請參閱:

oracle 隔離級別

以oracle 為例 標準的資料庫隔離級別分為 未提交讀,提交讀,重複讀,序列化 img 其中 髒讀 dirty read 當乙個事務讀取另乙個事務尚未提交的修改時,產生髒讀。非重複讀 nonrepeatable read 同一查詢在同一事務中多次進行,由於其他提交事務所做的修改或刪除,每次返回不同...

ORACLE事物隔離級別

oracle最低的隔離級別是read committed,它有如下特性 可能有些人會奇怪,oracle最低的隔離級別怎麼不是read uncommitted呢?因為oracle有undo,它天生就是讀寫不阻塞,因此在oracle裡,根本就不會出現髒讀。這裡解釋一下什麼是 語句級的讀一致性 它是指 當...

ORACLE事物隔離級別

oracle最低的隔離級別是read committed,它有如下特性 可能有些人會奇怪,oracle最低的隔離級別怎麼不是read uncommitted呢?因為oracle有undo,它天生就是讀寫不阻塞,因此在oracle裡,根本就不會出現髒讀。這裡解釋一下什麼是 語句級的讀一致性 它是指 當...