sqlserver_utilities
create or replace
PACKAGE sqlserver_utilities AS
identity NUMBER(10);
trancount NUMBER(10):=0;
var_number NUMBER(10):=0;
FUNCTION CONVERT_(P_DATATYPE IN VARCHAR2, P_EXPR IN VARCHAR2, P_STYLE IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;
--FUNC YEAR truyen kieu VARCHAR2
FUNCTION YEAR_(P_DATE_STR IN VARCHAR2) RETURN NUMBER;
--FUNC YEAR truyen kieu DATE
FUNCTION YEAR_(P_DATE_STR IN DATE) RETURN NUMBER;
---------------------------------------------------------
FUNCTION stuff(p_expr VARCHAR2, p_startIdx NUMBER, p_len NUMBER, p_replace_expr VARCHAR2) RETURN VARCHAR2;
PROCEDURE incrementTrancount;
FUNCTION dateadd(p_interval IN VARCHAR2, p_interval_val IN NUMBER, p_date_str IN VARCHAR2) RETURN DATE;
FUNCTION dateadd(p_interval IN VARCHAR2, p_interval_val IN NUMBER, p_date_str IN date) RETURN DATE;
FUNCTION isdate(p_expr IN VARCHAR2) RETURN NUMBER;
FUNCTION stats_date(p_table IN VARCHAR2, p_index IN VARCHAR2) RETURN DATE;
FUNCTION rand(p_seed NUMBER DEFAULT NULL) RETURN NUMBER;
FUNCTION to_base(p_dec NUMBER, p_base NUMBER) RETURN VARCHAR2;
FUNCTION patindex(p_pattern IN VARCHAR2, p_expr IN VARCHAR2) RETURN NUMBER;
FUNCTION DATEDIFF(P_DATEPART VARCHAR2, P_START_DATE_STR VARCHAR2, P_END_DATE_STR VARCHAR2) RETURN NUMBER;
FUNCTION DATEDIFF(P_DATEPART VARCHAR2, P_START_DATE_STR DATE, P_END_DATE_STR DATE) RETURN NUMBER;--Them
--FUNCTION day_(p_date_str IN VARCHAR2) RETURN NUMBER;
--FUNC DAY truyen kieu VARCHAR2
FUNCTION day_(p_date_str IN VARCHAR2) RETURN NUMBER;
--FUNC DAY truyen kieu DATE
FUNCTION DAY_(P_DATE_STR IN DATE) RETURN NUMBER;
--------------------------------------------------
FUNCTION ident_incr(p_sequence IN VARCHAR2) RETURN NUMBER;
FUNCTION isnumeric(p_expr IN VARCHAR2) RETURN NUMBER;
FUNCTION hex(p_num VARCHAR2) RETURN VARCHAR2;
PROCEDURE decrementTrancount;
FUNCTION difference(p_expr1 IN VARCHAR2, p_expr2 IN VARCHAR2) RETURN NUMBER;
FUNCTION datepart(p_part_expr IN VARCHAR2, p_date_str IN VARCHAR2) RETURN NUMBER;
FUNCTION datepart(p_part_expr IN VARCHAR2, p_date in date) RETURN NUMBER;
FUNCTION radians(p_degree IN NUMBER) RETURN NUMBER;
FUNCTION reverse_(p_expr IN VARCHAR2) RETURN VARCHAR2;
FUNCTION parsename(p_object_name IN VARCHAR2, p_object_piece IN NUMBER) RETURN VARCHAR2;
FUNCTION ROUND_(P_EXPR NUMBER, P_LEN NUMBER, P_FUNCTION NUMBER DEFAULT 0) RETURN NUMBER;
--FUNCTION month_(p_date_str IN VARCHAR2) RETURN NUMBER;
--FUNC MONTH truyen kieu VARCHAR2
FUNCTION MONTH_(P_DATE_STR IN VARCHAR2) RETURN NUMBER;
--FUNC MONTH truyen kieu DATE
FUNCTION MONTH_(P_DATE_STR IN DATE)RETURN NUMBER;
-----------------------------------------------------------
PROCEDURE commit_transaction;
FUNCTION pi RETURN NUMBER;
PROCEDURE resetTrancount;
FUNCTION oct(p_num VARCHAR2) RETURN VARCHAR2;
FUNCTION str(p_expr IN NUMBER, p_len IN NUMBER DEFAULT 10, p_scale IN NUMBER DEFAULT 0) RETURN VARCHAR2;
FUNCTION degrees(p_angle_radians IN NUMBER) RETURN NUMBER;
FUNCTION datename(p_part_expr IN VARCHAR2, p_date_str IN VARCHAR2) RETURN VARCHAR2;
FUNCTION ident_seed(p_sequence IN VARCHAR2) RETURN NUMBER;
FUNCTION quotename(p_str IN VARCHAR2, p_delimiters IN VARCHAR2 DEFAULT '[]') RETURN VARCHAR2;
FUNCTION str_to_date(p_date_expr IN VARCHAR2) RETURN DATE;
FUNCTION fetch_status(p_cursorfound IN BOOLEAN) RETURN NUMBER;
END sqlserver_utilities;
------------------------------------------+++--------------------------------------------------
create or replace
PACKAGE BODY sqlserver_utilities AS
FUNCTION str_to_date(p_date_expr IN VARCHAR2)
RETURN DATE
IS
temp_val NUMBER;
temp_exp VARCHAR2(50);
format_str VARCHAR2(50) := NULL;
BEGIN
IF p_date_expr IS NULL THEN
RETURN NULL;
END IF;
temp_exp := TRIM(p_date_expr);
-- only for 10g
IF NOT DBMS_DB_VERSION.VER_LE_9_2 THEN
IF REGEXP_INSTR(temp_exp,
'^\{d[[:space:]]*''([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})''\}$') = 1 THEN -- ISO861 format
-- e.g. {d '2004-05-23' }
temp_exp := REGEXP_REPLACE(temp_exp,
'^\{d[[:space:]]*''([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})''\}$',
'\1-\2-\3');
format_str := 'YYYY-MM-DD';
ELSIF REGEXP_INSTR(temp_exp,
'^\{t[[:space:]]*''([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})(\.[[:digit:]]{3})?''\}$',
1, 1, 0, 'i') = 1 THEN -- ISO861 format
-- e.g. { t '14:25:10.487' }
temp_exp := REGEXP_REPLACE(temp_exp,
'^\{t[[:space:]]*''([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})(\.[[:digit:]]{3})?''\}$',
TO_CHAR(SYSDATE, 'YYYY-MM-DD') || ' \1:\2:\3');
format_str := 'YYYY-MM-DD HH24:MI:SS';
ELSIF REGEXP_INSTR(temp_exp,
'^\{ts[[:space:]]*''([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})[[:space:]]*' ||
'([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})(\.[[:digit:]]{3})?''\}$',
1, 1, 0, 'i') = 1 THEN -- ISO861 format
-- e.g. { ts '2005-05-23 14:25:10'}
temp_exp := REGEXP_REPLACE(temp_exp,
'^\{ts[[:space:]]*''([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})[[:space:]]*' ||
'([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})(\.[[:digit:]]{3})?''\}$',
'\1-\2-\3 \4:\5:\6');
format_str := 'YYYY-MM-DD HH24:MI:SS';
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})T([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})(\.[[:digit:]]{3})?$') = 1 THEN -- ISO861 format
-- e.g. 2004-05-23T14:25:10.487
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})T([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})(\.[[:digit:]]{3})?$',
'\1-\2-\3 \4:\5:\6');
format_str := 'YYYY-MM-DD HH24:MI:SS';
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{1,2})[[:space:]]*(am|pm)$',
1, 1, 0, 'i') = 1 THEN -- time format
-- e.g. 4PM or 4 pm
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{1,2})[[:space:]]*(am|pm)$',
TO_CHAR(SYSDATE, 'YYYY-MM-DD') || ' \1\2', 1, 1, 'i');
format_str := 'YYYY-MM-DD HH12' || UPPER(REGEXP_SUBSTR(temp_exp, '(am|pm)$', 1, 1, 'i'));
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{1,2}):([[:digit:]]{2})(:[[:digit:]]{2})?([\.:][[:digit:]]{1,3})?[[:space:]]*(am|pm)?$',
1, 1, 0, 'i') = 1 THEN -- time format
-- e.g. 14:30 or 14:30:20.9 or 4:30:10 PM
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{1,2})(:[[:digit:]]{2})(:[[:digit:]]{2})?([\.:][[:digit:]]{1,3})?[[:space:]]*(am|pm)?$',
TO_CHAR(SYSDATE, 'YYYY-MM-DD') || '\1\2\3\5', 1, 1, 'i');
format_str := 'YYYY-MM-DD HH24:MI:SS';
IF REGEXP_INSTR(temp_exp, '(am|pm)$', 1, 1, 0, 'i') <> 0 THEN
format_str := REPLACE(format_str, 'HH24', 'HH12') || UPPER(REGEXP_SUBSTR(temp_exp, '(am|pm)$', 1, 1, 'i'));
END IF;
ELSIF REGEXP_INSTR(temp_exp, '^([[:digit:]]{4})$') = 1 THEN -- unseparated string format
-- 4 digits is interpreted as year, century must be specified
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{4})$',
'(01) 01 \1');
format_str := '(DD) MM YYYY';
ELSIF REGEXP_INSTR(temp_exp, '^[[:digit:]]{6,8}$') = 1 THEN -- unseparated string format
IF LENGTH(temp_exp) = 6 THEN
format_str := 'YYYYMMDD';
-- default two-digit year cutoff is 2050 i.e.
-- if the two digit year is greater than 50 the century prefix is interpreted as 19 otherwise it is 20.
IF TO_NUMBER(SUBSTR(temp_exp, 1, 2)) > 50 THEN
temp_exp := '19' || temp_exp;
ELSE
temp_exp := '20' || temp_exp;
END IF;
ELSE
format_str := 'YYYYMMDD';
END IF;
ELSIF REGEXP_INSTR(temp_exp, '[-/\\.]') = 0 THEN -- alphanumeric date format
IF REGEXP_INSTR(temp_exp,
'^([[:alpha:]]+)[[:space:]]*,?[[:space:]]*([[:digit:]]{4})$') = 1 THEN
-- e.g. APRIL, 1996 or APR 1996
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:alpha:]]+)[[:space:]]*,?[[:space:]]*([[:digit:]]{4})$',
'(01) \1 \2');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:alpha:]]+)[[:space:]]+([[:digit:]]{1,2})?,?[[:space:]]+([[:digit:]]{2,4})$') = 1 THEN
-- e.g. APRIL 15, 1996 or APR 15 96
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:alpha:]]+)[[:space:]]+([[:digit:]]{1,2})?,?[[:space:]]+([[:digit:]]{2,4})$',
'(\2) \1 \3');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:alpha:]]+)[[:space:]]+([[:digit:]]{2,4})([[:space:]]+)?([[:digit:]]{1,2})?$') = 1 THEN
-- e.g. APRIL 1996 or APRIL 1996 15
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:alpha:]]+)[[:space:]]+([[:digit:]]{2,4})([[:space:]]+)?([[:digit:]]{1,2})?$',
'(\4) \1 \2');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{1,2})?[[[:punct:]]]+([[:alpha:]]+),?[[:punct:]]+([[:digit:]]{2,4})$') = 1 THEN
-- e.g. 15 APR, 1996 or 15 APR 96 or APRIL 1996
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{1,2})?[[:punct:]]+([[:alpha:]]+),?[[:punct:]]+([[:digit:]]{2,4})$',
'(\1) \2 \3');
temp_exp := REPLACE(temp_exp, ',', '');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{1,2})?[[:space:]]+([[:digit:]]{2,4})[[:space:]]+([[:alpha:]]+)$') = 1 THEN
-- e.g. 15 1996 APRIL or 1996 APR
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{1,2})?[[:space:]]+([[:digit:]]{2,4})[[:space:]]+([[:alpha:]]+)$',
'(\1) \3 \2');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{2,4})[[:space:]]+([[:alpha:]]+)([[:space:]]+)?([[:digit:]]{1,2})?$') = 1 THEN
-- e.g. 1996 APRIL 15 or 1996 APR
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{2,4})[[:space:]]+([[:alpha:]]+)([[:space:]]+)?([[:digit:]]{1,2})?$',
'(\4) \2 \1');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{2,4})[[:space:]]+([[:digit:]]{1,2})?[[:space:]]+([[:alpha:]]+)$') = 1 THEN
-- e.g. 1996 15 APRIL or 1996 APR
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{2,4})[[:space:]]+([[:digit:]]{1,2})?[[:space:]]+([[:alpha:]]+)$',
'(\2) \3 \1');
END IF;
temp_exp := REPLACE(temp_exp, '()', '(1)');
IF TO_NUMBER(REGEXP_SUBSTR(temp_exp, '[[:digit:]]{2,4}$')) < 100 THEN
IF TO_NUMBER(REGEXP_SUBSTR(temp_exp, '[[:digit:]]{2,4}$')) > 50 THEN
temp_exp := REGEXP_REPLACE(temp_exp, '([[:digit:]]{2,4})$', '19' || '\1');
ELSE
temp_exp := REGEXP_REPLACE(temp_exp, '([[:digit:]]{2,4})$', '20' || '\1');
END IF;
END IF;
format_str := '(DD) MON YYYY';
ELSIF REGEXP_INSTR(temp_exp, '[-/\\.]') <> 0 THEN -- numeric date format
-- require the setting for SET FORMAT to determine the interpretation of the numeric date format,
-- default is mdy
IF REGEXP_INSTR(temp_exp,
-- e.g. 4/15/1996 or 15/4/1996 or 4/96/15
'^([[:digit:]]{1,2})[-/\.]([[:digit:]]{1,2})[-/\.]([[:digit:]]{2,4})$') = 1 THEN
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{1,2})[-/\.]([[:digit:]]{1,2})[-/\.]([[:digit:]]{2,4})$',
'\1/\2/\3');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{1,2})[-/\.]([[:digit:]]{2,4})[-/\.]([[:digit:]]{1,2})$') = 1 THEN
-- e.g. 15/96/4
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{1,2})[-/\.]([[:digit:]]{2,4})[-/\.]([[:digit:]]{1,2})$',
'\1/\3/\2');
ELSIF REGEXP_INSTR(temp_exp,
'^([[:digit:]]{2,4})[-/\.]([[:digit:]]{1,2})[-/\.]([[:digit:]]{1,2})$') = 1 THEN
-- e.g. 1996/4/15 or 1996/15/4
temp_exp := REGEXP_REPLACE(temp_exp,
'^([[:digit:]]{2,4})[-/\.]([[:digit:]]{1,2})[-/\.]([[:digit:]]{1,2})$',
'\2/\3/\1');
END IF;
-- first component
temp_val := TO_NUMBER(SUBSTR(temp_exp, 1, INSTR(temp_exp, '/') - 1));
IF temp_val > 31 AND temp_val < 100 THEN
format_str := 'YYYY/';
IF temp_val > 50 THEN
temp_exp := '19' || temp_exp;
ELSE
temp_exp := '20' || temp_exp;
END IF;
ELSIF temp_val > 12 THEN
format_str := 'DD/';
ELSE
format_str := 'MM/';
END IF;
-- second component
temp_val := TO_NUMBER(SUBSTR(temp_exp, INSTR(temp_exp, '/') + 1, INSTR(temp_exp, '/', 1, 2) - INSTR(temp_exp, '/') - 1));
IF temp_val > 31 AND temp_val < 100 THEN
format_str := format_str || 'YYYY/';
IF temp_val > 50 THEN
temp_exp := REGEXP_REPLACE(temp_exp, '/([[:digit:]]{2,4})/', '/19' || '\1/');
ELSE
temp_exp := REGEXP_REPLACE(temp_exp, '/([[:digit:]]{2,4})/', '/20' || '\1/');
END IF;
ELSIF temp_val > 12 THEN
format_str := format_str || 'DD/';
ELSE
IF INSTR(format_str, 'MM') > 0 THEN
format_str := format_str || 'DD';
ELSE
format_str := format_str || 'MM/';
END IF;
END IF;
IF INSTR(format_str, 'MM') = 0 THEN
format_str := format_str || 'MM';
ELSIF INSTR(format_str, 'DD') = 0 THEN
format_str := format_str || 'DD';
ELSE
IF TO_NUMBER(REGEXP_SUBSTR(temp_exp, '[[:digit:]]{2,4}$')) < 100 THEN
IF TO_NUMBER(REGEXP_SUBSTR(temp_exp, '[[:digit:]]{2,4}$')) > 50 THEN
temp_exp := REGEXP_REPLACE(temp_exp, '([[:digit:]]{2,4})$', '19' || '\1');
ELSE
temp_exp := REGEXP_REPLACE(temp_exp, '([[:digit:]]{2,4})$', '20' || '\1');
END IF;
END IF;
format_str := format_str || '/YYYY';
END IF;
END IF;
END IF;
IF format_str IS NOT NULL THEN
RETURN TO_DATE(temp_exp, format_str);
ELSE
RETURN TO_DATE(temp_exp, 'DD-MON-YYYY HH24:MI:SS');
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END STR_TO_DATE;
FUNCTION convert_(p_dataType IN VARCHAR2, p_expr IN VARCHAR2, p_style IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
IS
v_ret_value VARCHAR2(50);
v_format VARCHAR2(30);
v_year_format VARCHAR2(5) := 'YY';
v_format_type NUMBER;
v_numeric_dataType BOOLEAN := TRUE;
v_is_valid_date BINARY_INTEGER := 0;
BEGIN
IF INSTR(UPPER(p_dataType), 'DATE') <> 0 OR INSTR(UPPER(p_dataType), 'CHAR') <> 0 OR
INSTR(UPPER(p_dataType), 'CLOB') <> 0 THEN
v_numeric_dataType := FALSE;
END IF;
IF NOT v_numeric_dataType THEN
SELECT NVL2(TO_DATE(p_expr), 1, 0) INTO v_is_valid_date FROM DUAL;
END IF;
IF (str_to_date(p_expr) IS NOT NULL OR v_is_valid_date != 0 ) THEN
IF p_style IS NULL THEN
v_ret_value := TO_NCHAR(p_expr);
ELSE -- convert date to character data
v_format_type := TO_NUMBER(p_style);
IF v_format_type > 100 THEN
v_year_format := 'YYYY';
END IF;
v_format := CASE
WHEN v_format_type = 1 OR v_format_type = 101 THEN 'MM/DD/' || v_year_format
WHEN v_format_type = 2 OR v_format_type = 102 THEN v_year_format || '.MM.DD'
WHEN v_format_type = 3 OR v_format_type = 103 THEN 'DD/MM/' || v_year_format
WHEN v_format_type = 4 OR v_format_type = 104 THEN 'DD.MM.' || v_year_format
WHEN v_format_type = 5 OR v_format_type = 105 THEN 'DD-MM-' || v_year_format
WHEN v_format_type = 6 OR v_format_type = 106 THEN 'DD MM ' || v_year_format
WHEN v_format_type = 7 OR v_format_type = 107 THEN 'MON DD, ' || v_year_format
WHEN v_format_type = 8 OR v_format_type = 108 THEN 'HH12:MI:SS'
WHEN v_format_type = 9 OR v_format_type = 109 THEN 'MON DD YYYY HH12:MI:SS.FF3AM'
WHEN v_format_type = 10 OR v_format_type = 110 THEN 'MM-DD-' || v_year_format
WHEN v_format_type = 11 OR v_format_type = 111 THEN v_year_format || '/MM/DD'
WHEN v_format_type = 12 OR v_format_type = 112 THEN v_year_format || 'MMDD'
WHEN v_format_type = 13 OR v_format_type = 113 THEN 'DD MON YYYY HH12:MI:SS.FF3'
WHEN v_format_type = 14 OR v_format_type = 114 THEN 'HH24:MI:SS.FF3'
WHEN v_format_type = 20 OR v_format_type = 120 THEN 'YYYY-MM-DD HH24:MI:SS'
WHEN v_format_type = 21 OR v_format_type = 121 THEN 'YYYY-MM-DD HH24:MI:SS.FF3'
WHEN v_format_type = 126 THEN 'YYYY-MM-DD HH12:MI:SS.FF3'
WHEN v_format_type = 127 THEN 'YYYY-MM-DD HH12:MI:SS.FF3'
WHEN v_format_type = 130 THEN 'DD MON YYYY HH12:MI:SS:FF3AM'
WHEN v_format_type = 131 THEN 'DD/MM/YY HH12:MI:SS:FF3AM'
END;
v_ret_value := CASE
WHEN v_format_type = 9 OR v_format_type = 109 OR
v_format_type = 13 OR v_format_type = 113 OR
v_format_type = 14 OR v_format_type = 114 OR
v_format_type = 20 OR v_format_type = 120 OR
v_format_type = 21 OR v_format_type = 121 OR
v_format_type = 126 OR v_format_type = 127 OR
v_format_type = 130 OR v_format_type = 131 THEN
CASE UPPER(p_dataType)
WHEN 'DATE' THEN TO_CHAR(TO_TIMESTAMP(p_expr, v_format))
ELSE TO_CHAR(TO_TIMESTAMP(p_expr), v_format)
END
ELSE
CASE UPPER(p_dataType)
WHEN 'DATE' THEN TO_CHAR(TO_DATE(p_expr, v_format))
ELSE TO_CHAR(TO_DATE(p_expr), v_format)
END
END;
END IF;
ELSE
-- convert money or smallmoney to character data
IF SUBSTR(p_expr, 1, 1) = '$' THEN
v_ret_value := CASE TO_NUMBER(NVL(p_style, 1))
WHEN 1 THEN TO_CHAR(SUBSTR(p_expr, 2), '999999999999999990.00')
WHEN 2 THEN TO_CHAR(SUBSTR(p_expr, 2), '999,999,999,999,999,990.00')
WHEN 3 THEN TO_CHAR(SUBSTR(p_expr, 2), '999999999999999990.0000')
END;
ELSE -- convert numeric data to character data
v_ret_value := TO_CHAR(p_expr);
END IF;
END IF;
RETURN v_ret_value;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END CONVERT_;
--HAM YEAR truyen vao kieu VARCHAR2
FUNCTION year_(p_date_str IN VARCHAR2)
RETURN NUMBER
IS
v_date DATE;
BEGIN
v_date := str_to_date(p_date_str);
IF V_DATE IS NULL THEN
RETURN NULL;
END IF;
RETURN TO_NUMBER(TO_CHAR(v_date, 'YYYY'));
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END YEAR_;
--END YEAR_CHAR
--Ham YEAR truyen vao kieu DATE
FUNCTION year_(p_date_str IN DATE)
RETURN NUMBER
IS
v_date DATE;
BEGIN
v_date := str_to_date(TO_CHAR(p_date_str,'DD MON YYYY'));
IF V_DATE IS NULL THEN
RETURN NULL;
END IF;
RETURN TO_NUMBER(TO_CHAR(v_date, 'YYYY'));
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END YEAR_;
--END YEAR_DATE
FUNCTION stuff(p_expr VARCHAR2, p_startIdx NUMBER, p_len NUMBER, p_replace_expr VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN REPLACE(p_expr, SUBSTR(p_expr, p_startIdx, p_len), p_replace_expr);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END stuff;
PROCEDURE incrementTrancount
IS
BEGIN
trancount := trancount + 1;
END incrementTrancount;
--Ham DATEADD truyen vao ngay thang la kieu VARCHAR2
FUNCTION dateadd(p_interval IN VARCHAR2, p_interval_val IN NUMBER, p_date_str IN VARCHAR2)
RETURN DATE
IS
v_ucase_interval VARCHAR2(10);
v_date DATE;
BEGIN
v_date := str_to_date(p_date_str);
v_ucase_interval := UPPER(p_interval);
IF v_ucase_interval IN ('YEAR', 'YY', 'YYYY')
THEN
RETURN ADD_MONTHS(v_date, p_interval_val * 12);
ELSIF v_ucase_interval IN ('QUARTER', 'QQ', 'Q')
THEN
RETURN ADD_MONTHS(v_date, p_interval_val * 3);
ELSIF v_ucase_interval IN ('MONTH', 'MM', 'M')
THEN
RETURN ADD_MONTHS(v_date, p_interval_val);
ElSIF v_ucase_interval IN ('DAYOFYEAR', 'DY', 'Y', 'DAY', 'DD', 'D', 'WEEKDAY', 'DW', 'W')
THEN
RETURN v_date + p_interval_val;
ElSIF v_ucase_interval IN ('WEEK', 'WK', 'WW')
THEN
RETURN v_date + (p_interval_val * 7);
ElSIF v_ucase_interval IN ('HOUR', 'HH')
THEN
RETURN v_date + (p_interval_val / 24);
ElSIF v_ucase_interval IN ('MINUTE', 'MI', 'N')
THEN
RETURN v_date + (p_interval_val / 24 / 60);
ElSIF v_ucase_interval IN ('SECOND', 'SS', 'S')
THEN
RETURN v_date + (p_interval_val / 24 / 60 / 60);
ElSIF v_ucase_interval IN ('MILLISECOND', 'MS')
THEN
RETURN v_date + (p_interval_val / 24 / 60 / 60 / 1000);
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END DATEADD;
--Ham DATEADD truyen vao ngay thang la kieu DATE
FUNCTION dateadd(p_interval IN VARCHAR2, p_interval_val IN NUMBER, p_date_str IN DATE)
RETURN DATE
IS
v_ucase_interval VARCHAR2(10);
v_date DATE;
BEGIN
v_date := str_to_date(TO_CHAR(p_date_str,'DD MON YYYY'));
v_ucase_interval := UPPER(p_interval);
IF v_ucase_interval IN ('YEAR', 'YY', 'YYYY')
THEN
RETURN ADD_MONTHS(v_date, p_interval_val * 12);
ELSIF v_ucase_interval IN ('QUARTER', 'QQ', 'Q')
THEN
RETURN ADD_MONTHS(v_date, p_interval_val * 3);
ELSIF v_ucase_interval IN ('MONTH', 'MM', 'M')
THEN
RETURN ADD_MONTHS(v_date, p_interval_val);
ElSIF v_ucase_interval IN ('DAYOFYEAR', 'DY', 'Y', 'DAY', 'DD', 'D', 'WEEKDAY', 'DW', 'W')
THEN
RETURN v_date + p_interval_val;
ElSIF v_ucase_interval IN ('WEEK', 'WK', 'WW')
THEN
RETURN v_date + (p_interval_val * 7);
ElSIF v_ucase_interval IN ('HOUR', 'HH')
THEN
RETURN v_date + (p_interval_val / 24);
ElSIF v_ucase_interval IN ('MINUTE', 'MI', 'N')
THEN
RETURN v_date + (p_interval_val / 24 / 60);
ElSIF v_ucase_interval IN ('SECOND', 'SS', 'S')
THEN
RETURN v_date + (p_interval_val / 24 / 60 / 60);
ElSIF v_ucase_interval IN ('MILLISECOND', 'MS')
THEN
RETURN v_date + (p_interval_val / 24 / 60 / 60 / 1000);
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END DATEADD;
------------------------------------------------
FUNCTION isdate(p_expr IN VARCHAR2)
RETURN NUMBER
IS
v_is_valid_date BINARY_INTEGER := 0;
BEGIN
IF str_to_date(p_expr) IS NOT NULL THEN
RETURN 1;
ELSE
SELECT NVL2(TO_DATE(p_expr), 1, 0) INTO v_is_valid_date FROM DUAL;
RETURN v_is_valid_date;
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END isdate;
FUNCTION stats_date(p_table IN VARCHAR2, p_index IN VARCHAR2)
RETURN DATE
IS
v_last_analyzed DATE;
BEGIN
SELECT last_analyzed INTO v_last_analyzed
FROM USER_IND_STATISTICS
WHERE table_name LIKE UPPER(p_table)
AND index_name LIKE UPPER(p_index);
RETURN v_last_analyzed;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END stats_date;
FUNCTION rand(p_seed NUMBER DEFAULT NULL)
RETURN NUMBER
IS
v_rand_num NUMBER;
BEGIN
IF p_seed IS NOT NULL THEN
DBMS_RANDOM.SEED(p_seed);
END IF;
v_rand_num := DBMS_RANDOM.VALUE();
RETURN v_rand_num;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END rand;
FUNCTION to_base(p_dec NUMBER, p_base NUMBER)
RETURN VARCHAR2
IS
v_str VARCHAR2(255);
v_num NUMBER;
v_hex VARCHAR2(16) DEFAULT '0123456789ABCDEF';
BEGIN
v_num := p_dec;
IF p_dec IS NULL OR p_base IS NULL THEN
RETURN NULL;
END IF;
IF TRUNC(p_dec) <> p_dec OR p_dec < 0 THEN
RAISE PROGRAM_ERROR;
END IF;
LOOP
v_str := SUBSTR(v_hex, MOD(v_num, p_base) + 1, 1) || v_str;
v_num := TRUNC(v_num / p_base);
EXIT WHEN v_num = 0;
END LOOP;
RETURN v_str;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END to_base;
FUNCTION patindex(p_pattern IN VARCHAR2, p_expr IN VARCHAR2)
RETURN NUMBER
IS
v_search_pattern VARCHAR2(100);
v_pos NUMBER := 0;
BEGIN
IF p_pattern IS NULL OR p_expr IS NULL THEN
RETURN NULL;
END IF;
IF NOT DBMS_DB_VERSION.VER_LE_9_2 THEN
v_search_pattern := p_pattern;
v_search_pattern := REPLACE(v_search_pattern, '\', '\\');
v_search_pattern := REPLACE(v_search_pattern, '*', '\*');
v_search_pattern := REPLACE(v_search_pattern, '+', '\+');
v_search_pattern := REPLACE(v_search_pattern, '?', '\?');
v_search_pattern := REPLACE(v_search_pattern, '|', '\|');
v_search_pattern := REPLACE(v_search_pattern, '^', '\^');
v_search_pattern := REPLACE(v_search_pattern, '$', '\$');
v_search_pattern := REPLACE(v_search_pattern, '.', '\.');
v_search_pattern := REPLACE(v_search_pattern, '{', '\{');
v_search_pattern := REPLACE(v_search_pattern, '_', '.');
IF SUBSTR(v_search_pattern, 1, 1) != '%' AND
SUBSTR(v_search_pattern, -1, 1) != '%' THEN
v_search_pattern := '^' || v_search_pattern || '$';
ELSIF SUBSTR(v_search_pattern, 1, 1) != '%' THEN
v_search_pattern := '^' || SUBSTR(v_search_pattern, 1, LENGTH(v_search_pattern) - 1);
ELSIF SUBSTR(v_search_pattern, -1, 1) != '%' THEN
v_search_pattern := SUBSTR(v_search_pattern, 2) || '$';
ELSE
v_search_pattern := SUBSTR(v_search_pattern, 2, LENGTH(v_search_pattern) - 2);
END IF;
v_pos := REGEXP_INSTR(p_expr, v_search_pattern);
ELSE
v_pos := 0;
END IF;
RETURN v_pos;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END patindex;
FUNCTION datediff(p_datepart VARCHAR2, p_start_date_str VARCHAR2, p_end_date_str VARCHAR2)
RETURN NUMBER
IS
v_ret_value NUMBER := NULL;
v_part VARCHAR2(15);
v_start_date DATE;
v_end_date DATE;
BEGIN
v_start_date := str_to_date(p_start_date_str);
v_end_date := str_to_date(p_end_date_str);
v_part := UPPER(p_datepart);
IF v_part IN ('YEAR', 'YY', 'YYYY') THEN
IF EXTRACT(YEAR FROM v_end_date) - EXTRACT(YEAR FROM v_start_date) = 1 AND
EXTRACT(MONTH FROM v_start_date) = 12 AND EXTRACT(MONTH FROM v_end_date) = 1 AND
EXTRACT(DAY FROM v_start_date) = 31 AND EXTRACT(DAY FROM v_end_date) = 1 THEN
-- When comparing December 31 to January 1 of the immediately succeeding year,
-- DateDiff for Year ("yyyy") returns 1, even though only a day has elapsed.
v_ret_value := 1;
ELSE
v_ret_value := ROUND(MONTHS_BETWEEN(v_end_date, v_start_date) / 12);
END IF;
ELSIF v_part IN ('QUARTER', 'QQ', 'Q') THEN
v_ret_value := ROUND(MONTHS_BETWEEN(v_end_date, v_start_date) / 3);
ELSIF v_part IN ('MONTH', 'MM', 'M') THEN
v_ret_value := ROUND(MONTHS_BETWEEN(v_end_date, v_start_date));
ElSIF v_part IN ('DAYOFYEAR', 'DY', 'Y') THEN
v_ret_value := ROUND(v_end_date - v_start_date);
ElSIF v_part IN ('DAY', 'DD', 'D') THEN
v_ret_value := ROUND(v_end_date - v_start_date);
ElSIF v_part IN ('WEEK', 'WK', 'WW') THEN
v_ret_value := ROUND((v_end_date - v_start_date) / 7);
ELSIF v_part IN ('WEEKDAY', 'DW', 'W') THEN
v_ret_value := TO_CHAR(v_end_date, 'D') - TO_CHAR(v_start_date, 'D');
ElSIF v_part IN ('HOUR', 'HH') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24);
ElSIF v_part IN ('MINUTE', 'MI', 'N') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24 * 60);
ElSIF v_part IN ('SECOND', 'SS', 'S') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24 * 60 * 60);
ElSIF v_part IN ('MILLISECOND', 'MS') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24 * 60 * 60 * 1000);
END IF;
RETURN v_ret_value;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END DATEDIFF;
------------------------DATEDIFFF dung DATE-------------------------------
FUNCTION datediff(p_datepart VARCHAR2, p_start_date_str DATE, p_end_date_str DATE)
RETURN NUMBER
IS
v_ret_value NUMBER := NULL;
v_part VARCHAR2(15);
v_start_date DATE;
v_end_date DATE;
BEGIN
V_START_DATE := STR_TO_DATE(TO_CHAR(P_START_DATE_STR,'DD MON YYYY'));
v_end_date := str_to_date(TO_CHAR(p_end_date_str,'DD MON YYYY'));
v_part := UPPER(p_datepart);
IF v_part IN ('YEAR', 'YY', 'YYYY') THEN
IF EXTRACT(YEAR FROM v_end_date) - EXTRACT(YEAR FROM v_start_date) = 1 AND
EXTRACT(MONTH FROM v_start_date) = 12 AND EXTRACT(MONTH FROM v_end_date) = 1 AND
EXTRACT(DAY FROM v_start_date) = 31 AND EXTRACT(DAY FROM v_end_date) = 1 THEN
-- When comparing December 31 to January 1 of the immediately succeeding year,
-- DateDiff for Year ("yyyy") returns 1, even though only a day has elapsed.
v_ret_value := 1;
ELSE
v_ret_value := ROUND(MONTHS_BETWEEN(v_end_date, v_start_date) / 12);
END IF;
ELSIF v_part IN ('QUARTER', 'QQ', 'Q') THEN
v_ret_value := ROUND(MONTHS_BETWEEN(v_end_date, v_start_date) / 3);
ELSIF v_part IN ('MONTH', 'MM', 'M') THEN
v_ret_value := ROUND(MONTHS_BETWEEN(v_end_date, v_start_date));
ElSIF v_part IN ('DAYOFYEAR', 'DY', 'Y') THEN
v_ret_value := ROUND(v_end_date - v_start_date);
ElSIF v_part IN ('DAY', 'DD', 'D') THEN
v_ret_value := ROUND(v_end_date - v_start_date);
ElSIF v_part IN ('WEEK', 'WK', 'WW') THEN
v_ret_value := ROUND((v_end_date - v_start_date) / 7);
ELSIF v_part IN ('WEEKDAY', 'DW', 'W') THEN
v_ret_value := TO_CHAR(v_end_date, 'D') - TO_CHAR(v_start_date, 'D');
ElSIF v_part IN ('HOUR', 'HH') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24);
ElSIF v_part IN ('MINUTE', 'MI', 'N') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24 * 60);
ElSIF v_part IN ('SECOND', 'SS', 'S') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24 * 60 * 60);
ElSIF v_part IN ('MILLISECOND', 'MS') THEN
v_ret_value := ROUND((v_end_date - v_start_date) * 24 * 60 * 60 * 1000);
END IF;
RETURN v_ret_value;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END DATEDIFF;
------------------------------------------------------------------------------------------------
/*
FUNCTION day_(p_date_str IN VARCHAR2)
RETURN NUMBER
IS
v_date DATE;
BEGIN
v_date := str_to_date(TO_CHAR(p_date_str);
IF v_date IS NULL THEN
RETURN NULL;
END IF;
RETURN TO_NUMBER(TO_CHAR(v_date, 'DD'));
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END day_;
*/
--FUNC DAY truyen kieu VARCHAR2
FUNCTION day_(p_date_str IN VARCHAR2)
RETURN NUMBER
IS
v_date DATE;
BEGIN
v_date := str_to_date(p_date_str);
IF v_date IS NULL THEN
RETURN NULL;
END IF;
RETURN TO_NUMBER(TO_CHAR(v_date, 'DD'));
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END DAY_;
--DEN DAY_CHAR
--FUNC DAY truyen kieu DATE
FUNCTION day_(p_date_str IN DATE)
RETURN NUMBER
IS
v_date DATE;
BEGIN
v_date := str_to_date(TO_CHAR(p_date_str,'DD MON YYYY'));
IF v_date IS NULL THEN
RETURN NULL;
END IF;
RETURN TO_NUMBER(TO_CHAR(v_date, 'DD'));
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END DAY_;
--END DAY_DATE
FUNCTION ident_incr(p_sequence IN VARCHAR2)
RETURN NUMBER
IS
v_incr_by NUMBER;
BEGIN
SELECT increment_by INTO v_incr_by
FROM USER_SEQUENCES
WHERE sequence_name LIKE UPPER(p_sequence);
RETURN v_incr_by;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END ident_incr;
FUNCTION isnumeric(p_expr IN VARCHAR2)
RETURN NUMBER
IS
numeric_val NUMBER;
temp_str VARCHAR2(50);
BEGIN
temp_str := p_expr;
IF SUBSTR(temp_str, 1, 1) = '$' THEN
temp_str := SUBSTR(temp_str, 2);
END IF;
numeric_val := TO_NUMBER(temp_str);
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END isnumeric;
FUNCTION hex(p_num VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN to_base(p_num, 16);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END hex;
PROCEDURE decrementTrancount
IS
BEGIN
IF trancount > 0 THEN
trancount := trancount - 1;
END IF;
END decrementTrancount;
FUNCTION difference(p_expr1 IN VARCHAR2, p_expr2 IN VARCHAR2)
RETURN NUMBER
IS
sound_ex_val_1 CHAR(4);
sound_ex_val_2 CHAR(4);
similarity NUMBER := 0;
idx NUMBER := 1;
BEGIN
IF p_expr1 IS NULL OR p_expr2 IS NULL THEN
RETURN NULL;
END IF;
sound_ex_val_1 := SOUNDEX(p_expr1);
sound_ex_val_2 := SOUNDEX(p_expr2);
LOOP
IF SUBSTR(sound_ex_val_1, idx, 1) = SUBSTR(sound_ex_val_2, idx, 1) THEN
similarity := similarity + 1;
END IF;
idx := idx + 1;
EXIT WHEN idx > 4;
END LOOP;
RETURN similarity;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END difference;
FUNCTION datepart(p_part_expr IN VARCHAR2, p_date_str IN VARCHAR2)
RETURN NUMBER
IS
v_part VARCHAR2(15);
v_date DATE;
BEGIN
v_date := str_to_date(p_date_str);
v_part := UPPER(p_part_expr);
IF v_part IN ('YEAR', 'YY', 'YYYY') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'YYYY'));
ELSIF v_part IN ('QUARTER', 'QQ', 'Q') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'Q'));
ELSIF v_part IN ('MONTH', 'MM', 'M') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'MM'));
ElSIF v_part IN ('DAYOFYEAR', 'DY', 'Y') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'DDD'));
ELSIF v_part IN ('DAY', 'DD', 'D') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'DD'));
ELSIF v_part IN ('WEEKDAY', 'DW', 'W') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'D'));
ElSIF v_part IN ('WEEK', 'WK', 'WW') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'IW'));
ElSIF v_part IN ('HOUR', 'HH') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'HH24'));
ElSIF v_part IN ('MINUTE', 'MI', 'N') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'MI'));
ElSIF v_part IN ('SECOND', 'SS', 'S') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'SS'));
ElSIF v_part IN ('MILLISECOND', 'MS') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'FF3'));
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END datepart;
FUNCTION datepart(p_part_expr IN VARCHAR2, p_date in date)
RETURN NUMBER
IS
v_part VARCHAR2(15);
v_date DATE;
BEGIN
v_date := str_to_date(TO_CHAR(p_date,'DD MON YYYY'));
v_part := UPPER(p_part_expr);
IF v_part IN ('YEAR', 'YY', 'YYYY') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'YYYY'));
ELSIF v_part IN ('QUARTER', 'QQ', 'Q') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'Q'));
ELSIF v_part IN ('MONTH', 'MM', 'M') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'MM'));
ElSIF v_part IN ('DAYOFYEAR', 'DY', 'Y') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'DDD'));
ELSIF v_part IN ('DAY', 'DD', 'D') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'DD'));
ELSIF v_part IN ('WEEKDAY', 'DW', 'W') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'D'));
ElSIF v_part IN ('WEEK', 'WK', 'WW') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'IW'));
ElSIF v_part IN ('HOUR', 'HH') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'HH24'));
ElSIF v_part IN ('MINUTE', 'MI', 'N') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'MI'));
ElSIF v_part IN ('SECOND', 'SS', 'S') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'SS'));
ElSIF v_part IN ('MILLISECOND', 'MS') THEN RETURN TO_NUMBER(TO_CHAR(v_date, 'FF3'));
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END datepart;
FUNCTION radians(p_degree IN NUMBER)
RETURN NUMBER
IS
v_rad NUMBER;
BEGIN
v_rad := p_degree / 180 * pi();
RETURN v_rad;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END radians;
FUNCTION reverse_(p_expr IN VARCHAR2)
RETURN VARCHAR2
IS
v_result VARCHAR2(2000) := NULL;
BEGIN
FOR i IN 1..LENGTH(p_expr) LOOP
v_result := v_result || SUBSTR(p_expr, -i, 1);
END LOOP;
RETURN v_result;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END reverse_;
FUNCTION parsename(p_object_name IN VARCHAR2, p_object_piece IN NUMBER)
RETURN VARCHAR2
IS
ret_val VARCHAR2(150) := NULL;
pos NUMBER;
v_next_pos NUMBER;
BEGIN
IF p_object_name IS NULL THEN
RETURN NULL;
END IF;
-- for 10g
IF NOT DBMS_DB_VERSION.VER_LE_9_2 THEN
IF p_object_piece = 1 THEN -- object name
ret_val := REGEXP_SUBSTR(p_object_name, '(^[^\.]+$)|(\.[^\.]+$)');
ret_val := REPLACE(ret_val, '.', '');
ELSIF p_object_piece = 2 THEN -- schema name
ret_val := REGEXP_SUBSTR(p_object_name, '([^\.]+)\.([^\.]+$)');
ret_val := REGEXP_REPLACE(ret_val, '\.([^\.]+$)', '');
ELSIF p_object_piece = 3 THEN -- database name
ret_val := REGEXP_SUBSTR(p_object_name, '([^\.]+)\.([^\.]*)\.([^\.]+$)');
ret_val := REGEXP_REPLACE(ret_val, '\.([^\.]*)\.([^\.]+$)', '');
ELSIF p_object_piece = 4 THEN -- server name
ret_val := REGEXP_SUBSTR(p_object_name, '^([^\.]+)\.([^\.]*)\.([^\.]*)\.([^\.]+$)');
IF ret_val IS NOT NULL THEN
ret_val := REGEXP_REPLACE(p_object_name, '^([^\.]+)\.([^\.]*)\.([^\.]*)\.([^\.]+$)', '\1');
END IF;
END IF;
ELSE
ret_val := p_object_name;
v_next_pos := LENGTH(p_object_name);
FOR i IN 1 .. p_object_piece LOOP
pos := INSTR(p_object_name, '.', -1, i);
IF pos > 0 THEN
ret_val := SUBSTR(p_object_name, pos + 1, v_next_pos - pos);
END IF;
v_next_pos := pos;
END LOOP;
IF LENGTH(ret_val) = 0 THEN
RETURN NULL;
END IF;
END IF;
RETURN ret_val;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END parsename;
FUNCTION round_(p_expr NUMBER, p_len NUMBER, p_function NUMBER DEFAULT 0)
RETURN NUMBER
IS
v_ret_value NUMBER;
BEGIN
IF p_function = 0 THEN
v_ret_value := ROUND(p_expr, p_len);
ELSE
v_ret_value := TRUNC(p_expr, p_len);
END IF;
RETURN v_ret_value;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END ROUND_;
--Ham MONTH truyen kieu DATE
FUNCTION month_(p_date_str IN DATE)
RETURN NUMBER
IS
v_date DATE;
BEGIN
v_date := sqlserver_utilities.str_to_date(TO_CHAR(p_date_str,'DD MON YYYY'));
IF v_date IS NULL THEN
RETURN NULL;
END IF;
RETURN TO_NUMBER(TO_CHAR(v_date, 'MM'));
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END MONTH_;
--END MONTH_DATE
--Ham MONTH truyen kieu VARCHAR
FUNCTION month_(p_date_str IN VARCHAR2)
RETURN NUMBER
IS
v_date DATE;
BEGIN
v_date := sqlserver_utilities.str_to_date(p_date_str);
IF v_date IS NULL THEN
RETURN NULL;
END IF;
RETURN TO_NUMBER(TO_CHAR(v_date, 'MM'));
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END MONTH_;
--END MONTH_CHAR
PROCEDURE commit_transaction
IS
BEGIN
IF trancount <= 1 THEN
COMMIT;
END IF;
resetTrancount;
END commit_transaction;
FUNCTION pi
RETURN NUMBER
IS
pi NUMBER := 3.141592653589793116;
BEGIN
RETURN pi;
END pi;
PROCEDURE resetTrancount
IS
BEGIN
trancount := 0;
END resetTrancount;
FUNCTION oct(p_num VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN to_base(p_num, 8);
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END oct;
FUNCTION str(p_expr IN NUMBER, p_len IN NUMBER DEFAULT 10, p_scale IN NUMBER DEFAULT 0)
RETURN VARCHAR2
IS
v_ret_val VARCHAR2(50);
v_temp_val NUMBER;
v_format_str VARCHAR2(50);
BEGIN
IF p_len < LENGTH(TO_CHAR(p_expr)) THEN
RETURN '**';
END IF;
v_temp_val := p_expr;
v_temp_val := ROUND(v_temp_val, p_scale);
IF p_scale > 0 THEN
v_format_str := LPAD(' ', p_len - p_scale, '9');
v_format_str := TRIM(v_format_str) || '.';
v_format_str := RPAD(v_format_str, p_len, '0');
ELSE
v_format_str := LPAD('', p_len, '9');
END IF;
v_ret_val := TO_CHAR(v_temp_val, v_format_str);
RETURN v_ret_val;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END str;
FUNCTION degrees(p_angle_radians IN NUMBER)
RETURN NUMBER
IS
BEGIN
IF p_angle_radians IS NULL THEN
RETURN NULL;
END IF;
RETURN p_angle_radians / pi() * 180;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END degrees;
FUNCTION datename(p_part_expr IN VARCHAR2, p_date_str IN VARCHAR2)
RETURN VARCHAR2
IS
v_part VARCHAR2(15);
v_date DATE;
BEGIN
v_date := str_to_date(p_date_str);
v_part := UPPER(p_part_expr);
IF v_part IN ('YEAR', 'YY', 'YYYY') THEN RETURN TO_CHAR(v_date, 'YYYY');
ELSIF v_part IN ('QUARTER', 'QQ', 'Q') THEN RETURN TO_CHAR(v_date, 'Q');
ELSIF v_part IN ('MONTH', 'MM', 'M') THEN RETURN TO_CHAR(v_date, 'MONTH');
ElSIF v_part IN ('DAYOFYEAR', 'DY', 'Y') THEN RETURN TO_CHAR(v_date, 'DDD');
ELSIF v_part IN ('DAY', 'DD', 'D') THEN RETURN TO_CHAR(v_date, 'DD');
ELSIF v_part IN ('WEEKDAY', 'DW', 'W') THEN RETURN TO_CHAR(v_date, 'DAY');
ElSIF v_part IN ('WEEK', 'WK', 'WW') THEN RETURN TO_CHAR(v_date, 'IW');
ElSIF v_part IN ('HOUR', 'HH') THEN RETURN TO_CHAR(v_date, 'HH24');
ElSIF v_part IN ('MINUTE', 'MI', 'N') THEN RETURN TO_CHAR(v_date, 'MI');
ElSIF v_part IN ('SECOND', 'SS', 'S') THEN RETURN TO_CHAR(v_date, 'SS');
ElSIF v_part IN ('MILLISECOND', 'MS') THEN RETURN TO_CHAR(v_date, 'FF3');
ELSE
RETURN NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END datename;
FUNCTION ident_seed(p_sequence IN VARCHAR2)
RETURN NUMBER
IS
v_seed NUMBER;
BEGIN
SELECT min_value INTO v_seed
FROM USER_SEQUENCES
WHERE sequence_name LIKE UPPER(p_sequence);
RETURN v_seed;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END ident_seed;
FUNCTION quotename(p_str IN VARCHAR2, p_delimiters IN VARCHAR2 DEFAULT '[]')
RETURN VARCHAR2
IS
v_ret_val VARCHAR2(150) := NULL;
BEGIN
IF p_delimiters = '[]' THEN
v_ret_val := '[' || REPLACE(p_str, ']', ']]') || ']';
ELSIF p_delimiters = '"' THEN
v_ret_val := '"' || p_str || '"';
ELSIF p_delimiters = '''' THEN
v_ret_val := '''' || p_str || '''';
END IF;
RETURN v_ret_val;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20000, DBMS_UTILITY.FORMAT_ERROR_STACK);
END quotename;
FUNCTION fetch_status(p_cursorfound IN BOOLEAN)
RETURN NUMBER
IS
v_fetch_status NUMBER := 0;
BEGIN
CASE
WHEN p_cursorfound THEN
v_fetch_status := 0;
ELSE
v_fetch_status := -1;
END CASE;
return v_fetch_status;
END fetch_status;
END sqlserver_utilities;
Bạn đang đọc truyện trên: AzTruyen.Top