ORACLE 函数处理的数据返回值过长 character string buffer too small
2013-08-26 17:27
441 查看
--问题
-- ORA-06502: PL/SQL: 数字或值错误 : character string buffer too small
--ORA-06512: 在 "WMSYS.WM_CONCAT_IMPL", line 30
--错误 WMSYS.WM_CONCAT()
SELECT HEAD.BOOKING_HEAD_ID,
(SELECT REPLACE
(
WMSYS.WM_CONCAT( CONTAINER.CONTAINER_NO --这里改用 F_LINK_LOB(.) 处理
|| '/'
|| SEAL_NO_1
|| '/'
|| CONTAINER_TYPE
|| '/'
|| DECODE (CONTAINER_STATUS_I, 4, 'E', 7, 'L', 'F')),
',',
CHR (10)
)
FROM DOC_BK_CONTAINER CONTAINER
WHERE HEAD.BOOKING_HEAD_ID = CONTAINER.BOOKING_HEAD_ID)
AS CONTAINERS_BOX_INFO
FROM DOC_BOOKING_HEAD HEAD
WHERE HEAD.BOOKING_HEAD_ID = '2c2881d62e50c1c1012e5573b63e54c2'
ORDER BY HEAD.BL_NO;
--方法 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;
-- ORA-06502: PL/SQL: 数字或值错误 : character string buffer too small
--ORA-06512: 在 "WMSYS.WM_CONCAT_IMPL", line 30
--错误 WMSYS.WM_CONCAT()
SELECT HEAD.BOOKING_HEAD_ID,
(SELECT REPLACE
(
WMSYS.WM_CONCAT( CONTAINER.CONTAINER_NO --这里改用 F_LINK_LOB(.) 处理
|| '/'
|| SEAL_NO_1
|| '/'
|| CONTAINER_TYPE
|| '/'
|| DECODE (CONTAINER_STATUS_I, 4, 'E', 7, 'L', 'F')),
',',
CHR (10)
)
FROM DOC_BK_CONTAINER CONTAINER
WHERE HEAD.BOOKING_HEAD_ID = CONTAINER.BOOKING_HEAD_ID)
AS CONTAINERS_BOX_INFO
FROM DOC_BOOKING_HEAD HEAD
WHERE HEAD.BOOKING_HEAD_ID = '2c2881d62e50c1c1012e5573b63e54c2'
ORDER BY HEAD.BL_NO;
--方法 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;
相关文章推荐
- ORACLE 函数处理的数据返回值过长 character string buffer too small , WMSYS.WM_CONCAT
- ORACLE 函数处理的数据返回值过长 character string buffer too small
- ORA-06502: PL/SQL: numeric or value error: character string buffer too small
- PHP调用Oracle存储过程时的错误:ORA-06502: PL/SQL: numeric or value error: character string buffer too small
- ORA-06502: PL/SQL: numeric or value error: character string buffer too small
- SqlServer:根据指定分隔符,把传入字符串分隔处理后,返回数据表,函数功能类似.NET的string.Split()
- ORA-06502:PL/SQL :numberic or value error: character string buffer too small
- ORA-06502: PL/SQL: numeric or value error: character string buffer too small
- ORA-06502:PL/SQL :numberic or value error: character string buffer too small
- oracle 函数 输入值,查询数据,返回相应处理结果
- ORACLE 使用函数返回表数据
- php处理时间过长时返回空数据
- CFileDialog打开多个文件失败 返回错误 FNERR_BUFFERTOOSMALL
- 如何从文本文件读取数据到二维数组,如何在函数处理后返回二维数组的示例
- Oracle 利用管道函数(pipelined)实现高性能大数据处理
- PHP - Manual手册 - CLXI. String 字符串处理函数 - substr返回字符串中的一部分
- JS中eval()函数处理返回的json数据
- TypeError: buffer is too small for requested array python 问题处理
- Oracle Error : ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 3000, maximum: 4000)
- CFileDialog打开多个文件失败 返回错误 FNERR_BUFFERTOOSMALL