| Security Advisory | 
    
    
      How much more harmless could a built-in PL/SQL package be than one that is used for globalization and contains objects with names like GET_LOCAL_LANGUAGES
      and constants like KANA_HIRAGANA.? This package wouldn't be here if it had not already been used as part of an exploit. 
       
      What you should focus on is objects with names like RAW_TO_CHAR, RAW_TO_NCHAR, and STRING_TO_RAW.
      Look at the demo in the "How Oracle Works" section of this document to see an example of how this functionality could be used to hide an attack from monitoring and auditing. 
       
      Note: Internationalization is often abbreviated as I18N (or i18n or I18n) where the number 18 refers to the number of letters omitted. | 
    
    
      |   | 
    
    
      | Recommended Security Rules | 
    
    
       
       NEVER
      
        - Let any user or schema without documented justification  or escalated privileges 
        gain access to this package by revoking EXECUTE from PUBLIC
 
       
       WITH GREAT CARE
      
        - Identify legitimate requirements for access to this package and 
        grant EXECUTE explicitly to only justified schemas
 
       
       CAUTIONS 
      
        - Some usage may be in the form of dynamic SQL so carefully verify usage requirements in source code as well as in DBA_DEPENDENCIES
 
       
       | 
    
    
      |   | 
    
    
      | How Oracle Works | 
    
    
      | How Oracle intended UTL_I18N to be utilized to its customers | 
      DECLARE 
       enc_val   RAW(2000); 
       l_key     RAW(2000); 
       l_key_len NUMBER := 128/8; 
       l_mod     NUMBER := dbms_crypto.ENCRYPT_AES128+dbms_crypto.CHAIN_CBC+dbms_crypto.PAD_ZERO; 
      BEGIN 
        l_key := dbms_crypto.randombytes(l_key_len); 
        enc_val := dbms_crypto.encrypt(utl_i18n.string_to_raw('4114-0113-1518-7114', 'AL32UTF8'), l_mod, l_key); 
        dbms_output.put_line(enc_val); 
      END; 
      / | 
    
    
      | How UTL_I18N can be utilized by an attacker | 
      CREATE TABLE cc_data( 
      ccno     VARCHAR2(19), 
      expdate  DATE, 
      ccvno    VARCHAR2(4)); 
       
      INSERT INTO cc_data 
      (ccno, expdate, ccvno) 
      VALUES 
      ('4114-0113-1518-7114', SYSDATE, '1234'); 
       
      COMMIT; 
       
      DECLARE 
       sqlStr    VARCHAR2(160) := 'SELECT/**/ccno/**/||/**/TO_DATE(expdate)/**/||/**/ccvno/**/FROM/**/cc_data'; 
       input_raw RAW(2000); 
       retVal    VARCHAR2(60); 
      BEGIN 
      NULL; 
        dbms_output.put_line(sqlStr); 
       
        input_raw := utl_i18n.string_to_raw(sqlStr); 
        dbms_output.put_line(input_raw); 
       
        execute immediate utl_raw.cast_to_varchar2(input_raw) INTO retVal; 
       
        dbms_output.put_line(retVal); 
        dbms_output.put_line(utl_i18n.string_to_raw(retVal)); 
      END; 
      / 
      SELECT/**/ccno/**/||/**/TO_DATE(expdate)/**/||/**/ccvno/**/FROM/**/cc_data 
      53454C4543542F2A2A2F63636E6F2F2A2A2F7C7C2F2A2A2F544F5F44415445286578706461 
        (cont.) 7465292F2A2A2F7C7C2F2A2A2F6363766E6F2F2A2A2F46524F4D2F2A2A2F63635F64617461 
      4114-0113-1518-711430-NOV-2019 11:01:231234 
      343131342D303131332D313531382D3731313433302D4E4F562D323031392031313A30313A323331323334 
       
      No one is going to use the above demo to attack a database.
      But, the demo contains all of the elements required to write a successful attack. Is anyone going to view a 148 byte string as an attack on a table with credit card data. 
      It takes only one additional call to utl_i18n to obfuscate the returning string so that it is not obvious that it contains a credit card number, expiration date, and security code. | 
    
    
      |   | 
    
    
      | UTL_I18N Package Information | 
    
    
      | AUTHID | 
      DEFINER | 
    
    
      | Constants | 
      
        
          
            
              | Name | 
              Data Type | 
              Value | 
             
            
              | Encode SQL-XML Function | 
               
            
              | XMLTAG_TO_SQLNAME | 
              PLS_INTEGER | 
              0 | 
             
            
              | SQLNAME_TO_XMLTAG | 
              PLS_INTEGER | 
              1 | 
             
            
              | General: Used with SHIFT_STATUS | 
               
            
              | SHIFT_IN | 
              PLS_INTEGER | 
              0 | 
             
            
              | SHIFT_OUT | 
              PLS_INTEGER | 
              1 | 
             
            
              | Locale Map Flaggings | 
               
            
              | GENERIC_CONTEXT | 
              PLS_INTEGER | 
              0 | 
             
            
              | IANA_TO_ORACLE | 
              PLS_INTEGER | 
              1 | 
             
            
              | MAIL_CONTEXT | 
              PLS_INTEGER | 
              1 | 
             
            
              | MAIL_GENERIC | 
              PLS_INTEGER | 
              0 | 
             
            
              | MAIL_WINDOWS | 
              PLS_INTEGER | 
              1 | 
             
            
              | ORACLE_TO_IANA | 
              PLS_INTEGER | 
              0 | 
             
            
              | Translation Flags | 
               
            
              | LANGUAGE_TRANS | 
              PLS_INTEGER | 
              0 | 
             
            
              | TERRITORY_TRANS | 
              PLS_INTEGER | 
              1 | 
             
            
              | LANGUAGE_TERRITORY_TRANS | 
              PLS_INTEGER | 
              2 | 
             
            
              | Transliteration Constants | 
               
            
              | KANA_FWKATAKANA | 
              VARCHAR2(30) | 
              'kana_fwkatakana' | 
             
            
              | KANA_HWKATAKANA | 
              VARCHAR2(30) | 
              'kana_hwkatakana' | 
             
            
              | KANA_HIRAGANA | 
              VARCHAR2(30) | 
              'kana_hiragana' | 
             
            
              | FWKATAKANA_HWKATAKANA | 
              VARCHAR2(30) | 
              'fwkatakana_hwkatakana' | 
             
            
              | FWKATAKANA_HIRAGANA | 
              VARCHAR2(30) | 
              'fwkatakana_hiragana' | 
             
            
              | HWKATAKANA_FWKATAKANA | 
              VARCHAR2(30) | 
              'hwkatakana_fwkatakana' | 
             
            
              | HWKATAKANA_HIRAGANA | 
              VARCHAR2(30) | 
              'hwkatakana_hiragana' | 
             
            
              | HIRAGANA_FWKATAKANA | 
              VARCHAR2(30) | 
              hiragana_fwkatakana' | 
             
            
              | HIRAGANA_HWKATAKANA | 
              VARCHAR2(30) | 
              'hiragana_hwkatakana' | 
             
             | 
    
    
      | Data Types | 
      TYPE string_array IS TABLE of VARCHAR2(32767) 
      INDEX BY BINARY_INTEGER; | 
    
    
      | Dependencies | 
      
        
          
            
              | DBMS_CUBE | 
              DBMS_SCHEDULER | 
              UTL_I18_LIB | 
             
            
              | DBMS_ISCHED | 
              PLITBLM | 
              UTL_RAW | 
             
            
              | DBMS_ISCHED_REMOTE_ACCESS | 
              SPARQL_SERVICE_IMPL_T | 
              UTL_SMTP | 
             
             | 
    
    
      | Documented | 
      Yes | 
    
    
      | Exceptions | 
      
        
          
            
              | Error Code | 
              Reason | 
             
            
              | ORA-01722 | 
              Invalid number: escaping format is invalid | 
             
            
              | ORA-27102 | 
              Out of memory | 
             
            
              | ORA-03001 | 
              Unsupported Transliteration | 
             
             | 
    
    
      | First Available | 
      10.1 | 
    
    
      | Security Model | 
      Owned by SYS with EXECUTE granted to PUBLIC | 
    
    
      | Source | 
      {ORACLE_HOME}/rdbms/admin/utli18n.sql | 
    
    
      | Subprograms | 
      
         | 
    
    
      |   | 
    
    
      | ENCODE_SQL_XML | 
    
    
      | Converts between XML name and a SQL identifier | 
      utl_i18n.encode_sql_xml( 
      name IN VARCHAR2 CHARACTER SET ANY_CS, 
      flag IN PLS_INTEGER DEFAULT XMLTAG_TO_SQLNAME) 
      RETURN VARCHAR2 CHARACTER SET name%CHARSET; | 
    
    
      SELECT utl_i18n.encode_sql_xml('_xFFFF_',1) 
      FROM dual; 
       
      UTL_I18N.ENCODE_SQL_XML('_XFFFF_',1) 
      ----------------------------------------- 
      _x005F_xFFFF_ 
       
      SELECT utl_i18n.encode_sql_xml('_xHHHHHHHH_',1) 
      FROM dual; 
       
      UTL_I18N.ENCODE_SQL_XML('_XHHHHHHHH_',1) 
      ----------------------------------------- 
      _x005F_xHHHHHHHH_ | 
    
    
      |   | 
    
    
      | ESCAPE_REFERENCE | 
    
    
      | Converts a given text string to its character reference counterparts, for characters that fall outside the document character set | 
      utl_i18n.escape_reference( 
      str          IN VARCHAR2 CHARACTER SET ANY_CS, 
      page_cs_name IN VARCHAR2 DEFAULT NULL) 
      RETURN VARCHAR2 CHARACTER SET str%CHARSET; | 
    
    
      SELECT utl_i18n.escape_reference('UW' || CHR(150),'US7ASCII') 
      FROM dual; 
       
      UTL_I18N.ESCAPE_REFERENCE('UW'||CHR(150),'US7ASCII') 
      ---------------------------------------------------- 
      UW | 
    
    
      |   | 
    
    
      | GET_COMMON_TIME_ZONES | 
    
    
      | Returns the list of common time zone IDs that are independent of the locales | 
      utl_i18n.get_common_time_zones RETURN string_array; | 
    
    
      set serveroutput on 
       
      DECLARE 
       retval utl_i18n.string_array; 
       cnt    PLS_INTEGER; 
      BEGIN 
        retval   := utl_i18n.get_common_time_zones; 
        dbms_output.put('Count = '); 
        dbms_output.put_line(retval.LAST-retval.FIRST+1); 
        cnt := retval.FIRST; 
       
        WHILE cnt IS NOT NULL LOOP 
          dbms_output.put_line(retval(cnt)); 
          cnt := retval.NEXT(cnt); 
        END LOOP; 
      END; 
      / | 
    
    
      |   | 
    
    
      | GET_DEFAULT_CHARSET | 
    
    
      | Returns the default Oracle character set name or the default e-mail safe character set name from an Oracle language name | 
      utl_i18n.get_default_charset( 
      language  IN VARCHAR2, 
      context   IN PLS_INTEGER DEFAULT GENERIC_CONTEXT, 
      iswindows IN BOOLEAN DEFAULT FALSE) 
      RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.get_default_charset('English', 0) 
      FROM dual; 
       
      UTL_I18N.GET_DEFAULT_CHARSET('ENGLISH',0) 
      ------------------------------------------ 
      WE8ISO8859P1 
       
      SELECT utl_i18n.get_default_charset('Japanese', 0) 
      FROM dual; 
       
      UTL_I18N.GET_DEFAULT_CHARSET('JAPANESE',0) 
      ------------------------------------------- 
      JA16EUC | 
    
    
      |   | 
    
    
      | GET_DEFAULT_ISO_CURRENCY | 
    
    
      | Returns the default ISO 4217 currency code for the specified territory | 
      utl_i18n.get_default_iso_currency(territory IN VARCHAR2) RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.get_default_iso_currency('America') 
      FROM dual; 
       
      UTL_I18N.GET_DEFAULT_ISO_CURRENCY('AMERICA') 
      --------------------------------------------- 
      USD 
       
      SELECT utl_i18n.get_default_iso_currency('Japan') 
      FROM dual; 
       
      UTL_I18N.GET_DEFAULT_ISO_CURRENCY('JAPAN') 
      ------------------------------------------- 
      JPY | 
    
    
      |   | 
    
    
      | GET_DEFAULT_LINGUISTIC_SORT | 
    
    
      | Returns the default linguistic sort name for the specified language | 
      utl_i18n.get_default_linguistic_sort(language IN VARCHAR2)
      RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.get_default_linguistic_sort('German') 
      FROM dual; 
       
      UTL_I18N.GET_DEFAULT_LINGUISTIC_SORT('GERMAN') 
      ----------------------------------------------- 
      GENERIC_M | 
    
    
      |   | 
    
    
      | GET_LOCAL_LANGUAGES | 
    
    
      | Returns the local language names for the specified territory | 
      utl_i18n.get_local_languages(language IN VARCHAR2) RETURN string_array; | 
    
    
      set serveroutput on 
       
      DECLARE 
       retval utl_i18n.string_array; 
       cnt    PLS_INTEGER; 
      BEGIN 
        retval := utl_i18n.get_local_languages('SWITZERLAND'); 
        dbms_output.put('Count = '); 
        dbms_output.put_line(retval.LAST+1); 
        cnt := retval.FIRST; 
       
        WHILE cnt IS NOT NULL LOOP 
          dbms_output.put_line(retval(cnt)); 
          cnt := retval.NEXT(cnt); 
        END LOOP; 
      END; 
      / 
      Count = 2 
      GERMAN 
      FRENCH 
      ITALIAN 
       
      PL/SQL procedure successfully completed. | 
    
    
      |   | 
    
    
      | GET_LOCAL_LINGUISTIC_SORTS | 
    
    
      Returns the local linguistic sort names for the specified language 
       
      Thank you Michel Cadot for multiple corrections on this page. | 
      utl_i18n.get_local_linguistic_sorts(language IN VARCHAR2) RETURN string_array; | 
    
    
      DECLARE 
       retval utl_i18n.string_array; 
       cnt    PLS_INTEGER; 
      BEGIN 
        retval := utl_i18n.get_local_linguistic_sorts('American'); 
        dbms_output.put('Count = '); 
        dbms_output.put_line(retval.LAST-retval.FIRST+1); 
        cnt := retval.FIRST; 
        WHILE cnt IS NOT NULL LOOP 
          dbms_output.put_line(retval(cnt)); 
          cnt := retval.NEXT(cnt); 
        END LOOP; 
      END; 
      / 
      Count = 2 
      GENERIC_M 
      BINARY 
       
      PL/SQL procedure successfully completed. 
       
      DECLARE 
       retval utl_i18n.string_array; 
       cnt PLS_INTEGER; 
      BEGIN 
        retval := utl_i18n.get_local_linguistic_sorts('Simplified Chinese'); 
        dbms_output.put('Count = '); 
        dbms_output.put_line(retval.LAST-retval.FIRST+1); 
        cnt := retval.FIRST; 
        WHILE cnt IS NOT NULL LOOP 
          dbms_output.put_line(retval(cnt)); 
          cnt := retval.NEXT(cnt); 
        END LOOP; 
      END; 
      / 
      Count = 5 
      SCHINESE_PINYIN_M 
      SCHINESE_STROKE_M 
      SCHINESE_RADICAL_M 
      GBK 
      BINARY 
       
      PL/SQL procedure successfully completed. | 
    
    
      |   | 
    
    
      | GET_LOCAL_TERRITORIES | 
    
    
      | Returns the local territory names for the specified language | 
      utl_i18n.get_local_territories(language IN VARCHAR2 CHARACTER SET ANY_CS) 
      RETURN string_array; | 
    
    
      set serveroutput on 
       
      DECLARE 
       retVal utl_i18n.string_array; 
       cnt    PLS_INTEGER; 
      BEGIN 
        retval := utl_i18n.get_local_territories('ENGLISH'); 
        dbms_output.put('Count = '); 
        dbms_output.put_line(retval.LAST-retval.FIRST+1); 
        cnt := retval.FIRST; 
        WHILE cnt IS NOT NULL LOOP 
          dbms_output.put_line(retval(cnt)); 
          cnt := retval.NEXT(cnt); 
        END LOOP; 
      END; 
      / 
      Count = 36 
      UNITED KINGDOM 
      AMERICA 
      ANTIGUA AND BARBUDA 
      AUSTRALIA 
      BAHAMAS 
      BARBADOS 
      BELIZE 
      BERMUDA 
      BOTSWANA 
      CANADA 
      CAYMAN ISLANDS 
      DOMINICA 
      GHANA 
      GRENADA 
      GUYANA 
      HONG KONG 
      INDIA 
      IRELAND 
      JAMAICA 
      MALAWI 
      MAURITIUS 
      NAMIBIA 
      NEW ZEALAND 
      NIGERIA 
      PAKISTAN 
      SAINT KITTS AND NEVIS 
      SAINT LUCIA 
      SIERRA LEONE 
      SINGAPORE 
      SOUTH AFRICA 
      SOUTH SUDAN 
      SWAZILAND 
      TRINIDAD AND TOBAGO 
      UGANDA 
      ZAMBIA 
      ZIMBABWE 
       
      PL/SQL procedure successfully completed. | 
    
    
      |   | 
    
    
      | GET_LOCAL_TIME_ZONES | 
    
    
      | Returns the local time zone IDs for the specified territory | 
      utl_i18n.get_local_time_zones(territory IN VARCHAR2) RETURN string_array; | 
    
    
      set serveroutput on 
       
      DECLARE 
       retVal utl_i18n.string_array; 
       cnt    PLS_INTEGER; 
      BEGIN 
        retVal := utl_i18n.get_local_time_zones('AMERICA'); 
        dbms_output.put('Count = '); 
        dbms_output.put_line(retVal.LAST-retVal.FIRST+1); 
        cnt := retVal.FIRST; 
       
        WHILE cnt IS NOT NULL LOOP 
          dbms_output.put_line(retval(cnt)); 
          cnt := retval.NEXT(cnt); 
        END LOOP; 
      END; 
      / 
      Count = 8 
      America/New_York 
      America/Indianapolis 
      America/Chicago 
      America/Denver 
      America/Phoenix 
      America/Los_Angeles 
      America/Anchorage 
      Pacific/Honolulu 
       
      PL/SQL procedure successfully completed. | 
    
    
      |   | 
    
    
      | GET_MAX_CHARACTER_SIZE | 
    
    
      | Returns the maximum number of bytes in a character set's characters | 
      utl_i18n.get_max_character_size(charset_name IN VARCHAR2) RETURN BINARY_INTEGER; | 
    
    
      SELECT utl_i18n.get_max_character_size('US7ASCII') 
      FROM dual; 
       
      UTL_I18N.GET_MAX_CHARACTER_SIZE('US7ASCII') 
      ------------------------------------------- 
                                                1 
       
      SELECT utl_i18n.get_max_character_size('JA16EUC') 
      FROM dual; 
       
      UTL_I18N.GET_MAX_CHARACTER_SIZE('JA16EUC') 
      ------------------------------------------ 
                                               3 
       
      SELECT utl_i18n.get_max_character_size('AL32UTF8') 
      FROM dual; 
       
      UTL_I18N.GET_MAX_CHARACTER_SIZE('AL32UTF8') 
      ------------------------------------------- 
                                                4 | 
    
    
      |   | 
    
    
      | GET_TRANSLATION | 
    
    
      | Returns the translation of the language and territory name in the specified translation language | 
      utl_i18n.get_translation( 
      param1         IN VARCHAR2 CHARACTER SET ANY_CS, 
      trans_language IN VARCHAR2    DEFAULT 'AMERICAN', 
      flag           IN PLS_INTEGER DEFAULT LANGUAGE_TRANS) 
      RETURN VARCHAR2 CHARACTER SET param1%CHARSET; | 
    
    
      set linesize 121 
      col parameter format a20 
      col value format a20 
       
      SELECT * FROM gv$nls_valid_values; 
       
      SELECT utl_i18n.get_translation('SIMPLIFIED CHINESE', 'ITALIAN') 
      FROM dual; 
       
      UTL_I18N.GET_TRANSLATION('SIMPLIFIEDCHINESE','ITALIAN') 
      ------------------------------------------------------- 
      Cinese semplificato 
       
      SELECT utl_i18n.get_translation('AMERICAN', 'SPANISH') 
      FROM dual; 
       
      UTL_I18N.GET_TRANSLATION('AMERICAN','SPANISH') 
      ---------------------------------------------- 
      Ingles Americano 
       
      SELECT utl_i18n.get_translation('SIMPLIFIED CHINESE', 'GERMAN') 
      FROM dual; 
       
      UTL_I18N.GET_TRANSLATION('SIMPLIFIEDCHINESE','GERMAN') 
      ------------------------------------------------------ 
      Vereinfachtes Chinesisch 
       
      SELECT utl_i18n.get_translation('SIMPLIFIED CHINESE', 'SWEDISH') 
      FROM dual; 
       
      UTL_I18N.GET_TRANSLATION('SIMPLIFIEDCHINESE','SWEDISH') 
      ------------------------------------------------------- 
      Forenklad kinesiska 
       
      SELECT utl_i18n.get_translation('AMERICAN', 'DANISH') 
      FROM dual; 
       
      UTL_I18N.GET_TRANSLATION('AMERICAN','DANISH') 
      --------------------------------------------- 
      Amerikansk | 
    
    
      |   | 
    
    
      | MAP_CHARSET | 
    
    
      Maps an Oracle character set name to an IANA character set name 
       
      Maps an IANA character set name to an Oracle character set name 
       
      Maps an Oracle character set to an e-mail safe character set name | 
      utl_i18n.map_charset( 
      charset  IN VARCHAR2, 
      context  IN PLS_INTEGER DEFAULT GENERIC_CONTEXT, 
      flag    IN PLS_INTEGER DEFAULT ORACLE_TO_IANA) 
      RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.map_charset('iso-8859-1', 0, 1) 
      FROM dual; 
       
      UTL_I18N.MAP_CHARSET('ISO-8859-1',0,1) 
      -------------------------------------- 
      WE8ISO8859P1 
       
      SELECT utl_i18n.map_charset('iso-8859-1', 1, 0) 
      FROM dual; 
       
      UTL_I18N.MAP_CHARSET('ISO-8859-1',1,0) 
      -------------------------------------- 
      AL32UTF8 | 
    
    
      |   | 
    
    
      | MAP_FROM_SHORT_LANGUAGE | 
    
    
      | Maps an Oracle short language name to its full language name | 
      utl_i18n.map_territory_from_short_language(language IN VARCHAR2) RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.map_from_short_language('GB') 
      FROM dual; 
       
      UTL_I18N.MAP_FROM_SHORT_LANGUAGE('GB') 
      -------------------------------------- 
      ENGLISH 
       
      SELECT utl_i18n.map_from_short_language('SW') 
      FROM dual; 
       
      UTL_I18N.MAP_FROM_SHORT_LANGUAGE('SW') 
      -------------------------------------- 
      SWAHILI | 
    
    
      |   | 
    
    
      | MAP_LANGUAGE_FROM_ISO | 
    
    
      | Returns an Oracle language name from an ISO locale name | 
      utl_i18n.map_language_from_iso(isolocale IN VARCHAR2) RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.map_language_from_iso('en_US') 
      FROM dual; 
       
      UTL_I18N.MAP_LANGUAGE_FROM_ISO('EN_US') 
      --------------------------------------- 
      AMERICAN | 
    
    
      |   | 
    
    
      | MAP_LOCALE_TO_ISO | 
    
    
      | Returns an ISO locale name from an Oracle language name and an Oracle territory name | 
      utl_i18n.map_locale_to_iso( 
      ora_language  IN VARCHAR2, 
      ora_territory IN VARCHAR2) 
      RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.map_locale_to_iso('American', 'America') 
      FROM dual; 
       
      UTL_I18N.MAP_LOCALE_TO_ISO('AMERICAN','AMERICA') 
      ------------------------------------------------ 
      en_US | 
    
    
      |   | 
    
    
      | MAP_TERRITORY_FROM_ISO | 
    
    
      | Returns an Oracle territory name from an ISO locale | 
      utl_i18n.map_territory_from_iso(isolocale IN VARCHAR2) RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.map_territory_from_iso('en_US') 
      FROM dual; 
       
      UTL_I18N.MAP_TERRITORY_FROM_ISO('EN_US') 
      ----------------------------------------- 
      AMERICA | 
    
    
      |   | 
    
    
      | MAP_TO_SHORT_LANGUAGE | 
    
    
      | Maps an Oracle full language name to short language name | 
      utl_i18n.map_territory_to_short_language(language IN VARCHAR2) RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.map_to_short_language('ENGLISH') 
      FROM dual; 
       
      UTL_I18N.MAP_TO_SHORT_LANGUAGE('ENGLISH') 
      ----------------------------------------- 
      GB | 
    
    
      |   | 
    
    
      | RAW_TO_CHAR | 
    
    
      Convert RAW to a string of type CHAR 
       
      Overload 1 | 
      utl_i18n.raw_to_char( 
      data        IN RAW, 
      src_charset IN VARCHAR2 DEFAULT NULL) 
      RETURN VARCHAR2; | 
    
    
      SELECT utl_i18n.raw_to_char('44616E204D6F7267616E','AL32UTF8') 
      FROM dual; 
       
      UTL_I18N.RAW_TO_CHAR('44616E204D6F7267616E','AL32UTF8') 
      -------------------------------------------------------- 
      Dan Morgan | 
    
    
      | Overload 2 | 
      utl_i18n.raw_to_char( 
      data            IN     RAW, 
      src_charset     IN     VARCHAR2 DEFAULT NULL, 
      scanned_length     OUT PLS_INTEGER, 
      shift_status    IN OUT PLS_INTEGER) 
      RETURN VARCHAR2; | 
    
    
      set serveroutput on 
       
      DECLARE 
       scnlen PLS_INTEGER; 
       shstat PLS_INTEGER := 1; 
       retval VARCHAR2(30); 
      BEGIN 
        retval := utl_i18n.raw_to_char('44616E204D6F7267616E', 'AL32UTF8', scnlen, shstat); 
        dbms_output.put_line(retval); 
        dbms_output.put_line(scnlen); 
        dbms_output.put_line(shstat); 
      END; 
      / 
      Dan Morgan 
      10 
      0 
       
      PL/SQL procedure successfully completed. | 
    
    
      |   | 
    
    
      | RAW_TO_NCHAR | 
    
    
      Convert RAW to a string of type NCHAR 
       
      Overload 1 | 
      utl_i18n.raw_to_nchar( 
      data        IN RAW, 
      src_charset IN VARCHAR2 DEFAULT NULL) 
      RETURN NVARCHAR2; | 
    
    
      SELECT utl_i18n.raw_to_nchar('44616E204D6F7267616E','AL32UTF8') 
      FROM dual; 
       
      UTL_I18N.RAW_TO_NCHAR('44616E204D6F7267616E','AL32UTF8') 
      --------------------------------------------------------- 
      Dan Morgan | 
    
    
      | Overload 2 | 
      utl_i18n.raw_to_nchar( 
      data           IN     RAW, 
      src_charset    IN     VARCHAR2 DEFAULT NULL, 
      scanned_length    OUT PLS_INTEGER, 
      shift_status   IN OUT PLS_INTEGER) 
      RETURN NVARCHAR2; | 
    
    
      set serveroutput on 
       
      DECLARE 
       scnlen PLS_INTEGER; 
       shstat PLS_INTEGER := 3; 
       retval VARCHAR2(30); 
      BEGIN 
        retval := utl_i18n.raw_to_nchar('44616E204D6F7267616E', 'AL32UTF8', scnlen, shstat); 
        dbms_output.put_line(retval); 
        dbms_output.put_line(scnlen); 
        dbms_output.put_line(shstat); 
      END; 
      / 
      Dan Morgan 
      10 
      0 
       
      PL/SQL procedure successfully completed. | 
    
    
      |   | 
    
    
      | STRING_TO_RAW | 
    
    
      | Convert a string to RAW | 
      utl_i18n.string_to_raw( 
      data        IN VARCHAR2 CHARACTER SET ANY_CS, 
      dst_charset IN VARCHAR2 DEFAULT NULL) 
      RETURN RAW; | 
    
    
      SELECT utl_i18n.string_to_raw('Dan Morgan','AL32UTF8') 
      FROM dual; 
       
      UTL_I18N.STRING_TO_RAW('DANMORGAN','AL32UTF8') 
      ----------------------------------------------- 
      44616E204D6F7267616E | 
    
    
      |   | 
    
    
      | TRANSLITERATE | 
    
    
      | Transliterates between Japanese hiragana and katakana | 
      utl_i18n.transliterate ( 
      data IN VARCHAR2 CHARACTER SET ANY_CS, 
      name IN VARCHAR2) 
      RETURN VARCHAR2 CHARACTER SET data%CHARSET; | 
    
    
      set serveroutput on 
       
      DECLARE 
       name japanese_emp.ename%TYPE; 
       eno  CONSTANT NUMBER(4) := 1; 
      BEGIN 
        SELECT ename 
        INTO name 
        FROM japanese_emp 
        WHERE enumber = eno; 
       
        name := utl_i18n.transliterate(name, utl_i18n.kana_hiragana); 
       
        dbms_output.put_line(name); 
      EXCEPTION 
        WHEN utl_i18n.unsupported_transliteration THEN 
          dbms_output.put_line('transliteration not supported'); 
      END; 
      / | 
    
    
      |   | 
    
    
      | UNESCAPE_REFERENCE | 
    
    
      | Converts an input string that contains character references to a text string | 
      utl_i18n.unescape_reference(str IN VARCHAR2 CHARACTER SET ANY_CS) 
      RETURN VARCHAR2 CHARACTER SET str%CHARSET; | 
    
    
      SELECT utl_i18n.unescape_reference('UW–') 
      FROM dual; 
       
      UTL_I18N.UNESCAPE_REFERENCE('UW–') 
      ------------------------------------------ 
      UW? | 
    
    
      |   | 
    
    
      | VALIDATE_CHARACTER_ENCODING | 
    
    
      Validates the character encoding of VARCHAR2/NVARCHAR2 data 
       
      Overload 1 | 
      utl_i18n.validate_character_encoding(str IN VARCHAR2 CHARACTER SET ANY_CS) 
      RETURN PLS_INTEGER; | 
    
    
      SELECT utl_i18n.validate_character_encoding('Daniel Morgan') 
      FROM dual; 
       
      UTL_I18N.VALIDATE_CHARACTER_ENCODING('DANIELMORGAN') 
      ---------------------------------------------------- 
                                                         0 | 
    
    
      Validate CLOB/NCLOB data for database/national character set 
       
      Overload 2 | 
      utl_i18n.validate_character_encoding(lob_loc IN CLOB CHARACTER SET ANY_CS) 
      RETURN NUMBER; | 
    
    
      DECLARE 
       inClob CLOB := 'Morgan''s Library'; 
       retVal NUMBER; 
      BEGIN 
        retVal := utl_i18n.validate_character_encoding(inClob); 
        dbms_output.put_line(retVal); 
      END; 
      / 
      0 
       
      PL/SQL procedure successfully completed. | 
    
    
      |   | 
    
    
      | VALIDATE_SQLNAME | 
    
    
      | Validates an oracle object name | 
      utl_i18n.validate_sqlname(name IN VARCHAR2 CHARACTER SET ANY_CS) 
      RETURN PLS_INTEGER; | 
    
    
      set define off 
       
      SELECT utl_i18n.validate_sqlname('&') 
      FROM dual; 
       
      UTL_I18N.VALIDATE_SQLNAME('&') 
      ------------------------------- 
                                   0 |