`

oracle实现group_connect

阅读更多
1.10g及以后版本使用wm_concat

2.

wm_concat出现在oracle10g版本中,不仅是加密的,而且是在一个单独的用户中,不方便使   并且10g以前的版本也用不上。

注:因为wm_connect只能存4000字符 超过4000报错 猜测可能返回值是varchar2   因为加密 没有去



F_LINK_LOB 是返回的clob类型


--方法  F_LINK_LOB

CREATE OR REPLACE FUNCTION  F_LINK_LOB (P_STR VARCHAR2)
   RETURN CLOB
AGGREGATE USING T_LINK_LOB;
/
--类型T_LINK_LOB

CREATE OR REPLACE TYPE "T_LINK_LOB"
AS
   OBJECT
   (
      V_LOB CLOB,
      STATIC FUNCTION ODCIAGGREGATEINITIALIZE (SCTX IN OUT NOCOPY T_LINK_LOB)
      RETURN NUMBER,
      MEMBER FUNCTION ODCIAGGREGATEITERATE (SELF IN OUT NOCOPY T_LINK_LOB, VALUE IN VARCHAR2)
         RETURN NUMBER,
      MEMBER FUNCTION ODCIAGGREGATETERMINATE
      (
         SELF          IN            T_LINK_LOB,
         RETURNVALUE      OUT NOCOPY CLOB,
         FLAGS         IN            NUMBER
      )
         RETURN NUMBER,
      MEMBER FUNCTION ODCIAGGREGATEMERGE (SELF IN OUT NOCOPY T_LINK_LOB, CTX2 IN T_LINK_LOB)
         RETURN NUMBER
   );
/
CREATE OR REPLACE TYPE BODY T_LINK_LOB
IS
   STATIC FUNCTION ODCIAGGREGATEINITIALIZE (SCTX IN OUT NOCOPY T_LINK_LOB)
      RETURN NUMBER
   IS
   BEGIN
      SCTX := T_LINK_LOB (NULL);
      DBMS_LOB.CREATETEMPORARY (SCTX.V_LOB, TRUE, DBMS_LOB.SESSION);
      DBMS_LOB.OPEN (SCTX.V_LOB, DBMS_LOB.LOB_READWRITE);
      RETURN ODCICONST.SUCCESS;
   END;

   MEMBER FUNCTION ODCIAGGREGATEITERATE (SELF IN OUT NOCOPY T_LINK_LOB, VALUE IN VARCHAR2)
      RETURN NUMBER
   IS
   BEGIN
      DBMS_LOB.WRITEAPPEND (SELF.V_LOB, LENGTH (VALUE) + 1, VALUE || ',');
      RETURN ODCICONST.SUCCESS;
   END;

   MEMBER FUNCTION ODCIAGGREGATETERMINATE
   (
      SELF          IN            T_LINK_LOB,
      RETURNVALUE      OUT NOCOPY CLOB,
      FLAGS         IN            NUMBER
   )
      RETURN NUMBER
   IS
   BEGIN
      DBMS_LOB.CREATETEMPORARY (RETURNVALUE, TRUE, DBMS_LOB.CALL);
      DBMS_LOB.COPY (RETURNVALUE, SELF.V_LOB, DBMS_LOB.GETLENGTH (SELF.V_LOB) - 1);
      RETURN ODCICONST.SUCCESS;
   END;

   MEMBER FUNCTION ODCIAGGREGATEMERGE (SELF IN OUT NOCOPY T_LINK_LOB, CTX2 IN T_LINK_LOB)
      RETURN NUMBER
   IS
   BEGIN
      NULL;
      RETURN ODCICONST.SUCCESS;
   END;
END;
/

使用:

sql = "select t.*, tt.userName from "
     + TABLE_NAME
     + " t,(select t.groupid, F_LINK_LOB(u.username) as userName from rg_groupanduser t, users u where t.userid = u.id "
     + "group by t.groupid) tt where  t.id = tt.groupid(+) and t.fast = 0  and t.rggrouptype = "
     + type;

3.通过sql实现

select devicesid,ltrim(max(sys_connect_by_path(channelnum,',')),',') row2col
from (select devicesid,channelnum,
devicesid+(row_number() over(order by devicesid)) node_id,
row_number() over(partition by devicesid order by devicesid) rn
from channels ORDER BY devicesid asc, channelnum asc)
start with rn = 1
connect by node_id-1 = prior node_id
group by devicesid
order by devicesid;


如果含有特殊字符替换掉特殊字符

select b.devicesid,my_concat(b.channelnum) from devices a,channels b where a.deviceid = b.devicesid   
group by b.devicesid,b.channelnum    
ORDER BY b.devicesid asc, b.channelnum asc


  select 9001, 1, a.devicesid, a.rights
    from (
    select devicesid,
                 ltrim(max(sys_connect_by_path(channelnum, ',')), ',') rights
            from (select devicesid,
                         channelnum,
                         REPLACE(devicesid,'@','') + (row_number() over(order by devicesid)) node_id,
                         row_number() over(partition by devicesid order by devicesid) rn
                    from channels
                   ORDER BY devicesid asc, channelnum asc)
           start with rn = 1
          connect by node_id - 1 = prior node_id
           group by devicesid
           order by devicesid
           ) a,
         devices b
   where b.coding like '001%'
     and a.devicesid = b.deviceid

分享到:
评论

相关推荐

    解决Oracle没有WM_CONCAT函数.zip

    SELECT REGEXP_REPLACE(SYS_CONNECT_BY_PATH(column, ','), '^,', '') AS aggregated_column FROM (SELECT column, CONNECT_BY_ROOT rowid as rid FROM table) START WITH rid = (SELECT MIN(rowid) FROM table) ...

    oracle列合并的实现方法

    很多场合我们都会用到...sys_connect_by_path(字段名, 2个字段之间的连接符号),这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,’,’)。这个

    Oracle8i_9i数据库基础

    §2.3.2 带 GROUP BY 的计算 75 §2.3.3 用 HAVING 来限制分组的计算 75 §2.4 控制和格式化输出 76 §2.4.1 用 ORDER BY 子句来对结果进行排序 76 §2.4.2 用 BREAK 命令 来对结果进行排列 76 §2.4.3 用 COMPUTE ...

    MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程

    在MySQL中,面对类似Oracle的`connect_by_isleaf`功能的需求,即查找并修改指定ID的所有子级记录,可以通过不同的方法来实现。由于MySQL没有内置的递归查询功能,我们通常需要利用临时表或者自连接来模拟递归。以下...

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

    3. **使用其他数据库功能**:除了LISTAGG,还可以考虑使用XMLAGG、CONNECT_BY_LEVEL等其他Oracle函数,结合转换和处理来达到类似的效果。 4. **查询优化**:在某些情况下,通过改变查询策略,比如使用子查询、连接...

    Oracle中分组后拼接分组字符串.pdf

    最后,我们使用 `sys_connect_by_path()` 函数来拼接分组后的数据,并使用 `start with` 子句和 `connect by` 子句来实现递归操作: ```sql select No, ltrim(max(sys_connect_by_path(Value, ';')), ';') as ...

    ORACLE_FUNCTION.rar_oracle

    如ROWNUM返回行号,LEVEL在递归查询中表示层级,CONNECT_BY_ROOT用于找到层次结构中的根节点。 Oracle的内置函数极大地丰富了SQL语言的功能,使得我们可以更加灵活地处理数据和编写复杂查询。理解并熟练运用这些...

    Oracle多行记录合并

    本篇文章将详细介绍Oracle中实现多行记录合并的几种方法,包括使用SQL函数、集合操作以及自定义函数。 1. **使用SQL函数:** - **`LISTAGG()` 函数:** 这是Oracle 11g及以后版本引入的一个强大的聚合函数,专门...

    oracle10g,9i多行合并一行函数

    - 使用`sys_connect_by_path()`函数将`course`列中的所有值连接起来,默认分隔符为`*`。 - 通过`SUBSTR(sys_connect_by_path(course, '*'), 2)`去除第一个星号。 - 使用`REPLACE()`函数将剩余的星号替换为分号`;`...

    Oracle和SqlServer语法区别

    可以看到,Oracle的SELECT语句支持更多的子句,例如START WITH U CONNECT BY、INTERSECT和MINUS等。这些子句在SqlServer中不支持,但是可以使用其他方式实现相同的结果。 二、函数和过程 Oracle和SqlServer都支持...

    key_functions_in_oracle_sql.rar_in

    7. **连接(Connect By)**: Oracle特有的功能,用于构建层次结构或树形结构的数据。例如,`SELECT level, column1 FROM table START WITH condition CONNECT BY PRIOR column1 = column2`可遍历具有父子关系的记录...

    Oracle中分组后拼接分组字符串[文].pdf

    Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接...本文介绍了如何在 Oracle 中使用 `sys_connect_by_path` 函数与 `start` 递归实现分组后拼接分组字符串。该方法可以应用于各种数据分析和报表生成场景。

    oracle11g静默安装配置文件

    dbserver.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl.example.com)))`,这里`ORCL`是别名,`dbserver.example.com`是服务器地址,`1521`是默认的Oracle服务端口,`orcl...

    ORACLE和SQL Server的语法区别

    为了实现层次结构查询,可以使用递归公共表表达式(Recursive CTEs)。 ```sql SELECT select_list [INTO new_table_] FROM table_source WHERE search_condition GROUP BY [ALL] group_by_expression [WITH...

    最全的oracle常用命令大全.txt

    ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup ...

    oracle-funcation.rar_oracle

    - `CONNECT_BY_ROOT(value)`: 在层次查询中,返回根节点的值。 在"oracle常用功能函数汇总.txt"中,您会找到更详细的描述和示例,涵盖这些函数的多种用法和场景。通过深入学习和实践,您将能够熟练运用这些函数来...

    Oracle10G DataGuard灾备配置

    (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cz2013) ) ) standby = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.168.198.9)(PORT = 1521)) (CONNECT_DATA = (SERVER = ...

Global site tag (gtag.js) - Google Analytics