Rem drv: Rem Rem $Header: emdb/source/oracle/sysman/emdrep/sql/db/latest/dg/dg_pkgbodys.sql /st_emdbsa_11.2/2 2009/02/24 09:50:41 ngade Exp $ Rem Rem dg_pkgbodys.sql Rem Rem Copyright (c) 2008, 2009, Oracle and/or its affiliates. Rem All rights reserved. Rem Rem NAME Rem dg_pkgbodys.sql - Rem Rem DESCRIPTION Rem Rem Rem NOTES Rem Rem Rem MODIFIED (MM/DD/YY) Rem gallison 10/24/08 - Use RTQ in stby_list for standbys Rem ngade 08/04/08 - Rem rimmidi 08/04/08 - Rem gallison 03/13/08 - Handle standby status Rem sjconnol 07/20/07 - Change mgmt_ha_dg_target_sum handler Rem ngade 03/18/07 - Created Rem -- This forces sqlplus to ignore ampersand chars SET DEFINE OFF CREATE OR REPLACE PACKAGE BODY MGMT_HA_DG as PROCEDURE update_mgmt_ha_dg_target_sum( p_target_guid IN RAW, p_collection_timestamp IN DATE DEFAULT SYSDATE, p_source_type IN VARCHAR2 DEFAULT NULL, p_row_type IN VARCHAR2 DEFAULT NULL, p_using_broker IN VARCHAR2 DEFAULT NULL, p_active_stby IN VARCHAR2 DEFAULT NULL, p_db_unique_name IN VARCHAR2 DEFAULT NULL, p_db_id IN NUMBER DEFAULT NULL, p_prmy_db_unique_name IN VARCHAR2 DEFAULT NULL, p_prmy_db_id IN NUMBER DEFAULT NULL, p_role IN VARCHAR2 DEFAULT NULL, p_stby_list IN VARCHAR2 DEFAULT NULL, p_protection_mode IN VARCHAR2 DEFAULT NULL, p_fsfo_status IN VARCHAR2 DEFAULT NULL, p_status IN VARCHAR2 DEFAULT NULL, p_transport_lag IN NUMBER DEFAULT NULL, p_apply_lag IN NUMBER DEFAULT NULL) IS l_procstr varchar2(1024); l_output varchar2(64); l_count number(2); l_procarray MGMT_SHORT_STRING_ARRAY := MGMT_SHORT_STRING_ARRAY(); BEGIN -- If adding a row for a primary, -- flag standby rows that are no longer in the list of standbys for this primary. BEGIN IF p_source_type = 'P' and p_row_type = 'P' THEN -- Parse list of standbys in p_stby_list l_procstr := p_stby_list||','; FOR i in 1..30 loop l_output:=substr(l_procstr,1,(instr(l_procstr,',')-1)); exit when (l_output IS NULL); l_count:=instr(l_procstr,',')+1; l_procstr:=substr(l_procstr,l_count,length(l_procstr)); l_procarray.extend(1); l_procarray(i) := l_output; END loop; UPDATE MGMT_HA_DG_TARGET_SUMMARY SET active_stby = 'NO' WHERE prmy_db_unique_name = p_db_unique_name AND prmy_db_id = p_db_id AND db_unique_name NOT IN (select column_value from TABLE(CAST(l_procarray AS MGMT_SHORT_STRING_ARRAY))); -- DELETE from MGMT_HA_DG_TARGET_SUMMARY -- WHERE prmy_db_unique_name = p_db_unique_name -- AND prmy_db_id = p_db_id -- AND collection_timestamp < (select collection_timestamp from MGMT_HA_DG_TARGET_SUMMARY where target_guid = p_target_guid); END IF; EXCEPTION WHEN OTHERS THEN NULL; END; -- Insert the entry into MGMT_HA_DG_TARGET_SUMMARY table -- Stby rows uploaded from the prmy collection are used only to update -- existing rows uploaded from the stby. Update only the status (which -- must be collected on the prmy to avoid stale data) -- and prmy_db_unique_name (not collected on standby) -- and active_stby (always YES when uploaded from prmy; not uploaded from stby). IF p_source_type = 'P' and p_row_type = 'S' THEN BEGIN UPDATE MGMT_HA_DG_TARGET_SUMMARY SET collection_timestamp = p_collection_timestamp, source_type = p_source_type, row_type = p_row_type, using_broker = p_using_broker, active_stby = p_active_stby, prmy_db_unique_name = p_prmy_db_unique_name, status = p_status WHERE db_unique_name = p_db_unique_name AND prmy_db_id = p_prmy_db_id; EXCEPTION WHEN OTHERS THEN NULL; END; -- Primary row uploaded from the prmy: insert/update all data ELSIF p_source_type = 'P' and p_row_type = 'P' THEN BEGIN INSERT INTO MGMT_HA_DG_TARGET_SUMMARY( target_guid, collection_timestamp, source_type, row_type, using_broker, active_stby, db_unique_name, db_id, prmy_db_unique_name, prmy_db_id, role, stby_list, protection_mode, fsfo_status, status, transport_lag, apply_lag) VALUES ( p_target_guid, p_collection_timestamp, p_source_type, p_row_type, p_using_broker, p_active_stby, p_db_unique_name, p_db_id, p_prmy_db_unique_name, p_prmy_db_id, p_role, p_stby_list, p_protection_mode, p_fsfo_status, p_status, p_transport_lag, p_apply_lag); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- Entry already exists, update the entry (excluding lag values) UPDATE MGMT_HA_DG_TARGET_SUMMARY SET collection_timestamp = p_collection_timestamp, source_type = p_source_type, row_type = p_row_type, using_broker = p_using_broker, active_stby = p_active_stby, db_unique_name = p_db_unique_name, db_id = p_db_id, prmy_db_unique_name = p_prmy_db_unique_name, prmy_db_id = p_prmy_db_id, role = p_role, stby_list = p_stby_list, protection_mode = p_protection_mode, fsfo_status = p_fsfo_status, status = p_status WHERE target_guid = p_target_guid; END; -- Standby row uploaded from the stby: insert all data, or update everything -- except prmy_db_unique_name, status, active_stby, stby_list, -- & other prmy-only props ELSE BEGIN INSERT INTO MGMT_HA_DG_TARGET_SUMMARY( target_guid, collection_timestamp, source_type, row_type, db_unique_name, db_id, prmy_db_unique_name, prmy_db_id, role, stby_list, protection_mode, fsfo_status, status, transport_lag, apply_lag) VALUES ( p_target_guid, p_collection_timestamp, p_source_type, p_row_type, p_db_unique_name, p_db_id, p_prmy_db_unique_name, p_prmy_db_id, p_role, p_stby_list, p_protection_mode, p_fsfo_status, p_status, p_transport_lag, p_apply_lag); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- Entry already exists, update the entry (excluding lag values) UPDATE MGMT_HA_DG_TARGET_SUMMARY SET collection_timestamp = p_collection_timestamp, source_type = p_source_type, row_type = p_row_type, db_unique_name = p_db_unique_name, db_id = p_db_id, prmy_db_id = p_prmy_db_id, role = p_role, stby_list = p_stby_list, transport_lag = p_transport_lag, apply_lag = p_apply_lag WHERE target_guid = p_target_guid; -- if the standby gets an error trying to reach the primary, update the primary's status since the primary is -- down and no longer collecting (Error ORA-16625: cannot reach the database). dgCollector.pl maintains the list of -- ORA errors. Any standby non-null status here is inserted into the primary's status. IF p_status IS NOT NULL THEN UPDATE MGMT_HA_DG_TARGET_SUMMARY SET collection_timestamp = p_collection_timestamp, status = p_status WHERE p_db_id = p_prmy_db_id AND row_type = 'P'; END IF; END; END IF; EXCEPTION WHEN OTHERS THEN NULL; END update_mgmt_ha_dg_target_sum; END MGMT_HA_DG; / SET DEFINE ON show errors;