现有Oracle数据库中的一张表,表中某字段的值为几个Unicode,如:\u4e2a\u4eba\u4fe1\u7528
其实就是4个汉字,我希望将他们转换为汉字后输出到文本文件中。如何用PL/SQL实现Unicode到汉字的转换呢?Oracle有没有相关的函数或API?
刚接触PL/SQL,请大家帮忙!100分奉上!
其实就是4个汉字,我希望将他们转换为汉字后输出到文本文件中。如何用PL/SQL实现Unicode到汉字的转换呢?Oracle有没有相关的函数或API?
刚接触PL/SQL,请大家帮忙!100分奉上!
你可以把代码存入库中,读出后用别的有这个功能的语言转换一下。
别的语言已经实现了,我现在就是要把别的语言转化为PL/SQL,哈!
SELECT unistr(REPLACE('\u4eba\u4fe1\u7528','\u','\')) FROM dual;
--人信用
语句:
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拿不到值,是什么原因呢?
EXECUTE IMMEDIATE v_sql into text_buffer;
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;
语句:
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就执行不了了。
难道就没办法么?
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;
/
也不能执行吗
我希望是放到我的PL/SQL块中执行啊
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;
/
现在就差让“???”显示出汉字了,我们一起努力解决它。[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;
/
不过最笨的方法就是用游标一条条输出
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'这种编码吧...
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
RP..呵呵..我是windows系统的..你估计不是在windows运行的吧...
为什么系统设计的时候存入UNICODE码而不是汉字?估计是数据库的字符集中没有这个汉字,会显示为乱码。
因此,你用正确的方法,在这个环境中是无法呈现汉字的。请构建一个新的字符集为UNICODE的数据库环境,
然后再执行,就可以了。谢谢!
我是建议你建立一个测试的环境, 而不是更改商业系统. 你还可以试验一下国家字符集.执行下面的查询,确认一下是否为UTF之类的.SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHAR%';
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHAR%';PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8ISO8859P1
你现在的需求只是一个显示的问题, 可以从ORACLE客户端的设置着手即可.
# 常用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