ORA-12703:UNION不支持此字符集转换

时间:2019-08-05 06:41:26

标签: sql oracle type-conversion

我想从Oracle 12c中的表创建视图。这是表的定义:

ServiceCollection

视图的选择查询如下:

desc DABIR_ASSIGN;

Name             Null     Type          
---------------- -------- ------------- 
IDASSIGN         NOT NULL NUMBER(20)    
IDLETTER                  NUMBER(20)    
DATE_ASSIGN               VARCHAR2(10)  
TIME_ASSIGN               DATE          
PRIORITY                  VARCHAR2(100) 
STATUS_ASSIGN             VARCHAR2(3)   
KIND_ASSIGN               VARCHAR2(30)  
PARAPH                    VARCHAR2(500) 
PARAPHS                   BLOB          
PARAPH_FLAG               NUMBER(1)     
FROM_CODE                 VARCHAR2(20)  
FROM_POSSITION            VARCHAR2(100) 
FROM_SAZMAN_NAME          VARCHAR2(100) 
FROM_INFO                 VARCHAR2(300) 
TO_CODE                   VARCHAR2(20)  
TO_POSSITION              VARCHAR2(100) 
TO_SAZMAN_NAME            VARCHAR2(100) 
TO_INFO                   VARCHAR2(300) 
SAVE_YESNO                NUMBER(1)     
ASSIGN_YESNO              NUMBER(1)     
ACCEPT_TIME               NUMBER(2)     
READ_IS                   NUMBER(1)     
SAVE_IS                   NUMBER(1)     
ERJA_IS                   NUMBER(1)     
DABIRASSIGN_IS            NUMBER(1)     
FOLDER                    VARCHAR2(400) 
HAFMANCODE                VARCHAR2(200) 
TREE                      VARCHAR2(150) 
TASK_IS                   NUMBER(15)    
RADIF                     NUMBER(3)     
DATELETTER2               VARCHAR2(10)  
IDASSIGN2                 NUMBER(10)    
SENDDATE                  VARCHAR2(10)  
SENDTIME                  VARCHAR2(5)   
READ_DATETIME             VARCHAR2(16)  
MEDIA_YESNO               NUMBER(2)     
ECE_IS                    NUMBER(1)     
REMINDER_DATE             VARCHAR2(10)  
REMINDER_OK               NUMBER(1) 

我收到以下错误:

select T.IDASSIGN as "RowID",
       T.IDLETTER as "DocID",
       P.IDASSIGN as "ParentID",
       CASE WHEN T.FROM_CODE = '1' THEN '-1' WHEN odr."RoleID" is null THEN '0' ELSE odr."RoleID" END as "FromRoleID",
       T.FROM_CODE as "FromUserID",
       0 as "IsAssist",
       CASE WHEN T.TO_CODE = '1' THEN '-1' WHEN ODR2."RoleID" is null THEN '0' ELSE ODR2."RoleID" END as "ToRoleID",
       T.TO_CODE as "ToUserID",
       T.SENDDATE as "ReferDate",
       null as "TimeoutDate",
       0 as "HasTrack",
       CONVERT(utl_raw.cast_to_varchar2(dbms_lob.substr(T.paraphs,2000,1)) || utl_raw.cast_to_varchar2(dbms_lob.substr(T.paraphs,2000,2001)),
'ar8mswin1256','al32utf8')   as "NoteDesc"

FROM DABIR_ASSIGN T inner join DABIR_ASSIGN P ON (T.FROM_CODE=P.TO_CODE AND T.IDLETTER=P.IDLETTER AND T.FROM_CODE <> T.TO_CODE and P.TO_CODE <> P.FROM_CODE)
LEFT JOIN (select ltrim(min("RoleID"),0) as "RoleID",ltrim(min("UserID"),0) as "UserID" from PEYVAND_OA_DEPT_ROLE group by "UserID") ODR ON (ODR."UserID"=ltrim(T.FROM_CODE,0))
LEFT JOIN (select ltrim(min("RoleID"),0) as "RoleID",ltrim(min("UserID"),0) as "UserID" from PEYVAND_OA_DEPT_ROLE group by "UserID") ODR2 ON (ODR2."UserID"=ltrim(T.TO_CODE,0))

UNION

select T.IDASSIGN as "RowID",
       T.IDLETTER as "DocID",
       T.IDASSIGN + 1000000 as "ParentID",
       '-1' as "FromRoleID",
       '-1' as "FromUserID",
       0 as "IsAssist",
       CASE WHEN ODR."RoleID" is null THEN '0' ELSE ODR."RoleID" END as "ToRoleID",
       T.TO_CODE as "ToUserID",
       T.SENDDATE as "ReferDate",
       null as "TimeoutDate",
       0 as "HasTrack",
       ''  as "NoteDesc"
FROM DABIR_ASSIGN T LEFT JOIN (select ltrim(min("RoleID"),0) as "RoleID",ltrim(min("UserID"),0) as "UserID" from PEYVAND_OA_DEPT_ROLE group by "UserID") ODR ON (ODR."UserID"=ltrim(T.TO_CODE,0))

WHERE T.FROM_CODE=1;

很明显,该错误是由于CONVERT命令引起的。如果删除“ Notedesc”,一切正常。我需要这种转换,因为我需要波斯语语言的“ PARAPHS”列的内容。我还在两个SELECT部分​​中都使用了CAST函数,但没有任何变化:

ORA-12703: this character set conversion is not supported
12703. 00000 -  "this character set conversion is not supported"
*Cause:    The requested conversion between two character sets in the CONVERT
           function is not implemented
*Action:

如果仅运行第一个SELECT或第二个SELECT,则没有错误。但是,当我使用UNION运行SELECTS时,会出现错误! 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

更改您的第二个查询以使用

  CONVERT(utl_raw.cast_to_varchar2(''),'ar8mswin1256','al32utf8') as "NoteDesc"

答案 1 :(得分:0)

我终于通过创建一个临时表解决了我的问题,并对临时表的输出进行了转换:

Select other columns,
       CONVERT(Temp."NoteDesc",'ar8mswin1256','al32utf8')

FROM
(
select T.IDASSIGN as "RowID",
       T.IDLETTER as "DocID",
       P.IDASSIGN as "ParentID",
       CASE WHEN T.FROM_CODE = '1' THEN '-1' WHEN odr."RoleID" is null THEN '0' ELSE odr."RoleID" END as "FromRoleID",
       T.FROM_CODE as "FromUserID",
       0 as "IsAssist",
       CASE WHEN T.TO_CODE = '1' THEN '-1' WHEN ODR2."RoleID" is null THEN '0' ELSE ODR2."RoleID" END as "ToRoleID",
       T.TO_CODE as "ToUserID",
       T.SENDDATE as "ReferDate",
       null as "TimeoutDate",
       0 as "HasTrack",
       utl_raw.cast_to_varchar2(dbms_lob.substr(T.paraphs,2000,1)) || utl_raw.cast_to_varchar2(dbms_lob.substr(T.paraphs,2000,2001)) as "NoteDesc"

FROM DABIR_ASSIGN T inner join DABIR_ASSIGN P ON (T.FROM_CODE=P.TO_CODE AND T.IDLETTER=P.IDLETTER AND T.FROM_CODE <> T.TO_CODE and P.TO_CODE <> P.FROM_CODE)
LEFT JOIN (select ltrim(min("RoleID"),0) as "RoleID",ltrim(min("UserID"),0) as "UserID" from PEYVAND_OA_DEPT_ROLE group by "UserID") ODR ON (ODR."UserID"=ltrim(T.FROM_CODE,0))
LEFT JOIN (select ltrim(min("RoleID"),0) as "RoleID",ltrim(min("UserID"),0) as "UserID" from PEYVAND_OA_DEPT_ROLE group by "UserID") ODR2 ON (ODR2."UserID"=ltrim(T.TO_CODE,0))

UNION

select T.IDASSIGN as "RowID",
       T.IDLETTER as "DocID",
       T.IDASSIGN + 1000000 as "ParentID",
       '-1' as "FromRoleID",
       '-1' as "FromUserID",
       0 as "IsAssist",
       CASE WHEN ODR."RoleID" is null THEN '0' ELSE ODR."RoleID" END as "ToRoleID",
       T.TO_CODE as "ToUserID",
       T.SENDDATE as "ReferDate",
       null as "TimeoutDate",
       0 as "HasTrack",
       ''  as "NoteDesc"
FROM DABIR_ASSIGN T LEFT JOIN (select ltrim(min("RoleID"),0) as "RoleID",ltrim(min("UserID"),0) as "UserID" from PEYVAND_OA_DEPT_ROLE group by "UserID") ODR ON (ODR."UserID"=ltrim(T.TO_CODE,0))

WHERE T.FROM_CODE=1  ) Temp