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

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

收藏
分享
4条回答
默认
最新
章芋文

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
文成

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

暂无图片 评论
暂无图片 有用 0
打赏 0
邓秋爽

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
喵喵喵
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
连接Oracle 19C数据库ORA-28040: No matching authentication protocol 如何解决?
回答 2
是因为你客户端版本太低了。配置sqlnet.ora文件,增加如下设置,8就是兼容oracle8客户端。改完后无需重启监听和实例,但是要更改数据库密码,否则提示用户的密码错误。SQLNET.ALLOWE
有人遇到过这个oracle rac打datapatch卡住的问题吗?
回答 2
就是打datapatchverbose出现卡主,日志里也是卡在这个地方,没有输出了
oracle的包为啥那么大?
回答 1
已采纳
因为Oracle包里包含以下数据:组件和功能的丰富性多平台支持示例数据和示例应用程序文档和帮助文件
oracle提示内存
回答 2
已采纳
oracle@linux8pfile]$sqlplus/assysdbaSQLPlus:Release21.0.0.0.0ProductiononMonNov2214:01:042021Version
业务后台报错:无法从套接字读取更多数据
回答 1
重启tomcat呢?具体出错信息贴一下
Oracle能不能恢复一天的增量数据?
回答 2
你主库备库的同步方式是什么,如果是ADG的话,可以采用备库延迟延迟应用日志就行了,这样主库的日志也能传输到备库,不至于丢失输水。这个延迟的时间根据你们自己业务时间来定。
这个sql怎么进行优化
回答 4
已采纳
截图发现,看不清andTOCHAR(A.FBIZDATE,‘yyyymmdd’)&gt;‘20190701’你这种写法,如果A.FBIZDATE有索引,也不会走,需要改成:A.FBIZDATE&gt;
ORA-01591: 锁被未决分布式事务处理 15.10.4128641 持有 在包里执行从MSSQL表的查询之后,只要有commit就会报这个错。
回答 2
你这个场景没有测试过,但是我感觉你可以参考附件文档里处理oracle悬疑事务,再试试看行不行。
请教大神:两个oracle12c数据库,字符集不同,a库是we8mswin1252字符集,b库是al32utf8字符集,我想在b库中通过dblink往a库某表中插入或更新记录,插入后的记录要在a库中正常显示不乱码?应该如何处理呢?插入或更新的是中文字
回答 2
在插入时,将你的客户端的lang改为we8mswin1252字符集再插入即可。
Oracle、MySQL如何校验数据迁移前后的数据一致性!!!
回答 3
已采纳
1、数据行数对比:在源数据库和目标数据库对表进行数统计,然后对比源数据库和目标数据库中相同表的行数是否一致。如果行数相同,则说明数据迁移过程中没有发生数据丢失或新增。2、数据内容对比:选择一些表中关键