- 浏览: 77046 次
- 性别:
- 来自: 杭州
文章分类
最新评论
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
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
发表评论
-
创建DBlinksql
2013-08-16 10:48 702create database link jjlink con ... -
导入备份dmp文件
2013-04-09 13:40 805impdp xx/xxDIRECTORY=SRS_111 D ... -
job相关
2013-04-01 18:17 638创建job DECLARE JOBID NUMBER; B ... -
oracle中导出excel
2013-03-29 17:09 840create or replace directory MY_ ... -
数据库设计中的命名规范(转)
2013-03-22 22:58 711数据库设计中的命名规 ... -
ora-00600
2013-01-26 15:37 824select t.FILE# from V$datafile ... -
某一段时间,在小于五秒钟内出现2次以上
2013-01-15 18:42 601查询 某一段时间,a在小于五秒钟内出现2次以上 with ... -
SQL优化策略
2013-01-08 18:35 6861、 尽量少用IN操作符, ... -
分区索引导致数据库分页错乱
2012-12-18 15:21 793select t2.* from (select t1.*, ... -
oracle索引建立
2012-12-18 15:10 735alter system修改的是参数文件,所有用户都会生效 a ... -
数据库常用不使用索引情况
2012-12-03 15:24 8831.使用<>,!=,^= 不使用索引可以使用 in ... -
oracle查看某个表索引状态sql
2012-11-30 14:31 1279select index_name,status from d ... -
ORA-00257错误解决
2012-11-23 18:53 1022通过sqlplus命令连接数据库 show parameter ... -
海量数据查询快速估计总数方法
2012-11-15 11:19 957估算大概值可以分析执行计划信息 sql: EXPLAIN PL ... -
mysql和oracle批处理运行sql文件和oracle导入dmp文件
2012-11-07 18:26 1269mysql批处理运行sql: net stop mysql n ... -
高效循环插入大数据量测试
2012-11-07 18:15 689declare idx number(22): ... -
JDBC读取新插入Oracle数据库Sequence值的5种方法
2012-08-27 23:33 0Oracle的sequence实现非常灵活,所以也带来一些易用 ... -
DBCP object created by following code was nerver closeed
2012-08-27 23:31 0DBCP object created by followi ... -
修改SGA无法启动
2012-08-27 23:30 700解决步骤 假如没有备份init.ora 1.dos 输入 ... -
Oracle数据库查询高效分页
2012-08-27 23:27 7501.select * 2. from (select * ...
相关推荐
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) ...
很多场合我们都会用到...sys_connect_by_path(字段名, 2个字段之间的连接符号),这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,’,’)。这个
§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中,面对类似Oracle的`connect_by_isleaf`功能的需求,即查找并修改指定ID的所有子级记录,可以通过不同的方法来实现。由于MySQL没有内置的递归查询功能,我们通常需要利用临时表或者自连接来模拟递归。以下...
3. **使用其他数据库功能**:除了LISTAGG,还可以考虑使用XMLAGG、CONNECT_BY_LEVEL等其他Oracle函数,结合转换和处理来达到类似的效果。 4. **查询优化**:在某些情况下,通过改变查询策略,比如使用子查询、连接...
最后,我们使用 `sys_connect_by_path()` 函数来拼接分组后的数据,并使用 `start with` 子句和 `connect by` 子句来实现递归操作: ```sql select No, ltrim(max(sys_connect_by_path(Value, ';')), ';') as ...
如ROWNUM返回行号,LEVEL在递归查询中表示层级,CONNECT_BY_ROOT用于找到层次结构中的根节点。 Oracle的内置函数极大地丰富了SQL语言的功能,使得我们可以更加灵活地处理数据和编写复杂查询。理解并熟练运用这些...
本篇文章将详细介绍Oracle中实现多行记录合并的几种方法,包括使用SQL函数、集合操作以及自定义函数。 1. **使用SQL函数:** - **`LISTAGG()` 函数:** 这是Oracle 11g及以后版本引入的一个强大的聚合函数,专门...
- 使用`sys_connect_by_path()`函数将`course`列中的所有值连接起来,默认分隔符为`*`。 - 通过`SUBSTR(sys_connect_by_path(course, '*'), 2)`去除第一个星号。 - 使用`REPLACE()`函数将剩余的星号替换为分号`;`...
可以看到,Oracle的SELECT语句支持更多的子句,例如START WITH U CONNECT BY、INTERSECT和MINUS等。这些子句在SqlServer中不支持,但是可以使用其他方式实现相同的结果。 二、函数和过程 Oracle和SqlServer都支持...
7. **连接(Connect By)**: Oracle特有的功能,用于构建层次结构或树形结构的数据。例如,`SELECT level, column1 FROM table START WITH condition CONNECT BY PRIOR column1 = column2`可遍历具有父子关系的记录...
Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接...本文介绍了如何在 Oracle 中使用 `sys_connect_by_path` 函数与 `start` 递归实现分组后拼接分组字符串。该方法可以应用于各种数据分析和报表生成场景。
dbserver.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl.example.com)))`,这里`ORCL`是别名,`dbserver.example.com`是服务器地址,`1521`是默认的Oracle服务端口,`orcl...
SELECT SYS_CONNECT_BY_PATH(column, '/') AS path FROM table_name START WITH parent_id IS NULL CONNECT BY PRIOR id = parent_id; ``` 这将生成一个表示层级关系的路径字符串。 5. **PL/SQL 表达式**: ...
为了实现层次结构查询,可以使用递归公共表表达式(Recursive CTEs)。 ```sql SELECT select_list [INTO new_table_] FROM table_source WHERE search_condition GROUP BY [ALL] group_by_expression [WITH...
ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup ...
- `CONNECT_BY_ROOT(value)`: 在层次查询中,返回根节点的值。 在"oracle常用功能函数汇总.txt"中,您会找到更详细的描述和示例,涵盖这些函数的多种用法和场景。通过深入学习和实践,您将能够熟练运用这些函数来...