【问题标题】:Can you provide and example of utl_raw.convert + utl_raw.cast_to_varchar2?你能提供 utl_raw.convert + utl_raw.cast_to_varchar2 的例子吗?
【发布时间】:2020-07-11 12:16:20
【问题描述】:

谁能告诉我utl_raw.convert 在Oracle 11g 中如何与utl_raw.cast_to_varchar2 一起工作,请提供示例代码,因为我无法在线找到示例用例。

谢谢 高塔姆

【问题讨论】:

    标签: oracle plsql utf-8 ascii file-handling


    【解决方案1】:

    UTL_RAW.CONVERT 是一个函数,用于将原始字符集从一个字符集转换为另一个字符集,并将结果作为原始字符集返回。

    因此,函数接受 3 个参数:

    • 要转换的原始数据
    • 字符集目的地
    • 字符集来源

    UTL_RAW.CAST_TO_VARCHAR2 将原始字符串转换为 varchar2 数据类型。

    我们来测试一下

    我的设置:Oracle 11g 数据库字符集:UTF-8

    SQL> create table test_raw ( c1 raw(256) ) ;
    
    Table created.
    
    SQL>  insert into test_raw select UTL_RAW.CAST_TO_RAW ( '123009988poee' ) from dual ;
    
    1 row created.
    
    SQL> insert into test_raw select UTL_RAW.CAST_TO_RAW ( 'üäöüöä' ) from dual ;
    
    1 row created.
    
    SQL> commit ;
    
    Commit complete.
    
    SQL> select * from test_raw ;
    
    C1
    --------------------------------------------------------------------------------
    313233303039393838706F6565
    EFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD
    
    SQL> select utl_raw.cast_to_varchar2 ( a.c1 ) from test_raw a ;
    
    UTL_RAW.CAST_TO_VARCHAR2(A.C1)
    --------------------------------------------------------------------------------
    123009988poee
    ????????????
    

    这里我对第二个 raw 的表示不准确,因为我必须首先 cast_to_raw。如果你不这样做,你会得到 ORA-O1465: invalid hex number。

    SQL> select utl_raw.cast_to_varchar2 ( utl_raw.convert ( utl_raw.cast_to_raw ( a.c1 ) , 'we8mswin1252' , 'al32utf8' ) ) as result
      2  from test_raw a ;
    
    RESULT
    --------------------------------------------------------------------------------
    313233303039393838706F6565
    EFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBDEFBFBD
    

    也可以使用 dump() 函数来调查构成字符串的字节值。这样您就可以确定字符串是否由正确的值组成。

    SQL> select dump ( utl_raw.cast_to_varchar2 ( utl_raw.convert ( utl_raw.cast_to_raw ( a.c1 ) , 'we8mswin1252' , 'al32utf8' )  ) ) as dump_result
    from test_raw a
    
    RESULT
    --------------------------------------------------------------------------------
    Typ=1 Len=26: 51,49,51,50,51,51,51,48,51,48,51,57,51,57,51,56,51,56,55,48,54,70,
    54,53,54,53
    
    Typ=1 Len=72: 69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,
    66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69
    ,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68,69,70,66,70,66,68
    
    
    SQL> select dump ( c1 ) from test_raw ;
    
    DUMP(C1)
    --------------------------------------------------------------------------------
    Typ=23 Len=13: 49,50,51,48,48,57,57,56,56,112,111,101,101
    Typ=23 Len=36: 239,191,189,239,191,189,239,191,189,239,191,189,239,191,189,239,1
    91,189,239,191,189,239,191,189,239,191,189,239,191,189,239,191,189,239,191,189
    

    【讨论】:

    • 感谢您的宝贵回复。如果接口团队发送的文件包含以下行,其中包含节符号,例如 §test1§test2§ 。如何使用 UTL_RAW 读取它,转换和转换并将其插入到表中。目前我正在使用 utl_file.get_line 并且它没有读取节符号。我的 DB 字符集是 UTF8,并且接口正在发送带有 iso-8859-1 字符集的文件。 Oracle 数据库版本是 11.2.0.4.0.1。你能帮帮我吗?谢谢。
    • @GautamS ,您需要编辑问题并提供您正在使用的文本和代码示例。
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多