在 Oracle 中通过 SQL 从 DB table 完成 CLOB
Getting CLOB completed from DB table via SQL in Oracle
我有一个 table(实际上是一个视图),只有几个 varchar2 字段。说,
v_report(id, 姓名, profile_id, profile_name);
我需要将 id 分组的数据收集到一个字符串中。所以,我这样做:
SELECT
id,
'Name: ' || clobagg(DISTINCT name)
|| ' Profile_name: ' || clobagg(DISTINCT profile_name)
as description
FROM
v_report
GROUP BY
id
clobagg 就像这里描述的那样: https://community.oracle.com/thread/2264483
(尤其是使用 clobagg 而不是 stragg,因为它的返回值 clob 能够存储 >4000 个字符)
当连接的配置文件字符串不太大时,它工作正常。但如果是,我会得到公平的 Oracle 异常:
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 7680, maximum: 4000)
有什么办法吗?我的意思是类似 DBMS_LOB.APPEND 的函数,但可以通过 SQL 调用。或者任何其他方式将许多 varchar2 字符串连接成一个大的 CLOB 字符串 w/o 长度限制。
提前致谢。
帕维尔。
注意:最初作为评论发布,但现在作为答案提供,因为 OP 已经确认这实际上是问题所在。
那么,您能否首先创建 CLOB
(不串联)?如果是,那么您缺少的是将文字(以及您可能拥有的任何其他 VARCHAR2
值)包装在 to_clob()
中。祝你好运!
少量添加。
解决后,我在 clobagg 中遇到了同样的错误;
所以我不得不修改它以将输入参数设置为 varchar2(以启用 DISTINCT 子句工作)并且返回值为 CLOB。
所以,到目前为止,它可能在这里有用:
create or replace
TYPE CLOBAGG_TYPE AS OBJECT
(
text clob,
static function ODCIAggregateInitialize(
sctx in out clobagg_type
)
return number,
member function ODCIAggregateIterate(
self in out clobagg_type,
value in varchar2
)
return number,
member function ODCIAggregateTerminate(
self in clobagg_type,
returnvalue out clob,
flags in varchar2
)
return number,
member function ODCIAggregateMerge(
self in out clobagg_type,
ctx2 in clobagg_type
)
return number
)
create or replace
TYPE BODY CLOBAGG_TYPE AS
static function ODCIAggregateInitialize(
sctx in out clobagg_type
)
return number
is
begin
sctx := clobagg_type(null) ;
return ODCIConst.Success ;
end;
member function ODCIAggregateIterate(
self in out clobagg_type,
value in varchar2
)
return number
is
begin
self.text := self.text || ', ' || value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(
self in clobagg_type,
returnvalue out clob,
flags in varchar2
)
return number
is
begin
returnValue := ltrim(self.text,', ');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(
self in out clobagg_type ,
ctx2 in clobagg_type
)
return number
is
begin
self.text := self.text || ctx2.text;
return ODCIConst.Success;
end;
END;
create or replace
FUNCTION CLOBAGG(
input varchar2
) RETURN clob
deterministic
parallel_enable
aggregate using clobagg_type;
我有一个 table(实际上是一个视图),只有几个 varchar2 字段。说, v_report(id, 姓名, profile_id, profile_name);
我需要将 id 分组的数据收集到一个字符串中。所以,我这样做:
SELECT
id,
'Name: ' || clobagg(DISTINCT name)
|| ' Profile_name: ' || clobagg(DISTINCT profile_name)
as description
FROM
v_report
GROUP BY
id
clobagg 就像这里描述的那样: https://community.oracle.com/thread/2264483
(尤其是使用 clobagg 而不是 stragg,因为它的返回值 clob 能够存储 >4000 个字符)
当连接的配置文件字符串不太大时,它工作正常。但如果是,我会得到公平的 Oracle 异常:
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 7680, maximum: 4000)
有什么办法吗?我的意思是类似 DBMS_LOB.APPEND 的函数,但可以通过 SQL 调用。或者任何其他方式将许多 varchar2 字符串连接成一个大的 CLOB 字符串 w/o 长度限制。
提前致谢。
帕维尔。
注意:最初作为评论发布,但现在作为答案提供,因为 OP 已经确认这实际上是问题所在。
那么,您能否首先创建 CLOB
(不串联)?如果是,那么您缺少的是将文字(以及您可能拥有的任何其他 VARCHAR2
值)包装在 to_clob()
中。祝你好运!
少量添加。
解决后,我在 clobagg 中遇到了同样的错误; 所以我不得不修改它以将输入参数设置为 varchar2(以启用 DISTINCT 子句工作)并且返回值为 CLOB。
所以,到目前为止,它可能在这里有用:
create or replace
TYPE CLOBAGG_TYPE AS OBJECT
(
text clob,
static function ODCIAggregateInitialize(
sctx in out clobagg_type
)
return number,
member function ODCIAggregateIterate(
self in out clobagg_type,
value in varchar2
)
return number,
member function ODCIAggregateTerminate(
self in clobagg_type,
returnvalue out clob,
flags in varchar2
)
return number,
member function ODCIAggregateMerge(
self in out clobagg_type,
ctx2 in clobagg_type
)
return number
)
create or replace
TYPE BODY CLOBAGG_TYPE AS
static function ODCIAggregateInitialize(
sctx in out clobagg_type
)
return number
is
begin
sctx := clobagg_type(null) ;
return ODCIConst.Success ;
end;
member function ODCIAggregateIterate(
self in out clobagg_type,
value in varchar2
)
return number
is
begin
self.text := self.text || ', ' || value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(
self in clobagg_type,
returnvalue out clob,
flags in varchar2
)
return number
is
begin
returnValue := ltrim(self.text,', ');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(
self in out clobagg_type ,
ctx2 in clobagg_type
)
return number
is
begin
self.text := self.text || ctx2.text;
return ODCIConst.Success;
end;
END;
create or replace
FUNCTION CLOBAGG(
input varchar2
) RETURN clob
deterministic
parallel_enable
aggregate using clobagg_type;