Oracle 自定义wmsys.wm_concat 避免长度限制
2016-09-06 14:43
211 查看
Oracle 自定义wmsys.wm_concat 避免长度限制 网上搜索到这段类似代码但是长度过程还是不行,经过我的修改,亲测可以。
CREATE OR REPLACE TYPE ZH_CONCAT_IM
AUTHID CURRENT_USER AS OBJECT
(
CURR_STR CLOB,
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT ZH_CONCAT_IM) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT ZH_CONCAT_IM,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN ZH_CONCAT_IM,
RETURNVALUE OUT CLOB,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT ZH_CONCAT_IM,
SCTX2 IN ZH_CONCAT_IM) RETURN NUMBER
)
GO
CREATE OR REPLACE TYPE BODY ZH_CONCAT_IM
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT ZH_CONCAT_IM)
RETURN NUMBER
IS
BEGIN
SCTX := ZH_CONCAT_IM(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT ZH_CONCAT_IM,
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 ZH_CONCAT_IM,
RETURNVALUE OUT CLOB,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT ZH_CONCAT_IM,
SCTX2 IN ZH_CONCAT_IM)
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;
GO
CREATE OR REPLACE FUNCTION ZH_CONCAT(P1 VARCHAR2)
RETURN CLOB AGGREGATE USING ZH_CONCAT_IM ;
或则 嫌写自定义函数太麻烦,用xmlagg就可以了,支持返回clob 和string类型
select rtrim(xmlagg(xmlparse(content l||',' wellformed)) .getclobval() ,',') /* .getstringval()*/ from
(select level as l from dual connect by level<=5000)
CREATE OR REPLACE TYPE ZH_CONCAT_IM
AUTHID CURRENT_USER AS OBJECT
(
CURR_STR CLOB,
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT ZH_CONCAT_IM) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT ZH_CONCAT_IM,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN ZH_CONCAT_IM,
RETURNVALUE OUT CLOB,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT ZH_CONCAT_IM,
SCTX2 IN ZH_CONCAT_IM) RETURN NUMBER
)
GO
CREATE OR REPLACE TYPE BODY ZH_CONCAT_IM
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT ZH_CONCAT_IM)
RETURN NUMBER
IS
BEGIN
SCTX := ZH_CONCAT_IM(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT ZH_CONCAT_IM,
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 ZH_CONCAT_IM,
RETURNVALUE OUT CLOB,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT ZH_CONCAT_IM,
SCTX2 IN ZH_CONCAT_IM)
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;
GO
CREATE OR REPLACE FUNCTION ZH_CONCAT(P1 VARCHAR2)
RETURN CLOB AGGREGATE USING ZH_CONCAT_IM ;
或则 嫌写自定义函数太麻烦,用xmlagg就可以了,支持返回clob 和string类型
select rtrim(xmlagg(xmlparse(content l||',' wellformed)) .getclobval() ,',') /* .getstringval()*/ from
(select level as l from dual connect by level<=5000)
相关文章推荐
- oracle 11g改变控制文件的位置
- Oracle 删除表空间错误 提示:ora-02429:无法删除用于强制唯一/主键的索引
- Oracle 12c创建用户
- oracle中 特殊字符 转义 (&)
- Oracle 12c CDB和PDB的切换
- oracle账号未解锁情况
- oracle面试sql
- Oracle表分区
- Oracle行列转换小结
- Oracle中动态SQL详解
- oracle 触发器的实例
- ORACLE 生成 AWR报告
- Oracle 取某段时间的每一天的日期
- C#调用Oracle带输出数据集的存储过程
- ORACLE 创建/删除非空约束
- C#调用Oracle带输出数据集的存储过程
- oracle TDE
- ORACLE11g关于用户密码过期问题的解决
- 设置Oracle跟随系统一起启动
- oracle 11g rac 下安装em出错的一些解决方法