DBA Data[Home] [Help]

PROCEDURE: SYS.DBMS_FEATURE_SERVICES

Source


1 PROCEDURE dbms_feature_services
2       (is_used OUT number, hwm OUT number, feature_info OUT clob)
3 AS
4   -- Based off dba_services
5   num_clb_long                            NUMBER := 0;
6   num_clb_short                           NUMBER := 0;
7   num_goal_service_time                   NUMBER := 0;
8   num_goal_throughput                     NUMBER := 0;
9   num_goal_none                           NUMBER := 0;
10   num_goal_null                           NUMBER := 0;
11   num_aq_notifications                    NUMBER := 0;
12 
13   -- Based off gv$active_services
14   num_active_svcs                         NUMBER := 0;
15   num_active_svcs_wo_distinct             NUMBER := 0;
16   avg_active_cardinality                  NUMBER := 0;
17 
18   default_service_name                    varchar2(1000);
19   default_xdb_service_name                varchar2(1000);
20   db_domain                               varchar2(1000);
21 
22 BEGIN
23   -- initialize
24   is_used      := 0;
25   hwm          := 0;
26   feature_info := 'Services usage not detected';
27 
28   -- get default service name - db_unique_name[.db_domain]
29 
30   SELECT value INTO default_service_name FROM v$parameter WHERE
31         lower(name) = 'db_unique_name';
32 
33   SELECT value INTO db_domain FROM v$parameter WHERE
34         lower(name) = 'db_domain';
35 
36   -- create default XDB service name
37   default_xdb_service_name := default_service_name || 'XDB';
38 
39   -- append db_domain if it is set
40   IF db_domain IS NOT NULL then
41     default_service_name := default_service_name || '.' || db_domain;
42   END IF;
43 
44   SELECT count(*) INTO hwm
45   FROM dba_services
46   WHERE
47       NAME NOT LIKE 'SYS$%'
48   AND NETWORK_NAME NOT LIKE 'SYS$%'
49   AND NAME <> default_xdb_service_name
50   AND NAME <> default_service_name;
51 
52   IF hwm > 0 THEN
53     is_used := 1;
54   END IF;
55 
56   -- if services is used
57   IF (is_used = 1) THEN
58 
59     -- Get the counts for CLB_GOAL variations
60     FOR item IN (
61       SELECT clb_goal, count(*) cg_count
62       FROM dba_services
63       where
64           NAME NOT LIKE 'SYS$%'
65       AND NETWORK_NAME NOT LIKE 'SYS$%'
66       AND NAME <> default_xdb_service_name
67       AND NAME <> default_service_name
68       GROUP BY clb_goal)
69 
70     LOOP
71 
72       IF item.clb_goal = 'SHORT' THEN
73         num_clb_short := item.cg_count;
74       ELSIF item.clb_goal = 'LONG' THEN
75         num_clb_long  := item.cg_count;
76       END IF;
77 
78     END LOOP;
79 
80 
81     -- Get the counts for GOAL variations
82     FOR item IN (
83       SELECT goal, count(*) g_count
84       FROM dba_services
85       where
86           NAME NOT LIKE 'SYS$%'
87       AND NETWORK_NAME NOT LIKE 'SYS$%'
88       AND NAME <> default_xdb_service_name
89       AND NAME <> default_service_name
90       GROUP BY goal)
91 
92     LOOP
93 
94       IF item.goal = 'SERVICE_TIME' THEN
95         num_goal_service_time := item.g_count;
96       ELSIF item.goal = 'THROUGHPUT' THEN
97         num_goal_throughput  := item.g_count;
98       ELSIF item.goal = 'NONE' THEN
99         num_goal_none := item.g_count;
100       ELSIF item.goal is NULL THEN
101         num_goal_null := item.g_count;
102       END IF;
103 
104     END LOOP;
105 
106     -- count goal is NULL as goal = NONE
107     num_goal_none := num_goal_none + num_goal_null;
108 
109     -- Get the count for aq_ha_notifications
110     SELECT count(*) into num_aq_notifications
111     FROM dba_services
112     where
113         NAME NOT LIKE 'SYS$%'
114     AND NETWORK_NAME NOT LIKE 'SYS$%'
115     AND NAME <> default_xdb_service_name
116     AND NAME <> default_service_name
117     AND AQ_HA_NOTIFICATIONS = 'YES';
118 
119 
120     SELECT count(distinct name), count(*)
121       INTO num_active_svcs, num_active_svcs_wo_distinct
122     FROM gv$active_services
123     WHERE
124         NAME NOT LIKE 'SYS$%'
125     AND NETWORK_NAME NOT LIKE 'SYS$%'
126     AND NAME <> default_xdb_service_name
127     AND NAME <> default_service_name;
128 
129     IF num_active_svcs > 0 THEN
130 
131       avg_active_cardinality :=
132         round(num_active_svcs_wo_distinct / num_active_svcs);
133 
134     END IF;
135 
136     feature_info :=
137         ' num_clb_long: '          || num_clb_long
138       ||' num_clb_short: '         || num_clb_short
139       ||' num_goal_service_time: ' || num_goal_service_time
140       ||' num_goal_throughput: '   || num_goal_throughput
141       ||' num_goal_none: '         || num_goal_none
142       ||' num_aq_notifications: '  || num_aq_notifications
143       ||' num_active_services: '   || num_active_svcs
144       ||' avg_active_cardinality: '|| avg_active_cardinality;
145 
146   END IF;
147 
148 END;