Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

62

积分

0

好友

3

主题
1#
发表于 2012-5-15 16:45:40 | 查看: 6517| 回复: 3
一个测试库,一个生产库。version都是11.1.0.7.0
测试库的NLS_NCHAR_CHARACTERSET 与生产库的不一样。测试是UTF8      生产是:AL16UTF16

下面的sql:
SELECT REPLACE(WMSYS.WM_CONCAT(CC.DESCRIPTION), ',', ',') DESCRIPTION,
       REPLACE(WMSYS.WM_CONCAT(CC.ENGLISH_DESC), ',', ',') ENG_DES
  FROM (SELECT AA.DESCRIPTION, AA.ENGLISH_DESC
          FROM COVERAGE_MASTER AA
          JOIN (SELECT COLUMN_VALUE FROM TABLE(SYSPLITDELIMITER('GP', ','))) BB ON TRIM(AA.COVERAGE_CODE) =
                                                                                   BB.COLUMN_VALUE) CC
在测试库查询正常,在生产查询是乱码。生产的数据是通过在测试通过后,再添加到生产线的。
COVERAGE_MASTER表的信息

COVERAGE_CODE                                                                                             NOT NULL CHAR(15)
DESCRIPTION                                                                                               NOT NULL NVARCHAR2(100
ACTIVE_FLAG                                                                                               NOT NULL CHAR(1)
USER_CODE                                                                                                 NOT NULL VARCHAR2(30)
LASTEDIT_DATE                                                                                             NOT NULL DATE
SKIP_TO_40                                                                                                NOT NULL VARCHAR2(1)
COVCATG                                                                                                   NOT NULL VARCHAR2(2)
USAGE                                                                                                     NOT NULL NUMBER(7)
REFERRAL_VALIDITY                                                                                                  NUMBER(3)
ENGLISH_DESC                                                                                                       VARCHAR2(100)
EDCMAX_VALUE                                                                                                       NUMBER(15,2)
PREAUTH_ALERT_VALUE                                                                                                NUMBER(15,2)
AMT_INCURRED_ALERT_VALUE                                                                                           NUMBER(15,2)
VISITATION_ALERT_VALUE                                                                                             NUMBER(8)
INSERT_BY                                                                                                          VARCHAR2(30)
INSERT_DATE                                                                                                        DATE

但是在生产上执行
SELECT COLUMN_VALUE FROM TABLE(SYSPLITDELIMITER('GP', ','))) BB ON TRIM(AA.COVERAGE_CODE) =
                                                                                   BB.COLUMN_VALUE
是没有乱码的。为什么通过 REPLACE(WMSYS.WM_CONCAT等函数转换后就出现乱码了?跟国家字符集有关系吗?
如果有关系,我如何修改测试库的国家字符集,并且库里的数据不受影响。
学海无涯,技术至上!
2#
发表于 2012-5-15 21:26:57
WMSYS.WM_CONCAT 函数 是不受oracle support的function 。

已知有案例 当使用wm_concat 处理nvarchar2 是可能返回 问题字符集 ,

http://stackoverflow.com/questio ... with-odd-characters


建议你 重建 相关表,不要使用 nvarchar类型,如:


SQL> desc t;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
V                                                  NVARCHAR2(3)



SQL> alter table t modify v varchar2(10);
alter table t modify v varchar2(10)
                     *
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype


SQL> create table new_t ( v varchar2(10));

Table created.

SQL> insert into new_t select *  from t;

1 row created.

SQL> commit;

Commit complete.


SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

回复 只看该作者 道具 举报

3#
发表于 2012-5-15 21:30:46
PROBLEM:
1. Clear description of the problem encountered:

After upgrading from 10.2.0.4 to 10.2.0.5, the datatype returned from
WM_CONCAT has changed from varchar2 to CLOB.  

In 10.2.0.4 it returns VARCHAR2

SQL> desc wmsys.wm_concat;
FUNCTION wmsys.wm_concat RETURNS VARCHAR2  <<<<<<<<<<<
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
P1                             VARCHAR2                IN


In 10.2.0.5 it returns CLOB

SQL> desc wmsys.wm_concat;
FUNCTION wmsys.wm_concat RETURNS CLOB <<<<<<<<<<<<<<<<<
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
P1                             VARCHAR2                IN

In 11.1.0.7 and 11.2.0.1, it is returning VARCHAR2 again

SQL> desc wmsys.wm_concat
FUNCTION wmsys.wm_concat RETURNS VARCHAR2  <<<<<<<<<<<<<<<
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
P1                             VARCHAR2                IN

SQL> select * from v$version;

BANNER
------------------------------------------------------------------------------
--
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE    11.1.0.7.0      Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

SQL>

回复 只看该作者 道具 举报

4#
发表于 2012-5-16 10:07:01
非常感谢刘大在百忙中回贴。问题我已清楚。看你给我的url,vmsys.vm_concat中加cast函数转换也可以。
SELECT REPLACE(WMSYS.WM_CONCAT(cast(CC.DESCRIPTION as varchar2(200))), ',', ',') DESCRIPTION,
       REPLACE(WMSYS.WM_CONCAT(CC.ENGLISH_DESC), ',', ',') ENG_DES
  FROM (SELECT AA.DESCRIPTION, AA.ENGLISH_DESC
          FROM COVERAGE_MASTER AA
          JOIN (SELECT COLUMN_VALUE FROM TABLE(SYSPLITDELIMITER('GP', ','))) BB ON TRIM(AA.COVERAGE_CODE) =  BB.COLUMN_VALUE) CC

既然 In 10.2.0.4 / 11.1.0.7 / 11.2.0.1 it returns VARCHAR2,为什么使用vmsys.vm_concat还需要cast来转换成VARCHAR2呢?不知我理解是否有错。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-15 15:55 , Processed in 0.054738 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569