Rem drv:
Rem
Rem $Header: sdk_global_pkgbody.sql 30-jul-2007.01:27:08 jsadras Exp $
Rem
Rem sdk_global_pkgbody.sql
Rem
Rem Copyright (c) 2002, 2007, Oracle. All rights reserved.
Rem
Rem NAME
Rem sdk_global_pkgbody.sql -
Rem
Rem DESCRIPTION
Rem
Rem
Rem NOTES
Rem
Rem
Rem MODIFIED (MM/DD/YY)
Rem jsadras 07/21/07 - add timezone compare function
Rem jsadras 07/30/07 - Backport jsadras_bug-5092508 from main
Rem gsbhatia 07/01/05 - New repmgr header impl
Rem jsadras 03/21/05 - Bug:4148621, remove row_exists
Rem mfidanbo 03/18/05 - remove tgt_sysdate
Rem mfidanbo 12/01/04 -
Rem rzazueta 10/29/03 - Add elapsed_time_msec function
Rem tjaiswal 10/07/02 - Add api for comp key guid generation
Rem aholser 09/21/02 - fix createrep
Rem rpinnama 09/18/02 - Add check overlap
Rem rpinnama 09/12/02 - Add timezon translation function
Rem rpinnama 05/16/02 - fix typo.
Rem rpinnama 05/15/02 - rpinnama_reorg_rep_scripts
Rem rpinnama 05/15/02 - Created
Rem
CREATE OR REPLACE PACKAGE BODY mgmt_global AS
FUNCTION ADJUST_TZ(date_in DATE,
src_tzrgn_in VARCHAR2,
dst_tzrgn_in VARCHAR2)
RETURN DATE AS
BEGIN
return CAST(FROM_TZ(CAST(date_in as TIMESTAMP),
src_tzrgn_in)
AT TIME ZONE dst_tzrgn_in
AS DATE);
END;
FUNCTION SYSDATE_TZRGN(tzrgn_in VARCHAR2)
RETURN DATE AS
BEGIN
return CAST(systimestamp at time zone tzrgn_in as DATE);
END;
FUNCTION SYSDATE_UTC
RETURN DATE AS
l_tmstmptz TIMESTAMP WITH TIME ZONE;
BEGIN
SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) INTO l_tmstmptz FROM DUAL;
return CAST(l_tmstmptz AS DATE);
END;
FUNCTION TO_UTC(date_in DATE,
src_tzrgn_in VARCHAR2)
RETURN DATE AS
BEGIN
return adjust_tz(date_in, src_tzrgn_in, 'GMT');
END;
FUNCTION FROM_UTC(utc_date_in DATE,
dst_tzrgn_in VARCHAR2)
RETURN DATE AS
BEGIN
return adjust_tz(utc_date_in, 'GMT', dst_tzrgn_in);
END;
PROCEDURE SET_OVERLAP
IS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET ERROR_ON_OVERLAP_TIME=TRUE';
COMMIT;
-- DBMS_OUTPUT.PUT_LINE('Altered session to over_lap=true');
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
PROCEDURE RESET_OVERLAP
IS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET ERROR_ON_OVERLAP_TIME=FALSE';
COMMIT;
-- DBMS_OUTPUT.PUT_LINE('Altered session to over_lap=true');
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
FUNCTION CHECK_OVERLAP(date_in DATE,
tzrgn_in VARCHAR2)
RETURN INTEGER
IS PRAGMA AUTONOMOUS_TRANSACTION;
l_retVal INTEGER := 0;
l_tmstmptz TIMESTAMP WITH TIME ZONE;
BEGIN
SET_OVERLAP;
BEGIN
--
-- The select into only seems to be working
-- If select into is replaced with l_tmstmptz := FROM_TZ
-- the error is not being thrown.
--
select FROM_TZ(CAST(date_in AS TIMESTAMP), tzrgn_in)
INTO l_tmstmptz
from dual;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
IF (SQLCODE = -1883) THEN
l_retVal := -1;
END IF;
END;
RESET_OVERLAP;
return l_retVal;
END;
--
-- GET_COMPOSITE_KEY_GUID function
--
-- PURPOSE: This function returns the composite key guid based on the key
-- part values in the string array - key_part_values_in
--
FUNCTION GET_COMPOSITE_KEY_GUID(key_part_values_in IN SMP_EMD_STRING_ARRAY)
RETURN mgmt_metrics_composite_keys.composite_key%TYPE
IS
l_last_not_null INTEGER := 0;
l_temp_str VARCHAR2(256) := '';
l_key_part_value_str VARCHAR2(256) := '';
-- NOTE: initializing this string to 2560(length of ten key values).
-- this assumes that the num of part key values in a composite
-- key does not go beyond 10. if it does, the length of this string
-- needs to be changed accordingly
l_comb_key_value_str VARCHAR2(2560) := '';
BEGIN
-- if the string array is null, throw exception
IF( key_part_values_in IS NULL )
THEN
RAISE invalid_params;
END IF;
-- first figure out the last not null piece
FOR i in 1..key_part_values_in.COUNT
LOOP
l_temp_str := trim(key_part_values_in(i));
IF( l_temp_str IS NOT NULL AND
length(l_temp_str) > 0 )
THEN
l_last_not_null := i;
END IF;
END LOOP;
-- use the index of last not null piece in constructing the string
-- that will be used for the composite key guid generation
FOR i in 1..l_last_not_null
LOOP
l_temp_str := trim(key_part_values_in(i));
IF( l_temp_str IS NULL OR
length(l_temp_str) = 0 )
THEN
l_key_part_value_str := '';
ELSE
l_key_part_value_str := key_part_values_in(i);
END IF;
IF( i <> 1 )
THEN
l_comb_key_value_str := l_comb_key_value_str || ';';
END IF;
l_comb_key_value_str := l_comb_key_value_str || l_key_part_value_str;
END LOOP;
-- generate the composite key guid for the string - l_comb_key_value_str
RETURN DBMS_OBFUSCATION_TOOLKIT.md5(
input => UTL_RAW.cast_to_raw(l_comb_key_value_str));
END GET_COMPOSITE_KEY_GUID;
--
-- ELAPSED_TIME_MSEC function
--
-- PURPOSE: This function returns the elapsed time between two timestamps
-- in milliseconds.
--
FUNCTION ELAPSED_TIME_MSEC(start_timestamp_in TIMESTAMP, end_timestamp_in TIMESTAMP)
RETURN NUMBER
IS
l_interval INTERVAL DAY TO SECOND;
BEGIN
l_interval := end_timestamp_in - start_timestamp_in;
return ( ( ( EXTRACT(DAY FROM l_interval)*24 +
EXTRACT(HOUR FROM l_interval) )*60 +
EXTRACT(MINUTE FROM l_interval) )*60 +
EXTRACT(SECOND FROM l_interval) )*1000;
END;
-- is_equivalent function
--
-- PURPOSE:This function returns 1 if the timezones are equivalent else 0
--
-- In Parameters:
-- p_timezone1 : First timezone
-- p_timezone2 : Second timezone
--
-- We do not have a straightforward way of finding the timezone equivalence.
-- What we do instead is check if the cast of sysdate in the two timezones
-- retrieve the same time.
-- For Example;
-- Cast(systimestamp at time zone 'US/Pacific') =
--Cast(systimestamp at time zone 'America/Los_Angeles')
-- .
-- To make sure the timezones will give same time across Daylight savings, we
-- could cast the first day of every month in the timezones and make sure they
-- will return same date.
FUNCTION is_equivalent_tz(p_timezone1 IN VARCHAR2,
p_timezone2 IN VARCHAR2)
RETURN NUMBER
IS
l_date DATE := TRUNC(SYSDATE,'YY') ;
BEGIN
IF UPPER(p_timezone1) = UPPER(p_timezone2)
THEN
RETURN 1 ;
END IF ;
FOR i IN 0..11
LOOP
l_date := ADD_MONTHS(l_date,0) ;
IF CAST(l_date at time zone p_timezone1 AS DATE) !=
CAST(l_date at time zone p_timezone2 AS DATE)
THEN
RETURN 0 ;
END IF ;
END LOOP ;
RETURN 1 ;
EXCEPTION
WHEN OTHERS THEN RETURN 0 ;
END is_equivalent_tz ;
--
END mgmt_global;
/
SHOW ERRORS;