ORA-00904: “WM_CONCAT“: 标识符无效

部署运行你感兴趣的模型镜像

在19c中手动创建wm_concat函数

-- 1
CREATE OR REPLACE TYPE 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
);
 
-- 2
CREATE OR REPLACE TYPE BODY 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;
 
-- 3
CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2) RETURN VARCHAR2
    AGGREGATE USING WM_CONCAT_IMPL;

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

当遇到 ORA-00904: "WM_CONCAT": 标识符无效错误时,意味着数据库无法识别 `WM_CONCAT` 函数,该函数是 Oracle 非官方支持的函数,在某些版本或环境中可能不可用。以下是几种平替方法: ### 使用 LISTAGG 函数 `LISTAGG` 是 Oracle 官方提供的聚合函数,用于将多行数据合并成一个字符串。 ```sql -- 示例查询 SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees FROM emp GROUP BY deptno; ``` 在上述代码中,`LISTAGG` 函数将 `emp` 表中每个部门(`deptno`)下的员工姓名(`ename`)以逗号分隔的形式合并成一个字符串。`WITHIN GROUP (ORDER BY ename)` 用于指定排序方式。 ### 创建自定义函数 可以创建一个自定义函数来模拟 `WM_CONCAT` 的功能。 ```sql -- 创建类型 CREATE OR REPLACE TYPE str_agg_type AS OBJECT ( cur_str VARCHAR2(32767), STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT str_agg_type) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateIterate(self IN OUT str_agg_type, value IN VARCHAR2) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateTerminate(self IN str_agg_type, return_value OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateMerge(self IN OUT str_agg_type, ctx2 IN str_agg_type) RETURN NUMBER ); / -- 实现类型的方法 CREATE OR REPLACE TYPE BODY str_agg_type IS STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT str_agg_type) RETURN NUMBER IS BEGIN sctx := str_agg_type(NULL); RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateIterate(self IN OUT str_agg_type, value IN VARCHAR2) RETURN NUMBER IS BEGIN IF (cur_str IS NOT NULL) THEN cur_str := cur_str || ',' || value; ELSE cur_str := value; END IF; RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateTerminate(self IN str_agg_type, return_value OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER IS BEGIN return_value := cur_str; RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateMerge(self IN OUT str_agg_type, ctx2 IN str_agg_type) RETURN NUMBER IS BEGIN IF (ctx2.cur_str IS NOT NULL) THEN IF (self.cur_str IS NOT NULL) THEN self.cur_str := self.cur_str || ',' || ctx2.cur_str; ELSE self.cur_str := ctx2.cur_str; END IF; END IF; RETURN ODCIConst.Success; END; END; / -- 创建自定义函数 CREATE OR REPLACE FUNCTION str_agg(input VARCHAR2) RETURN VARCHAR2 AGGREGATE USING str_agg_type; / -- 使用自定义函数 SELECT deptno, str_agg(ename) AS employees FROM emp GROUP BY deptno; ``` 上述代码创建了一个自定义类型 `str_agg_type` 及其方法,然后基于该类型创建了自定义函数 `str_agg`,最后使用该函数实现了与 `WM_CONCAT` 类似的功能。 ### 使用 XMLAGG 函数 `XMLAGG` 函数可以将多行数据转换为 XML 格式,然后通过 `EXTRACT` 函数提取所需的字符串。 ```sql -- 示例查询 SELECT deptno, RTRIM(EXTRACT(XMLAGG(XMLELEMENT(E, ename, ',') ORDER BY ename), '/E/text()').getclobval(), ',') AS employees FROM emp GROUP BY deptno; ``` 在上述代码中,`XMLAGG` 函数将每个部门下的员工姓名转换为 XML 元素,`EXTRACT` 函数提取这些元素的文本内容,最后使用 `RTRIM` 函数去除末尾的逗号。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值