Oracle2PolarDB:Polardb-O兼容性之wm_concat

适用于

  • 本文适用平台为公有云、专有云和一体机。
  • PolarDB高度兼容Oracle版本,PolarDB的Release版本为20200228。

目的

PolarDB如何兼容Oracle的wm_concat函数。

解决办法

执行SQL出现如下报错信息,通过报错可以看出PolarDB中缺失wmsys.wm_concat函数。

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL
[SELECT min(a.task_name) task_name,a.op_time,min(decode(a.opinions,'','--',a.opinions)) opinions,wmsys.wm_concat(decode(b.sourcename||b.extname, '', '',b.sourcename||b.extname)) sourcename,min(b.downtime) downtime,min(b.extname) extname,min(a.optr_id||'('||c.personname||')') optr_id,min(a.next_deal||'('||d.personname||')') next_deal FROM tb_manualfee_task a LEFT JOIN tb_busiaudit_files b ON a.task_no=b.taskid  LEFT JOIN tb_sys_person d ON a.next_deal=d.personid LEFT JOIN tb_sys_person c ON a.optr_id=c.personid WHERE a.case_no = ? GROUP BY op_time ORDER BY a.op_time ]; 
SQL state [3F000]; error code [0]; ERROR: schema "wmsys" does not exist
  Position: 97; nested exception is com.aliyun.polardb.util.PSQLException: 
  ERROR: schema "wmsys" does not exist
  Position: 97

wm_concat函数说明

WM_CONCAT函数经常使用在行转列上,只能支持逗号分隔符。在12C版本之前,代码里这个函数用的会比较多,12C之后已经被禁用,由LISTAGG函数代替。

如何兼容wm_concat函数

在PolarDB中可以使用string_agg代替wm_concat,但必须指定分隔符。

\df STRING_AGG
                            List of functions
 Schema |   Name  | Result data type | Argument data types | Type
------------+------------+------------------+---------------------+------
pg_catalog | string_agg | bytea         | bytea, bytea      | agg
pg_catalog | string_agg | text         | text, text       | agg

用string_agg替换wm_concat,将以下部分进行调整:

wmsys.wm_concat(decode(b.sourcename||b.extname, '', '',b.sourcename||b.extname))

调整后如下所示:

string_agg(decode(b.sourcename||b.extname, '', '',b.sourcename||b.extname),',')