暂无图片
分享
喵喵喵
2019-06-27
Oracle12G版本不支持wmsys.wm_concat()问题处理

Oracle12G版本不支持wmsys.wm_concat()问题处理,报错连接标识符有误

收藏
分享
4条回答
默认
最新
章芋文
2019-06-27

wm_concat函数不在支持,12C已经隐藏了,只供内部使用,Oracle 11g开始使用listagg替代了wm_concat。所以:

1、建议改写成listagg(强烈建议)

2、手工创建wm_concat函数

CREATE OR REPLACE TYPE WMSYS.WM_CONCAT_IMPL AS OBJECT 
( 
CURR_STR VARCHAR2(32767),  
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER, 
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL, 
P1 IN VARCHAR2) RETURN NUMBER, 
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL, 
RETURNVALUE OUT VARCHAR2, 
FLAGS IN NUMBER) 
RETURN NUMBER, 
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL, 
SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER 
); 
/ 
CREATE OR REPLACE TYPE BODY WMSYS.WM_CONCAT_IMPL 
IS 
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) 
RETURN NUMBER 
IS 
BEGIN 
SCTX := WM_CONCAT_IMPL(NULL) ; 
RETURN ODCICONST.SUCCESS; 
END; 
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,P1 IN VARCHAR2) 
RETURN NUMBER 
IS 
BEGIN 
IF(CURR_STR IS NOT NULL) THEN 
CURR_STR := CURR_STR || ',' || P1; 
ELSE 
CURR_STR := P1; 
END IF; 
RETURN ODCICONST.SUCCESS; 
END; 
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,RETURNVALUE OUT VARCHAR2,FLAGS IN NUMBER) 
RETURN NUMBER 
IS 
BEGIN 
RETURNVALUE := CURR_STR ; 
RETURN ODCICONST.SUCCESS; 
END; 
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,SCTX2 IN WM_CONCAT_IMPL) 
RETURN NUMBER 
IS 
BEGIN 
IF(SCTX2.CURR_STR IS NOT NULL) THEN 
SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ; 
END IF; 
RETURN ODCICONST.SUCCESS; 
END; 
END; 
/ 
CREATE OR REPLACE FUNCTION WMSYS.WM_CONCAT(P1 VARCHAR2) 
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ; 
/ 
create public synonym WM_CONCAT_IMPL for WMSYS.WM_CONCAT_IMPL 
/ 
create public synonym WM_CONCAT for WMSYS.WM_CONCAT 
/ 
grant execute on WM_CONCAT_IMPL to public 
/ 
grant execute on WM_CONCAT to public 
/
暂无图片 评论
暂无图片 有用 0
打赏 0
文成
2019-06-27

wm_concat效率较查,建议改写成 listagg,同时需要注意字符串拼接不要超过4000

暂无图片 评论
暂无图片 有用 0
打赏 0
邓秋爽
2019-06-27

wm_concat会自动将其转化为clob类型,可能带来temp使用上的争用,尽量使用listagg

SQL> select wm_concat(object_name) from dba_objects where rownum<10;

WM_CONCAT(OBJECT_NAME)

--------------------------------------------------------------------------------

ICOL$,I_USER1,CON$,UNDO$,C_COBJ#,I_OBJ#,PROXY_ROLE_DATA$,I_I

ND1,I_CDEF2

SQL> create table t_vm as select wm_concat(object_name) col1 from dba_objects where rownum<10;

Table created.

SQL> desc t_vm;

 Name                                                                                                                                                  Null?    Type

 ----------------------------------------------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------------------------------

 COL1                                                                                                                                                           CLOB


暂无图片 评论
暂无图片 有用 1
打赏 0
喵喵喵
2023-04-19
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏