开发者

Oracle单个字段多记录拼接方式

目录
  • 1.sql提供以下两种查询方式
  • 2.如果报错
    • 2.1作为SYSDBA角色登录
    • 2.2 给普通用户授权
    • 2.3 创建type并创建函数【wm_concat】
    • 2.4 最后一步,创建同义词及授权
    • 验证
  • 总结

    1.sql提供以下两种查询方式

    来拼接同一个字段多个记录结果

    1.replace+wm_concat
    2.listagg within group

    两种方式可实现一样的效果。

    Oracle单个字段多记录拼接方式

    快速脚本:替换 表名 与 字段名 执行即可验证。

    select (
    -- 1.replace+wm_concat
    select replace(wm_concat(a.name),',','|') from teacher_leader a
    ) res1,
    -- 2.listagg within group
    (
    select listagg(a.name,'|') within group (order by a.name) from teacher_leader a
    ) http://www.devze.comres2
    from dual; 
    

    实测:

    Oracle单个字段多记录拼接方式

    2.如果报错

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

    可进行如下处理解决,定义type部分参考博客 https://blog.csdn.net/huryer/article/details/109838948 

    注意: 如果你没有system用户,可能是一个用户拥有多个角色,那么上面的参考博客对你不适用。

    可用下面的方案:

    2.1作为SYSDBA角色登录

    Oracle单个字段多记录拼接方式

    2.2 给普通用户授权

    www.devze.com
    GRANT create type to shop;
    GRANT create procedure to shop;
    

    登录shop(以普通用户normal的身份登录)

    Oracle单个字段多记录拼接方式

    2.3 创建type并创建函数【wm_concat编程客栈

    --在shop用户作为normal角色会话下创建可用的wm_concat函数,直接执行以下语句
    --定义类型
    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
    );
    /
     
    --定义类型body:
    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;
    /
    --自定义行变列函数:
    CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)
    RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
    /
    

    2.4 最后一步,创建同义词及授权

    --创建完成,给其创建同义词及授权,以供其他用户能正常使用。
    create public synonym WM_CONCAT_IMPL for shop.WM_CONCAT_IMPL
    /
    create public synonym wm_concat for shop.wm_concat
    /
    grant execute on WM_CONCAT_IMPL to public
    /
    grant execute on wm_concat to public
    /
    

    验证

    Oracle单个字段多记录拼接方式

    总结

    以上为个人经验,编程客栈希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜