现有Oracle数据库中的一张表,表中某字段的值为几个Unicode,如:\u4e2a\u4eba\u4fe1\u7528
其实就是4个汉字,我希望将他们转换为汉字后输出到文本文件中。如何用PL/SQL实现Unicode到汉字的转换呢?Oracle有没有相关的函数或API?
刚接触PL/SQL,请大家帮忙!100分奉上!

解决方案 »

  1.   

    oracle没有。
    你可以把代码存入库中,读出后用别的有这个功能的语言转换一下。
      

  2.   

    感谢楼上的回答
    别的语言已经实现了,我现在就是要把别的语言转化为PL/SQL,哈!
      

  3.   

    用个函数就可以了:
    SELECT unistr(REPLACE('\u4eba\u4fe1\u7528','\u','\')) FROM dual;
    --人信用
      

  4.   

    今天才学习到原来有UNISTR这个函数。
      

  5.   

    在命令行下可以这样执行,但放在PL/SQL程序中就不行了:v_ext_des是Unicode字符串
    语句:
    v_sql := 'select unistr(REPLACE(v_ext_des,''\u'',''\'')) from dual ';
    EXECUTE IMMEDIATE v_sql into text_buffer;报错:ORA-00904: "V_EXT_DES": invalid identifiertext_buffer拿不到值,是什么原因呢?
      

  6.   

    v_sql := 'select unistr(REPLACE('||v_ext_des||',''\u'',''\'')) from dual '; 
    EXECUTE IMMEDIATE v_sql into text_buffer; 
      

  7.   

    感谢楼上高人的回答,编译没问题,但运行起来还是报错:
    ORA-00911: invalid character是怎么回事呢?[Quote=引用 7 楼 oracledbalgtu 的回复:]
    SQL codev_sql := 'select unistr(REPLACE('||v_ext_des||',''\u'',''\'')) from dual '; 
    EXECUTE IMMEDIATE v_sql into text_buffer; 
      

  8.   

    v_ext_des是Unicode字符串 
    语句: 
    v_sql := 'select unistr(REPLACE(v_ext_des,''\u'',''\'')) from dual '; 
    EXECUTE IMMEDIATE v_sql into text_buffer; 报错:ORA-00904: "V_EXT_DES": invalid identifier 似乎v_ext_des这个变量的值传不进去sql语句里,所以报错。
    而v_sql := 'select unistr(REPLACE('||v_ext_des||',''\u'',''\'')) from dual '; 
    将v_sql语句拆成了3部分,EXECUTE IMMEDIATE就执行不了了。
    难道就没办法么?
      

  9.   

    DECLARE
      V_EXT_DES   VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
      V_SQL       VARCHAR2(100);
      TEXT_BUFFER VARCHAR2(100);
    BEGIN
      V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
               ''',''\u'',''\'')) from dual ';
      EXECUTE IMMEDIATE V_SQL
        INTO TEXT_BUFFER;
      DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
    END;
    /
      

  10.   

    你直接用select unistr(REPLACE(你的字段,''\u'',''\'')) from table
    也不能执行吗
     
      

  11.   

    这个当然可以执行!
    我希望是放到我的PL/SQL块中执行啊
      

  12.   

    执行结果:
    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE
      2    V_EXT_DES   VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
      3    V_SQL       VARCHAR2(100);
      4    TEXT_BUFFER VARCHAR2(100);
      5  BEGIN
      6    V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
      7             ''',''\u'',''\'')) from dual ';
      8    EXECUTE IMMEDIATE V_SQL
      9      INTO TEXT_BUFFER;
     10    DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
     11  END;
     12  /???PL/SQL procedure successfully completed
    怎么显示不了汉字了???而:
    SQL> SELECT unistr(REPLACE('\u4eba\u4fe1\u7528','\u','\')) FROM dual;UNISTR(REPLACE('\U4EBA\U4FE1\U
    ------------------------------
    人信用这样可以看到,奇怪啊[Quote=引用 10 楼 oracledbalgtu 的回复:]
    SQL codeDECLARE
      V_EXT_DES   VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
      V_SQL       VARCHAR2(100);
      TEXT_BUFFER VARCHAR2(100);
    BEGIN
      V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
               ''',''\u'',''\'')) from dual ';
      EXECUTE IMMEDIATE V_SQL
        INTO TEXT_BUFFER;
      DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
    END;
    /
      

  13.   

    老兄,你已经解决我一半的问题了!
    现在就差让“???”显示出汉字了,我们一起努力解决它。[Quote=引用 10 楼 oracledbalgtu 的回复:]
    SQL codeDECLARE
      V_EXT_DES   VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
      V_SQL       VARCHAR2(100);
      TEXT_BUFFER VARCHAR2(100);
    BEGIN
      V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
               ''',''\u'',''\'')) from dual ';
      EXECUTE IMMEDIATE V_SQL
        INTO TEXT_BUFFER;
      DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
    END;
    /
      

  14.   

    没有用过execute immediate into
    不过最笨的方法就是用游标一条条输出
      

  15.   


    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE
      2    V_EXT_DES   VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
      3    V_SQL       VARCHAR2(100);
      4    TEXT_BUFFER VARCHAR2(100);
      5  BEGIN
      6    V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
      7             ''',''\u'',''\'')) from dual ';
      8    EXECUTE IMMEDIATE V_SQL
      9      INTO TEXT_BUFFER;
     10    DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
     11  END;
     12  /
     
    人信用
     
    PL/SQL procedure successfully completed库里面估计存的不是'\u4e2a\u4eba\u4fe1\u7528'这种编码吧...
      

  16.   

    spool c:\a.txt 
    set termout off 
    set echo off 
    set feedback off 
    set heading off 
    set line 1000 
    SELECT unistr(REPLACE('\u4e2a\u4eba\u4fe1\u7528','\u','\')) FROM dual;
    spool off
      

  17.   


    RP..呵呵..我是windows系统的..你估计不是在windows运行的吧...
      

  18.   

    回17楼:文件里也是“????”,而不是汉字回16楼:数据库里存的就是‘\u4e2a\u4eba\u4fe1\u7528'这种Unicode,我能看到。这个数据库建得比较早,估计汉字都是这样存进去的。另,这个数据库建在SUN服务器上,操作系统SunOS5.1,Oracle 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
      

  19.   

    这个估计问题不大,我觉得应该是Oracle的字符集问题。
      

  20.   


    为什么系统设计的时候存入UNICODE码而不是汉字?估计是数据库的字符集中没有这个汉字,会显示为乱码。
    因此,你用正确的方法,在这个环境中是无法呈现汉字的。请构建一个新的字符集为UNICODE的数据库环境,
    然后再执行,就可以了。谢谢!
      

  21.   


    我是建议你建立一个测试的环境, 而不是更改商业系统. 你还可以试验一下国家字符集.执行下面的查询,确认一下是否为UTF之类的.SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHAR%';
      

  22.   


    SQL> SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHAR%';PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_CHARACTERSET               WE8ISO8859P1
      

  23.   


    你现在的需求只是一个显示的问题, 可以从ORACLE客户端的设置着手即可.
      

  24.   

    先采用下述方法设置客户端字符集,然后,再执行下面的命令.Unix:
    # 常用unicode字符集
    export NLS_LANG=american_america.AL32UTF8Windows:
    # 常用中文字符集
    set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBKSQL> SET SERVEROUTPUT ON
    SQL> DECLARE
      2  V_EXT_DES VARCHAR2(30) :='\u4e2a\u4eba\u4fe1\u7528' ;
      3  TEXT_BUFFER VARCHAR2(30);
      4  V_SQL VARCHAR2(60);
      5  BEGIN
      6  v_sql := 'select unistr(REPLACE(:v_ext_des,''\u'',''\'')) from dual ';
      7  EXECUTE IMMEDIATE v_sql into text_buffer USING V_EXT_DES;
      8  DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
      9  END;
     10   /
    个人信用                                                                        PL/SQL 过程已成功完成。SQL> SPOOL OFF