我想从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时,会出现错误! 任何帮助表示赞赏。
答案 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