在 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;