Chào các bạn! Vì nhiều lý do từ nay Truyen2U chính thức đổi tên là Truyen247.Pro. Mong các bạn tiếp tục ủng hộ truy cập tên miền mới này nhé! Mãi yêu... ♥

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: Truyen247.Pro

Tags: