分类(Oracle)
[转]ORACLE跨字符集的数据查询
2009/12/08 11:22

在工作中由于经常要在不同的ORACLE数据库间查询数据,而这些数据库却使用不尽相同的字符集,一般而言有时要链接到多个数据库,如何能做到跨字符集的数据查询不出乱码一直是困扰我的问题。直到最近在网上仔细地搜索了一下,才知道这个问题是可以通过ORACLE的UTL_RAW.CAST_TO_RAW和UTL_RAW.CAST_TO_VARCHAR2包得到较好的解决的。以智能网52数据库经常用的一个表DBASHARE.TB_HWP_MARK_TYPE为例。

  本地数据库:字符集为SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  智能网52数据库:字符集为AMERICAN_AMERICA.US7ASCII

  如果在智能网52数据库中的表有中文的数据的话,从本地数据库用DBLINK的方式查询智能网52数据库的数据就会出现乱码。

  首先在智能网52数据库中建立视图,用UTL_RAW.CAST_TO_RAW包转换中文内容的字段:

  CREATE VIEW V_TB_HWP_MARK_TYPE AS
SELECT SCP_TYPE
,BRAND_TYPE
,UTL_RAW.CAST_TO_RAW(REMARKS) REMARKS
,UTL_RAW.CAST_TO_RAW(REMARKS2) REMARKS2
,TELE_TYPE
,IN_MARK_TYPE
,UTL_RAW.CAST_TO_RAW(FINANCE_REMARK) FINANCE_REMARK
,IN_SZ
,MARK_TYPE
,INSERTDATE
,BRANDORDER
,UTL_RAW.CAST_TO_RAW(REMARKS3) REMARKS3 FROM DBASHARE.TB_HWP_MARK_TYPE;


  然后在本地数据库中建立智能网52数据库的V_T1的视图,用UTL_RAW.CAST_TO_VARCHAR2转换刚才的字段:

  CREATE VIEW TB_HWP_MARK_TYPE AS 
SELECT SCP_TYPE
,BRAND_TYPE
,UTL_RAW.CAST_TO_VARCHAR2(REMARKS) REMARKS
,UTL_RAW.CAST_TO_VARCHAR2(REMARKS2) REMARKS2
,TELE_TYPE
,IN_MARK_TYPE
,UTL_RAW.CAST_TO_VARCHAR2(FINANCE_REMARK) FINANCE_REMARK
,IN_SZ
,MARK_TYPE
,INSERTDATE
,BRANDORDER
,UTL_RAW.CAST_TO_VARCHAR2(REMARKS3) REMARKS3 FROM V_TB_HWP_MARK_TYPE@ZNW;

  这样在本地数据库中执行:

  SELECT * FROM TB_HWP_MARK_TYPE;

  应该就可以看到智能网52数据库的TB_HWP_MARK_TYPE表的中文了。

Tags: Oracle
相关日志:
+引用(0) |
发表评论
昵称  密码  游客无需密码
网址  电邮  注册
验证码 请输入左侧图片中的字符
记住我