CREATE OR REPLACE FUNCTION Fdb_GetIdlePercent(pn_Seconds NUMBER DEFAULT 5) RETURN NUMBER
AS
vn_IdleTime NUMBER;vn_CPUCount NUMBER;BEGIN
SELECT VALUE INTO vn_IdleTime FROM V$OSSTAT WHERE STAT_NAME = 'IDLE_TIME';
SELECT VALUE INTO vn_CPUCount FROM V$OSSTAT WHERE STAT_NAME = 'NUM_CPUS';
SYS.DBMS_LOCK.SLEEP( pn_Seconds);
SELECT VALUE - vn_IdleTime INTO vn_IdleTime FROM V$OSSTAT WHERE STAT_NAME = 'IDLE_TIME';
RETURN ROUND(vn_IdleTime/(vn_CPUCount *pn_Seconds*100) *100, 2 );
EXCEPTION WHEN OTHERS THEN
RETURN 100;
END;
Funkcja wymaga następujących niestandardowych uprawnień:
GRANT EXECUTE ON SYS.DBMS_LOCK TO :current_user;
GRANT SELECT ON SYS.V$OSSTAT TO :current_user;
Istotnym parametrem jest czas pomiaru - 5 sekund lub dłużej powinno wystarczyć..
Poniższy blok czeka, aż parametr idle spadnie do 50% na podstawie sprawdzania przedziałów czasowych o długości 300 sekund.
DECLARE
vn_Idle NUMBER;
vn_Delay NUMBER := 300;
BEGIN
LOOP vn_Idle := Fdb_GetIdlePercent(vn_Delay); EXIT WHEN vn_Idle <= 50; END LOOP;
--- Insert your code here
END;