解决 wm_concat函数 长度不够问题

 1 --创建类型
 2 CREATE OR REPLACE TYPE "T_LINK_LOB" AS OBJECT
 3 (
 4   V_LOB CLOB,
 5   STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT NOCOPY T_LINK_LOB)
 6     RETURN NUMBER,
 7   MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF  IN OUT NOCOPY T_LINK_LOB,
 8                                        VALUE IN VARCHAR2) RETURN NUMBER,
 9   MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN T_LINK_LOB,
10                                          RETURNVALUE OUT NOCOPY CLOB,
11                                          FLAGS       IN NUMBER)
12     RETURN NUMBER,
13   MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT NOCOPY T_LINK_LOB,
14                                      CTX2 IN T_LINK_LOB) RETURN NUMBER
15 );
16
17 --创建类型内容
18 CREATE OR REPLACE TYPE BODY T_LINK_LOB IS
19   STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT NOCOPY T_LINK_LOB)
20     RETURN NUMBER IS
21   BEGIN
22     SCTX := T_LINK_LOB(NULL);
23     DBMS_LOB.CREATETEMPORARY(SCTX.V_LOB, TRUE, DBMS_LOB.SESSION);
24     DBMS_LOB.OPEN(SCTX.V_LOB, DBMS_LOB.LOB_READWRITE);
25     RETURN ODCICONST.SUCCESS;
26   END;
27
28   MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF  IN OUT NOCOPY T_LINK_LOB,
29                                        VALUE IN VARCHAR2) RETURN NUMBER IS
30   BEGIN
31     DBMS_LOB.WRITEAPPEND(SELF.V_LOB, LENGTH(VALUE) + 1, VALUE || ‘,‘);
32     RETURN ODCICONST.SUCCESS;
33   END;
34
35   MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN T_LINK_LOB,
36                                          RETURNVALUE OUT NOCOPY CLOB,
37                                          FLAGS       IN NUMBER) RETURN NUMBER IS
38   BEGIN
39     DBMS_LOB.CREATETEMPORARY(RETURNVALUE, TRUE, DBMS_LOB.CALL);
40     DBMS_LOB.COPY(RETURNVALUE,
41                   SELF.V_LOB,
42                   DBMS_LOB.GETLENGTH(SELF.V_LOB) - 1);
43     RETURN ODCICONST.SUCCESS;
44   END;
45
46   MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT NOCOPY T_LINK_LOB,
47                                      CTX2 IN T_LINK_LOB) RETURN NUMBER IS
48   BEGIN
49     NULL;
50     RETURN ODCICONST.SUCCESS;
51   END;
52 END;
53
54 --创建函数
55 CREATE OR REPLACE FUNCTION F_LINK_LOB(P_STR VARCHAR2) RETURN CLOB AGGREGATE USING T_LINK_LOB;
56
57 --调用方式
58 select F_LINK_LOB(d.sid) from pmp_p_info d;
时间: 2024-12-29 11:50:16

解决 wm_concat函数 长度不够问题的相关文章

oracle的wm_concat函数实现行转列

有以下数据 deptname phone username isboss 部门A 电话1 员工A 0 部门A 电话1 领导A 1 部门B 电话2 员工B 0 部门B 电话2 员工C 0 部门B 电话2 领导D 1 需要展示效果 deptname phone boss emp 部门A 电话1 领导A 员工A 部门B 电话2 领导D 员工B,员工C 因为是oracle10g的原因,所以使用了wm_concat函数,但对wm_concat结果长度有限制,超出会报ORA-22922:不存在的LOB值,这

重写Oracle的wm_concat函数,自定义分隔符、排序

oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我们不知道oracle中的over函数,也不知道listagg函数. 我们先来看看wm_concat函数能实现什么功能,通俗点==>列传行,如果不明白,请看下面截图(可以看到分隔符默认为','顺序也是杂乱的)          所以,接下来,我们开始重写wm_concat函数(需要注意和需要说明的地方

在12C上创建wm_concat函数

11gr2和12C上已经摒弃了wm_concat函数,当时我们很多程序员在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的应用. 一.解锁wmsys用户 alter user wmsys account unlock; 二.创建包.包体和函数 以wmsys用户登录数据库,执行下面的命令 [sql]

在Oracle12C数据库创建wm_concat函数

当我们的程序需要连接12C数据库时,原本使用wm_concat函数的地方会出现报错,这是由于12C已经摒弃了wm_concat这个函数,可以采取的办法有使用listagg函数代替wm_concat函数,但是程序中所有涉及wm_concat函数的地方都得改成listagg函数的写法,所以为了减小修改程序的工作量,可以通过手工创建wm_concat函数来解决这个问题. 一.用sys用户以SYSDBA身份登录数据库,执行以下命 CREATE OR REPLACE TYPE WM_CONCAT_IMPL

js执行顺序/Promise优雅解决回调函数嵌套

先执行同步 然后把settimeout(function xx(){}放进堆栈 然后执行回调 function xx() /** * Created by Administrator on 2016/10/28. */ // nodejs 封装操作文件的功能 fs var fs = require('fs'); //同步读取 // var str = '' // str += fs.readFileSync('./data/01','utf-8'); // str += fs.readFileS

wm_concat函数

wm_concat函数 wm_concat函数 一般分类 — 作者 zzy020128 @ 12:21 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行,接下来上例子,看看这个神奇的函数如何应用 准备测试数据 SQL> create table test(id number,name varchar2(20)); SQL> insert into test values(1,'a'); SQL> insert

oracle wm_concat函数用法

wmsys.wm_concat函数,它的作用是以','链接字符 例子如下: SQL> create table idtable (id number,name varchar2(30)); Table created SQL> insert into idtable values(10,'ab'); 1 row inserted SQL> insert into idtable values(10,'bc'); 1 row inserted SQL> insert into idt

oracle中WMSYS.WM_CONCAT函数的版本差异

昨天在测试的时候发现,开发人员写的一段程序放在开发库中是好的,但是放在测试库中就会有问题.开发人员一直找不到问题的原因在哪里.于是就花了点时间协助开发人员来找问题的根本原因. 通过一些技术手段,定位到问题是由一个SQL语句引起的. SQL语句如下: WITH PXQ_TASK_TEMP AS (SELECT A.DISTRIBUTE_DATE,          A.APP_NO,          A.TASK_ID,          A.TASK_NO,          A.ACTUAL

Oracle没有WM_CONCAT函数的解决办法

WM_CONCAT是oracle的非公开函数,并不鼓励使用,新版本oracle并没有带此函数,需要手工加上. 1.下载三个文件:owmctab.plb  . owmaggrs.plb . owmaggrb.plb 2.用sqlplus登录:sqlplus -logon sys/123 as sysdba 3.执行@C:\Users\JOYTRAVEL\Desktop\WMSYS用户\owmaggrb.plb; 如果执行结果报错,说找不到WMSYS用户,那么执行 @C:\Users\JOYTRAV