Rem drv:
Rem
Rem $Header: net_pkgbodys.sql 10-jan-2006.22:44:20 vivsharm Exp $
Rem
Rem net_pkgbodys.sql
Rem
Rem Copyright (c) 2002, 2006, Oracle. All rights reserved.
Rem
Rem NAME
Rem net_pkgbodys.sql -
Rem
Rem DESCRIPTION
Rem
Rem
Rem NOTES
Rem
Rem
Rem MODIFIED (MM/DD/YY)
Rem vivsharm 01/10/06 - bug 4938487
Rem vivsharm 09/12/05 - perf fix
Rem jpegu 07/08/05 - Performance Bug: 4470041 add get_lsnr_home_page_data
Rem chyu 06/28/05 - New repmgr header impl
Rem dkapoor 11/11/03 - use host guid in MGMT_DBNET_TNS_ADMINS
Rem dkapoor 11/04/03 - fix 3231681
Rem hasriniv 10/16/03 - Moving proc get_lsnr_homepage_info here
Rem hasriniv 10/10/03 - Fix for bug 3187592
Rem hasriniv 09/02/03 - Fix for bug 3122598
Rem hasriniv 06/26/03 - Fix for bug 2797194
Rem dkapoor 02/05/03 - dkapoor_impl_net_srvc
Rem dkapoor 11/08/02 - implement
Rem dkapoor 11/04/02 - Created
Rem
CREATE OR REPLACE PACKAGE body MGMT_DBNET AS
/*
Get the oracle homes and tns_admin locations for a Host Target.
The values returned as OUT parameters are used for Oracle Net Services Administration
*/
procedure getNetAdminInfo(
hostName IN VARCHAR2,
hostType IN VARCHAR2,
netAdmin_cur_out OUT cursorType) IS
BEGIN
-- get all oracle homes on host
OPEN netAdmin_cur_out FOR
select n.ORACLE_HOME , n.TNS_ADMIN
from MGMT_DBNET_TNS_ADMINS n,
MGMT_TARGETS targets
where targets.TARGET_GUID = n.HOST_GUID
and targets.target_name= hostName
and targets.target_type= hostType;
END getNetAdminInfo;
/*
Return a cursor for the chart data based on the value for RANGE
*/
procedure getLsnrPerfChartData(
l_lsnrtargetName IN VARCHAR2,
l_range IN VARCHAR2,
l_lsnrData_cur_out OUT cursorType)
IS
l_lsnrTgt_guid MGMT_TARGETS.target_guid%TYPE;
l_type_meta_ver MGMT_TARGETS.TYPE_META_VER%TYPE;
l_category_prop_1 MGMT_TARGETS.CATEGORY_PROP_1%TYPE;
l_category_prop_2 MGMT_TARGETS.CATEGORY_PROP_2%TYPE;
l_category_prop_3 MGMT_TARGETS.CATEGORY_PROP_3%TYPE;
l_category_prop_4 MGMT_TARGETS.CATEGORY_PROP_4%TYPE;
l_category_prop_5 MGMT_TARGETS.CATEGORY_PROP_5%TYPE;
l_timezone_region MGMT_TARGETS.TIMEZONE_REGION%TYPE;
l_estConn_Metric_guid MGMT_METRICS.metric_guid%TYPE;
l_refConn_Metric_guid MGMT_METRICS.metric_guid%TYPE;
l_cutoff_tstamp MGMT_METRICS_RAW.COLLECTION_TIMESTAMP%TYPE;
l_time_range NUMBER;
BEGIN
BEGIN
-- get Target Guid first
SELECT target_guid, type_meta_ver, category_prop_1, category_prop_2,
category_prop_3, category_prop_4, category_prop_5, timezone_region
INTO l_lsnrTgt_guid, l_type_meta_ver, l_category_prop_1, l_category_prop_2,
l_category_prop_3, l_category_prop_4, l_category_prop_5, l_timezone_region
FROM mgmt_targets
WHERE target_name = l_lsnrtargetName and target_type = 'oracle_listener';
EXCEPTION
WHEN NO_DATA_FOUND
THEN raise MGMT_GLOBAL.target_does_not_exist;
END;
BEGIN
-- note: the "rownum = 1" is to ensure only one row is returned. This may
-- not return the correct metric row if EMD allows empty and non-empty
-- values of category_prop_* columns to exist at the same time. The problem
-- will also occur during migration.
-- get Metric Guid for estConns
SELECT metric_guid
INTO l_estConn_Metric_guid
FROM mgmt_metrics
WHERE target_type = 'oracle_listener'
AND metric_name = 'Load'
AND metric_column = 'estConns'
AND usage_type = MGMT_GLOBAL.G_USAGE_VIEW_COLLECT
AND type_meta_ver = l_type_meta_ver
AND (category_prop_1 = l_category_prop_1 OR category_prop_1 = ' ')
AND (category_prop_2 = l_category_prop_2 OR category_prop_2 = ' ')
AND (category_prop_3 = l_category_prop_3 OR category_prop_3 = ' ')
AND (category_prop_4 = l_category_prop_4 OR category_prop_4 = ' ')
AND (category_prop_5 = l_category_prop_5 OR category_prop_5 = ' ')
AND rownum = 1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN raise MGMT_GLOBAL.no_such_metric_found;
END;
BEGIN
-- get Metric Guid for refConns
SELECT metric_guid
INTO l_refConn_Metric_guid
FROM mgmt_metrics
WHERE target_type = 'oracle_listener'
AND metric_name = 'Load'
AND metric_column = 'refConns'
AND usage_type = MGMT_GLOBAL.G_USAGE_VIEW_COLLECT
AND type_meta_ver = l_type_meta_ver
AND (category_prop_1 = l_category_prop_1 OR category_prop_1 = ' ')
AND (category_prop_2 = l_category_prop_2 OR category_prop_2 = ' ')
AND (category_prop_3 = l_category_prop_3 OR category_prop_3 = ' ')
AND (category_prop_4 = l_category_prop_4 OR category_prop_4 = ' ')
AND (category_prop_5 = l_category_prop_5 OR category_prop_5 = ' ')
AND rownum = 1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN raise MGMT_GLOBAL.no_such_metric_found;
END;
BEGIN
-- get the cutoff timestamp for graph
IF l_range in ('2', '12') THEN
l_time_range := l_range/24;
ELSIF l_range = '7*24' THEN
l_time_range := 7;
ELSE
l_time_range := 2/24;
END IF;
SELECT COLLECTION_TIMESTAMP - l_time_range
INTO l_cutoff_tstamp
FROM mgmt_current_metrics
WHERE METRIC_GUID = l_estConn_Metric_guid AND
TARGET_GUID = l_lsnrTgt_guid AND rownum = 1;
EXCEPTION
WHEN NO_DATA_FOUND
--THEN raise MGMT_GLOBAL.target_does_not_exist;
THEN select SYSDATE into l_cutoff_tstamp from dual;
END;
IF (l_range = '2') THEN
OPEN l_lsnrData_cur_out FOR
SELECT
NVL(estConns.VALUE,0) ,
NVL(refConns.VALUE,0) ,
TO_DATE( TO_CHAR(estConns.COLLECTION_TIMESTAMP, 'MM/DD/YYYY HH24:MI:SS'), 'MM/DD/YYYY HH24:MI:SS')
FROM
(select * from MGMT_METRICS_RAW
where METRIC_GUID = l_estConn_Metric_guid AND
TARGET_GUID = l_lsnrTgt_guid AND
COLLECTION_TIMESTAMP >= l_cutoff_tstamp) estConns,
(select * from MGMT_METRICS_RAW
where METRIC_GUID = l_refConn_Metric_guid AND
TARGET_GUID = l_lsnrTgt_guid AND
COLLECTION_TIMESTAMP >= l_cutoff_tstamp) refConns
WHERE
estConns.COLLECTION_TIMESTAMP = refConns.COLLECTION_TIMESTAMP
ORDER BY 3;
ELSIF (l_range = '12') THEN
OPEN l_lsnrData_cur_out FOR
SELECT
AVG(NVL(estConns.VALUE,0)),
AVG(NVL(refConns.VALUE,0)),
TO_DATE( TO_CHAR(estConns.COLLECTION_TIMESTAMP, 'MM/DD/YYYY HH24'),'MM/DD/YYYY HH24')
FROM
(select * from MGMT_METRICS_RAW
where METRIC_GUID = l_estConn_Metric_guid AND
TARGET_GUID = l_lsnrTgt_guid AND
COLLECTION_TIMESTAMP >= l_cutoff_tstamp) estConns,
(select * from MGMT_METRICS_RAW
where METRIC_GUID = l_refConn_Metric_guid AND
TARGET_GUID = l_lsnrTgt_guid AND
COLLECTION_TIMESTAMP >= l_cutoff_tstamp) refConns
WHERE
estConns.COLLECTION_TIMESTAMP = refConns.COLLECTION_TIMESTAMP
GROUP BY
TO_CHAR(estConns.COLLECTION_TIMESTAMP, 'MM/DD/YYYY HH24')
ORDER BY 3;
ELSIF (l_range = '7*24') THEN
OPEN l_lsnrData_cur_out FOR
SELECT
AVG(NVL(estConns.VALUE,0)),
AVG(NVL(refConns.VALUE,0)),
TO_DATE( TO_CHAR(estConns.COLLECTION_TIMESTAMP, 'MM/DD/YYYY'),'MM/DD/YYYY')
FROM
(select * from MGMT_METRICS_RAW
where METRIC_GUID = l_estConn_Metric_guid AND
TARGET_GUID = l_lsnrTgt_guid AND
COLLECTION_TIMESTAMP >= l_cutoff_tstamp) estConns,
(select * from MGMT_METRICS_RAW
where METRIC_GUID = l_refConn_Metric_guid AND
TARGET_GUID = l_lsnrTgt_guid AND
COLLECTION_TIMESTAMP >= l_cutoff_tstamp) refConns
WHERE
estConns.COLLECTION_TIMESTAMP = refConns.COLLECTION_TIMESTAMP
GROUP BY
TO_CHAR(estConns.COLLECTION_TIMESTAMP, 'MM/DD/YYYY')
ORDER BY 3;
END IF;
END getLsnrPerfChartData;
/*
Updates MGMT_DBNET_TNS_ADMINS
with the oracle homes and tns_admin locations for the specified Host Target.
*/
procedure updateNetAdminInfo(
hostName IN VARCHAR2,
hostType IN VARCHAR2,
fileSeparator IN VARCHAR2) IS
homesCursor CURSORTYPE;
lcount NUMBER;
oracle_home MGMT_INV_CONTAINER.CONTAINER_location%TYPE;
host_guid MGMT_TARGETS.target_guid%TYPE;
BEGIN
-- get all oracle homes for the host
DECLARE
CURSOR homesCursor IS
select cont.CONTAINER_location as oracle_home, targets.TARGET_GUID as host_guid
from MGMT_INV_CONTAINER cont,mgmt_ecm_snapshot snap,MGMT_INV_COMPONENT comp , MGMT_TARGETS targets
where comp.is_top_level = 'Y'
and comp.container_guid = cont.container_guid
and snap.target_type=targets.target_type
and snap.target_name= targets.target_name
and snap.target_type=hostType
and snap.target_name= hostName
and snap.snapshot_guid=cont.snapshot_guid and cont.container_type='O';
CURSOR deinstallOHCursor IS
select HOST_GUID, ORACLE_HOME from MGMT_DBNET_TNS_ADMINS
WHERE ORACLE_HOME not in (select cont.CONTAINER_location as oracle_home
from MGMT_INV_CONTAINER cont,mgmt_ecm_snapshot snap,MGMT_INV_COMPONENT comp
where comp.is_top_level = 'Y'
and comp.container_guid = cont.container_guid
and snap.target_type=hostType
and snap.target_name= hostName
and snap.snapshot_guid=cont.snapshot_guid and cont.container_type='O')
AND HOST_GUID=(select TARGET_GUID from MGMT_TARGETS targets
where targets.target_type=hostType AND targets.target_name=hostName);
BEGIN
FOR deinstallOHRec IN deinstallOHCursor LOOP
DELETE from MGMT_DBNET_TNS_ADMINS
WHERE HOST_GUID = deinstallOHRec.HOST_GUID
AND ORACLE_HOME = deinstallOHRec.ORACLE_HOME;
END LOOP;
commit;
FOR homesRec IN homesCursor LOOP
SELECT count(*) into lcount
FROM MGMT_DBNET_TNS_ADMINS
WHERE HOST_GUID=homesRec.host_guid
AND ORACLE_HOME= homesRec.oracle_home;
IF lcount = 0 THEN
INSERT INTO MGMT_DBNET_TNS_ADMINS
( HOST_GUID, ORACLE_HOME, TNS_ADMIN )
VALUES (
homesRec.host_guid,
homesRec.oracle_home,
homesRec.oracle_home
|| fileSeparator || 'network'
|| fileSeparator || 'admin');
commit;
END IF;
END LOOP;
END;
END updateNetAdminInfo;
/*
Gets a target property
given the target name , target type and the property
*/
procedure getPropertyValue(
targetName IN VARCHAR2,
targetType IN VARCHAR2,
propertyName IN VARCHAR2,
propertyValue OUT VARCHAR2) IS
BEGIN
/*
initialize OUT parameters
*/
propertyValue := '';
-- get the property value
select p.property_value into propertyValue
from mgmt_target_properties p, mgmt_targets t
where t.target_name=targetName and t.target_type=targetType and
t.target_guid = p.target_guid and p.property_name=propertyName;
END getPropertyValue;
/*
Get the oracle homes and tns_admin locations for a Host Target after updating
Oracle Homes not yet present.
The values returned as OUT parameters are used for Oracle Net Services Administration
*/
procedure getNetAdminInfoWithUpdate(
hostName IN VARCHAR2,
hostType IN VARCHAR2,
fileSeparator IN VARCHAR2,
netAdmin_cur_out OUT cursorType) IS
BEGIN
updateNetAdminInfo(hostName,hostType,fileSeparator);
getNetAdminInfo(hostName,hostType,netAdmin_cur_out);
END getNetAdminInfoWithUpdate;
/*
Get the oracle homes and tns_admin locations for a Host Target after updating
Oracle Homes not yet present.
The values returned as OUT parameters are used for Oracle Net Services Administration
*/
procedure getNetAdminInfoWithUpdateForSA(
hostTargetName IN VARCHAR2,
hostTargetType IN VARCHAR2,
fileSeparator IN VARCHAR2,
netAdmin_cur_out OUT cursorType) IS
lcount NUMBER;
hostGuid RAW(16);
databasesCursor CURSORTYPE;
remDatabasesCursor CURSORTYPE;
BEGIN
DECLARE
CURSOR databasesCursor IS
select p.property_value as oraHome from mgmt_targets t, mgmt_target_properties p
where t.target_type='oracle_database'
and t.host_name=hostTargetName
and p.property_name='OracleHome'
and p.target_guid = t.target_guid;
--For databases instances that are no longer part of the RAC
CURSOR remDatabasesCursor IS
select oracle_home as oraHome from MGMT_DBNET_TNS_ADMINS
WHERE ORACLE_HOME NOT IN (select p.property_value from mgmt_targets t,
mgmt_target_properties p
where t.target_type='oracle_database'
and t.host_name=hostTargetName
and p.property_name='OracleHome'
and p.target_guid = t.target_guid)
AND HOST_GUID=(select t.target_guid from
mgmt_targets t where t.target_name=hostTargetName);
BEGIN
--Get the host guid
select t.target_guid into hostGuid from
mgmt_targets t where t.target_name=hostTargetName;
--Delete stale data from MGMT_DBNET_TNS_ADMINS
FOR remDatabaseRec IN remDatabasesCursor LOOP
DELETE from MGMT_DBNET_TNS_ADMINS
WHERE HOST_GUID = hostGuid
AND ORACLE_HOME = remDatabaseRec.oraHome;
END LOOP;
commit;
--Update the MGMT_DBNET_TNS_ADMINS table if data not there
FOR databaseRec IN databasesCursor LOOP
SELECT count(*) into lcount
FROM MGMT_DBNET_TNS_ADMINS where HOST_GUID=hostGuid
AND ORACLE_HOME= databaseRec.oraHome;
IF lcount = 0 THEN
INSERT INTO MGMT_DBNET_TNS_ADMINS
( HOST_GUID, ORACLE_HOME, TNS_ADMIN )
VALUES (
hostGuid,
databaseRec.oraHome,
databaseRec.oraHome
|| fileSeparator || 'network'
|| fileSeparator || 'admin');
commit;
END IF;
END LOOP;
--Now get the data
OPEN netAdmin_cur_out FOR
select ORACLE_HOME, TNS_ADMIN
from MGMT_DBNET_TNS_ADMINS where HOST_GUID=hostGuid;
END;
END getNetAdminInfoWithUpdateForSA;
/*
Update MGMT_DBNET_TNS_ADMINS
with the oracle home and tns_admin location for the specified Host Target.
*/
procedure updateTNS_ADMIN(
hostName IN VARCHAR2,
hostType IN VARCHAR2,
oracleHome IN VARCHAR2,
tnsadmin IN VARCHAR2) IS
hostGuid MGMT_TARGETS.target_guid%TYPE;
BEGIN
hostGuid := '';
select unique TARGET_GUID into hostGuid
from MGMT_TARGETS
where target_type=hostType
and target_name= hostName;
UPDATE MGMT_DBNET_TNS_ADMINS
SET TNS_ADMIN = tnsadmin
WHERE HOST_GUID = hostGuid and ORACLE_HOME = oracleHome;
commit;
END updateTNS_ADMIN;
/*
Update MGMT_DBNET_TNS_ADMINS
with the oracle home and tns_admin location for the specified Host Target.
*/
procedure updateTNS_ADMIN_FOR_SA(
hostName IN VARCHAR2,
hostType IN VARCHAR2,
oracleHome IN VARCHAR2,
tnsadmin IN VARCHAR2) IS
hostGuid RAW(16);
BEGIN
SELECT target_guid into hostGuid from mgmt_targets
where target_name=hostName and target_type=hostType;
UPDATE MGMT_DBNET_TNS_ADMINS
SET TNS_ADMIN = tnsadmin
WHERE HOST_GUID = hostGuid and ORACLE_HOME = oracleHome;
commit;
END updateTNS_ADMIN_FOR_SA;
--
-- PROCEDURE: get_lsnr_homepage_info
--
-- PURPOSE:
-- This procedure returns all the relevant information for a given listener
-- target name and target type.
--
PROCEDURE get_lsnr_homepage_info(target_name_in IN VARCHAR2,
target_type_in IN VARCHAR2,
type_display_name_out OUT VARCHAR2,
last_load_time_out OUT VARCHAR2,
current_status_out OUT INTEGER,
avail_pct_out OUT NUMBER,
severity_code_out OUT INTEGER,
num_severity_out OUT INTEGER,
host_name_out OUT VARCHAR2,
host_display_name_out OUT VARCHAR2,
tnsping_severity_out OUT INTEGER,
start_timestamp_out OUT Date,
metrics_cur_out OUT cursorType,
databases_cur_out OUT cursorType) IS
l_target_guid mgmt_targets.target_guid%TYPE;
BEGIN
-- target guid, type display name, last load time, host emd url
BEGIN
SELECT target_guid, type_display_name, TO_CHAR(last_load_time), host_name
INTO l_target_guid, type_display_name_out, last_load_time_out, host_name_out
FROM mgmt_targets
WHERE target_name = target_name_in
AND target_type = target_type_in;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
raise MGMT_GLOBAL.target_does_not_exist;
END;
-- host display name
BEGIN
SELECT unique display_name
INTO host_display_name_out
FROM mgmt_targets
WHERE target_type = 'host'
AND target_name = host_name_out;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
raise MGMT_GLOBAL.target_does_not_exist;
WHEN TOO_MANY_ROWS
THEN
raise;
END;
-- current status
current_status_out := mgmt_target.get_avail_current_status(l_target_guid);
-- availability percentage
avail_pct_out := ROUND(mgmt_target.get_avail_pct_value(l_target_guid, 1), 2);
-- severity code
severity_code_out := mgmt_target.get_target_max_severity(l_target_guid);
-- total number of severities
num_severity_out := mgmt_target.get_target_num_severity(l_target_guid);
-- start timestamp of current status
start_timestamp_out := mgmt_target.get_current_status_timestamp(l_target_guid);
-- all metrics
OPEN metrics_cur_out FOR
SELECT metric_name, metric_column, ROUND(value, 2), string_value
FROM mgmt_current_metrics cm, mgmt_metrics m
WHERE cm.target_guid = l_target_guid
AND cm.metric_guid = m.metric_guid;
-- TNS ping severity
BEGIN
SELECT unique severity_code
INTO tnsping_severity_out
FROM mgmt_current_severity cs, mgmt_metrics m
WHERE cs.target_guid = l_target_guid
AND cs.metric_guid = m.metric_guid
AND metric_name = 'Response'
AND metric_column = 'tnsPing';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
tnsping_severity_out := 15;
END;
-- Get serviced database tab's information
get_databases_info(target_name_in,target_type_in,databases_cur_out);
END get_lsnr_homepage_info;
--
-- PROCEDURE: get_lsnr_homepage_info
--
-- PURPOSE:
-- This procedure returns all the relevant information for a given listener home page
-- target name and target type. For performance.
--
PROCEDURE get_lsnr_home_page_data(target_name_in IN VARCHAR2,
target_type_in IN VARCHAR2,
type_display_name_out OUT VARCHAR2,
last_load_time_out OUT VARCHAR2,
current_status_out OUT INTEGER,
avail_pct_out OUT NUMBER,
severity_code_out OUT INTEGER,
num_severity_out OUT INTEGER,
host_name_out OUT VARCHAR2,
host_display_name_out OUT VARCHAR2,
tnsping_severity_out OUT INTEGER,
start_timestamp_out OUT Date,
metrics_cur_out OUT cursorType) IS
l_target_guid mgmt_targets.target_guid%TYPE;
BEGIN
-- target guid, type display name, last load time, host emd url
BEGIN
SELECT target_guid, type_display_name, TO_CHAR(last_load_time), host_name
INTO l_target_guid, type_display_name_out, last_load_time_out, host_name_out
FROM mgmt_targets
WHERE target_name = target_name_in
AND target_type = target_type_in;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
raise MGMT_GLOBAL.target_does_not_exist;
END;
-- host display name
BEGIN
SELECT unique display_name
INTO host_display_name_out
FROM mgmt_targets
WHERE target_type = 'host'
AND target_name = host_name_out;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
raise MGMT_GLOBAL.target_does_not_exist;
WHEN TOO_MANY_ROWS
THEN
raise;
END;
-- current status
current_status_out := mgmt_target.get_avail_current_status(l_target_guid);
-- availability percentage
avail_pct_out := ROUND(mgmt_target.get_avail_pct_value(l_target_guid, 1), 2);
-- severity code
severity_code_out := mgmt_target.get_target_max_severity(l_target_guid);
-- total number of severities
num_severity_out := mgmt_target.get_target_num_severity(l_target_guid);
-- start timestamp of current status
start_timestamp_out := mgmt_target.get_current_status_timestamp(l_target_guid);
-- all metrics
OPEN metrics_cur_out FOR
SELECT metric_name, metric_column, ROUND(value, 2), string_value
FROM mgmt_current_metrics cm, mgmt_metrics m
WHERE cm.target_guid = l_target_guid
AND cm.metric_guid = m.metric_guid;
-- TNS ping severity
BEGIN
SELECT unique severity_code
INTO tnsping_severity_out
FROM mgmt_current_severity cs, mgmt_metrics m
WHERE cs.target_guid = l_target_guid
AND cs.metric_guid = m.metric_guid
AND metric_name = 'Response'
AND metric_column = 'tnsPing';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
tnsping_severity_out := 15;
END;
END get_lsnr_home_page_data;
--
-- PROCEDURE: get_databases_info
--
-- PURPOSE:
-- This procedure returns a cursor containing all databases information
-- for the given listener.
--
PROCEDURE get_databases_info(target_name_in IN VARCHAR2,
target_type_in IN VARCHAR2,
databases_cur_out OUT cursorType)
IS
l_target_guid mgmt_targets.target_guid%TYPE;
l_host_name VARCHAR2(1024);
l_list VARCHAR2(4000);
l_port_number VARCHAR2(1024);
l_sid VARCHAR2(1024);
l_curr_index INTEGER := 0;
l_db_sids SMP_EMD_NVPAIR_ARRAY := SMP_EMD_NVPAIR_ARRAY();
l_db_guids MGMT_GUID_ARRAY := MGMT_GUID_ARRAY();
BEGIN
-- target guid, host emd url
BEGIN
SELECT target_guid, host_name
INTO l_target_guid, l_host_name
FROM mgmt_targets
WHERE target_name = target_name_in
AND target_type = target_type_in;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
raise MGMT_GLOBAL.target_does_not_exist;
END;
-- find the sidList
BEGIN
SELECT unique string_value
INTO l_list
FROM mgmt_current_metrics cm, mgmt_metrics m
WHERE cm.target_guid = l_target_guid
AND cm.metric_guid = m.metric_guid
AND metric_name = 'General Status'
AND metric_column = 'sidList';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_list := ' ';
WHEN TOO_MANY_ROWS
THEN
RAISE;
END;
-- find the port number
BEGIN
SELECT DISTINCT(property_value)
INTO l_port_number
FROM mgmt_target_properties
WHERE target_guid = l_target_guid
AND property_name = 'Port';
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_port_number := NULL;
WHEN TOO_MANY_ROWS
THEN
RAISE;
END;
IF(l_list != ' ' AND l_port_number IS NOT NULL AND l_host_name IS NOT NULL) THEN
-- parse sid list and store sids
WHILE(l_list != ' ') LOOP
IF(INSTR(l_list, ',') != 0) THEN
l_sid := SUBSTR(l_list, 1, INSTR(l_list, ',') - 1);
l_list := SUBSTR(l_list, INSTR(l_list, ',') + 1, LENGTH(l_list) );
ELSE
l_sid := l_list;
l_list := ' ';
END IF;
l_db_sids.extend;
l_curr_index := l_curr_index + 1;
l_db_sids(l_curr_index) := SMP_EMD_NVPAIR(l_sid, '');
END LOOP;
-- find all databases on the same host as the listener, with the ports of the
-- listener's port and the sids in the listener's sid list
SELECT MGMT_GUID_OBJ(prop.target_guid, '') BULK COLLECT INTO l_db_guids
FROM mgmt_target_properties prop,
(SELECT tgt.target_guid
FROM mgmt_targets tgt, mgmt_target_properties p
WHERE tgt.target_type = 'oracle_database'
AND tgt.host_name = l_host_name
AND tgt.target_guid = p.target_guid
AND p.property_name = 'Port'
AND p.property_value = l_port_number) guids,
TABLE(CAST(l_db_sids AS SMP_EMD_NVPAIR_ARRAY) ) sids
WHERE prop.target_guid = guids.target_guid
AND prop.property_name = 'SID'
AND prop.property_value = sids.name;
OPEN databases_cur_out FOR
SELECT tgt.target_name,
tgt.target_type,
tgt.display_name,
tgt.type_display_name,
15 AS severity_code,
ROUND(mgmt_target.get_avail_pct_value(tgt.target_guid, 1), 0) AS avail_pct,
mgmt_target.get_avail_current_status(tgt.target_guid) AS current_status,
NVL(sev_detail.warning_count, 0) AS warning_count,
NVL(sev_detail.critical_count, 0) AS critical_count,
tgt.target_guid
FROM mgmt_targets tgt,
( SELECT target_guid,
SUM(DECODE(severity_code, MGMT_GLOBAL.G_SEVERITY_WARNING, 1, 0) ) AS warning_count,
SUM(DECODE(severity_code, MGMT_GLOBAL.G_SEVERITY_CRITICAL, 1, 0) ) AS critical_count
FROM mgmt_current_severity
GROUP BY target_guid ) sev_detail,
TABLE(CAST(l_db_guids AS MGMT_GUID_ARRAY) ) db_guids
WHERE tgt.target_guid = sev_detail.target_guid (+)
AND tgt.target_guid = db_guids.guid
ORDER BY tgt.type_display_name, tgt.target_name;
ELSE
-- open a dummy empty cursor
OPEN databases_cur_out FOR
SELECT *
FROM dual
WHERE rownum < 1;
END IF;
END get_databases_info;
end MGMT_DBNET;
/
show errors;