Oracle 19c 错误 'ORA-00904: 'WM_CONCAT': 标识符无效' 解决方法
在 Oracle 12c 及更高版本中,'WM_CONCAT' 函数已被弃用。因此,如果您使用 Oracle 19c,则可能会遇到 'ORA-00904' 错误,因为它不再识别 'WM_CONCAT' 函数。
解决此问题的一个可能的解决方案是使用 'LISTAGG' 函数来代替 'WM_CONCAT' 函数。'LISTAGG' 函数可用于将行组合成单个字符串。以下是使用 'LISTAGG' 函数来替换 'WM_CONCAT' 函数的示例查询:
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
请注意,'LISTAGG' 函数的语法略有不同。它使用 'WITHIN GROUP' 子句来指定如何排序结果,并使用 'ORDER BY' 子句指定排序顺序。另外,它还需要一个 'GROUP BY' 子句来指定要组合的行。
如果您仍然需要使用 'WM_CONCAT' 函数,则可以使用自定义聚合函数的方法来实现。以下是一个示例自定义聚合函数的代码:
CREATE OR REPLACE TYPE string_agg_type AS OBJECT
(
total_string VARCHAR2(4000),
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_type) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_type, value IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_type, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_type, ctx2 IN string_agg_type) RETURN NUMBER
);
CREATE OR REPLACE TYPE BODY string_agg_type
IS
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_type) RETURN NUMBER
IS
BEGIN
sctx := string_agg_type(NULL);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_type, value IN VARCHAR2) RETURN NUMBER
IS
BEGIN
IF (self.total_string IS NULL) THEN
self.total_string := value;
ELSE
self.total_string := self.total_string || ',' || value;
END IF;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_type, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER
IS
BEGIN
returnValue := self.total_string;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_type, ctx2 IN string_agg_type) RETURN NUMBER
IS
BEGIN
IF (self.total_string IS NULL) THEN
self.total_string := ctx2.total_string;
ELSE
self.total_string := self.total_string || ',' || ctx2.total_string;
END IF;
RETURN ODCIConst.Success;
END;
END;
CREATE OR REPLACE FUNCTION string_agg(input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING string_agg_type;
现在,您可以使用 'string_agg' 函数来聚合字符串。以下是使用 'WM_CONCAT' 函数的示例查询:
SELECT deptno, string_agg(ename) AS employees
FROM emp
GROUP BY deptno;
请注意,您需要在使用自定义聚合函数之前创建自定义聚合类型。此外,自定义聚合函数的语法可能比 'WM_CONCAT' 更复杂。
原文地址: https://www.cveoy.top/t/topic/nAEc 著作权归作者所有。请勿转载和采集!