不过上面两种方法都会面临一个问题,就是如果聚集连接的字符串长度如果超过了VARCHAR2类型所允许的最大长度,就会导致字符串超长的错误。

自定义聚集函数这里就不重复了,可以参考上面的链接:

SQL> SELECT F_LINK(TNAME) FROM TAB;

F_LINK(TNAME)

-------------------------------------------------------------------------------------------

BAK_SHGOV_ORDER,BAK_SHGOV_ORDER_BAK,PLAN_TABLE,SHGOV_ORDER,SHGOV_ORDER_BAK,T,T1,TEST,T_SQL

SQL> SELECT F_LINK(SEQUENCE_NAME) FROM ALL_SEQUENCES;

SELECT F_LINK(SEQUENCE_NAME) FROM ALL_SEQUENCES

*

ERROR位于第1行:

ORA-06502: PL/SQL:数字或值错误:字符串缓冲区太小ORA-06512:在"TEST.T_LINK", line 16

ORA-06512:在line 1

SQL> SELECT MAX(LTRIM(SYS_CONNECT_BY_PATH(SEQUENCE_NAME, ','), ',')) NAME

2  FROM

3  (

4     SELECT SEQUENCE_NAME, ROW_NUMBER() OVER(ORDER BY SEQUENCE_NAME) RN

5     FROM ALL_SEQUENCES

6  )

7  START WITH RN = 1

8  CONNECT BY PRIOR RN + 1 = RN

9  ;

FROM ALL_SEQUENCES

*

ERROR位于第5行:

ORA-01489:字符串连接的结果过长

显然是由于要连接的字符串太长了,导致Oracle的字符串处理过程中出现了错误。上面的两种方法都没有办法避免这个问题。

但是ALL_SEQUENCES中的记录只有几百个,每个名称的长度不会超过30,因此最终的长度不会超过32767。

根据Oracle给出的错误信息,显然是在处理输出参数RETURNVALUE的时候是安装SQL类型的VARCHAR2长度4000做的限制,那么只需要修改输出参数和聚集函数的返回值类型为CLOB类型即可:

SQL> CREATE OR REPLACE TYPE T_LINK AS OBJECT (

2  STR VARCHAR2(32767),

3  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER,

4  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER,

5  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT CLOB, FLAGS IN NUMBER) RETURN NUMBER,

6  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER

7  )

8  /

类型已创建。

SQL> CREATE OR REPLACE TYPE BODY T_LINK IS

2  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT T_LINK) RETURN NUMBER IS

3  BEGIN

4  SCTX := T_LINK(NULL);

5  RETURN ODCICONST.SUCCESS;

6  END;

7

8  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER IS

9  BEGIN

10  SELF.STR := SELF.STR || VALUE || ',';

11  RETURN ODCICONST.SUCCESS;

12  END;

13

14  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN T_LINK, RETURNVALUE OUT CLOB, FLAGS IN NUMBER) RETURN NUMBER IS

15  BEGIN

16  RETURNVALUE := SUBSTR(SELF.STR, 1, LENGTH(SELF.STR) - 1);

17  RETURN ODCICONST.SUCCESS;

18  END;

19

20  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS

21  BEGIN

22  NULL;

23  RETURN ODCICONST.SUCCESS;

24  END;

25  END;

26  /

类型主体已创建。

SQL> CREATE OR REPLACE FUNCTION F_LINK(P_STR VARCHAR2) RETURN CLOB

2  AGGREGATE USING T_LINK;

3  /

函数已创建。

SQL> SELECT F_LINK(SEQUENCE_NAME) FROM ALL_SEQUENCES;

F_LINK(SEQUENCE_NAME)

--------------------------------------------------------------------------------

APPLY$_DEST_OBJ_ID,APPLY$_ERROR_HANDLER_SEQUENCE,APPLY$_SOURCE_OBJ_ID,AQ$_CHAINS

EQ,AQ$_IOTENQTXID,AQ$_PROPAGATION_SEQUENCE,AQ$_PUBLISHER_SEQUENCE,AQ$_RULE_SEQUE

NCE,AQ$_RULE_SET_SEQUENCE,AQ$_TRANS_SEQUENCE,AUDSES$,AWSEQ$,CDC_RSID_SEQ$,CDC_SU

BSCRIBE_SEQ$,DBMS_LOCK_ID,GENERATOR$_S,HS$_BASE_DD_S,HS$_CLASS_CAPS_S,HS$_CLASS_

DD_S,HS$_CLASS_INIT_S,HS$_FDS_CLASS_S,HS$_FDS_INST_S,HS$_INST_CAPS_S,HS$_INST_DD

_S,HS$_INST_INIT_S,IDGEN1$,JAVA$POLICY$SEQUENCE$,JOBSEQ,LOG$SEQUENCE,OBJECT_GRAN

T,ORA_TQ_BASE$,PARTITION_NAME$,PROFNUM$,PSINDEX_SEQ$,RGROUPSEQ,SNAPSHOT_ID$,SNAP

SITE_ID$,STREAMS$_CAPTURE_INST,STREAMS$_RULE_NAME_S,SYSTEM_GRANT,UGROUP_SEQUENCE

,LOGMNR_SEQ$,LOGMNR_UIDS$,MVIEW$_ADVSEQ_GENERIC,MVIEW$_ADVSEQ_ID,REPCAT$_EXCEPTI

ONS_S,REPCAT$_FLAVORS_S,REPCAT$_FLAVOR_NAME_S,REPCAT$_REFRESH_TEMPLATES_S,REPCAT

$_REPPROP_KEY,REPCAT$_RUNTIME_PARMS_S,REPCAT$_TEMPLATE_OBJECTS_S,REPCAT$_TEMPLAT

E_PARMS_S,REPCAT$_TEMPLATE_REFGROUPS_S,REPCAT$_TEMPLATE_SITES_S,REPCAT$_TEMP_OUT

PUT_S,REPCAT$_USER_AUTHORIZATIONS_S,REPCAT$_USER_PARM_VALUES_S,REPCAT_LOG_SEQUEN

CE,TEMPLATE$_TARGETS_S,WM$ADT_SEQUENCE,WM$INSTEADOF_TRIGS_SEQUENCE,WM$LOCK_SEQUE

NCE,WM$NESTED_COLUMNS_SEQ,WM$ROW_SYNC_ID_SEQUENCE,WM$UDTRIG_DISPATCHER_SEQUENCE,

WM$UP_DEL_TRIG_NAME_SEQUENCE,WM$VERSION_SEQUENCE,WM$VTID,SAMPLE_SEQ,SDO_IDX_TAB_

SEQUENCE,DR_ID_SEQ,MESG_ID_SEQ,THS_SEQ,XDB$NAMESUFF_SEQ,XDB$PROPNUM_SEQ,WK$CHARS

ET_SEQ,WK$CRAWLERID_SEQ,WK$DATA_SOURCE_PARAM_SEQ,WK$DOC_ATTR_SEQ,WK$DSPARAM_ID_S

EQ,WK$DSTYPE_ID_SEQ,WK$DS_ID_SEQ,WK$INST_SEQ,WK$JOB_ID_SEQ,WK$MAILLIST$SEQ,WK$MI

METYPES_SEQ,WK$PT_ID_SEQ,WK$SCHED_ID_SEQ,WK$SEARCH_ATTR_SEQ,WK$SG_ID_SEQ,WK$SUBS

CRIBER_SEQ,WK$TRACE_SEQ,WK$UNIQUE_STRINGID_SEQ,SEQ_CLASSIFICATION_RESULT_ID,SEQ_

LIFT_RESULT_ID,SEQ_MATRIX_ENTRY_ID,SEQ_MS_RESULT_ENTRY_ID,SEQ_MS_RESULT_ID,SEQ_O

DM_MESSAGE_LOG_ID,SEQ_ODM_MINING_TASK_ID,SEQ_ODM_UNIQUE_OBJECT_ID,SEQ_TEST_RESUL

T_ID,UNIQUE_ID,CWM2_OLAP_ENABLESEQ,DBMS_MVSEQ,OLAP_ID_SEQ,OLAP_IRID,DEPARTMENTS_

SEQ,EMPLOYEES_SEQ,LOCATIONS_SEQ,ORDERS_SEQ,AQ$_AQ$_MEM_MC_N,AQ$_QS_ORDERS_PR_MQT

AB_N,AQ$_QS_WS_ORDERS_MQTAB_N,AQ$_QS_WS_ORDERS_PR_MQTAB_N,AQ$_QS_ES_ORDERS_MQTAB

_N,AQ$_QS_ES_ORDERS_PR_MQTAB_N,AQ$_QS_OS_ORDERS_MQTAB_N,AQ$_QS_OS_ORDERS_PR_MQTA

B_N,AQ$_QS_CBADM_ORDERS_MQTAB_N,AQ$_QS_CS_ORDER_STATUS_QT_N,GOV_SEQ,HI_TEMPTOTAL

_ID,IMP_SYS_TMP,JOB_ID,MICROSOFTSEQDTPROPERTIES,SEQZ_USER_INFO,SEQ_CAT_MANAGER_B

UYER,SEQ_CON_LIST_ITEM_SHARE,SEQ_EMED_WEB_LOG,SEQ_TEMP_JP,SMS_ID_SEQ,SP_BID,SP_B

ID_ITEM,SP_INVITE_ITEM,SY_INVITE_ITEM,S_AD,S_BID,S_BIDORG_EFFECT,S_BID_ITEM,S_BI

D_ITEM_TEMP,S_BID_PRODUCT,S_BID_TEMP,S_DISCUSS_EXPERT,S_ENTER_COMM,S_EXPERT_BIDO

RG,S_EXPERT_ELLECT,S_EXPERT_ENTER,S_EXPERT_FACTORY,S_EXPERT_ITEM,S_EXPERT_PRODUC

T,S_EXPERT_SALE,S_EXPERT_SCHEME,S_FACTORY_EFFECT,S_ID,S_INVITE_APPRAISE,S_INVITE

_APPRAISE_ITEM,S_INVITE_COMM,S_INVITE_EXPERT,S_INVITE_ITEM,S_INVITE_PRODUCT_AFFI

X,S_INVITE_SALER_AFFIX,S_JD_AREA,S_JD_REFERENCE_PRICE,S_JD_SCHEME_MODEL,S_JD_SEN

D_ORG,S_JD_SEND_SCHEME,S_MESSAGE,S_PLAT_PRODUCT_6,S_PRE_BID_ITEM,S_PRODUCT_EFFEC

T,S_PRODUCT_FORP,S_PURCHASE_CODE,S_SALE_EFFECT,S_SCHEME_EFFECT,TMP_SYS_IMP,TRANF

ER,TRANSFER,STATS$SNAPSHOT_ID,GOV_SEQ,HI_TEMPTOTAL_ID,MICROSOFTSEQDTPROPERTIES,S

EQZ_USER_INFO,SEQ_TEMP_JP,SMS_ID_SEQ,SP_BID_ITEM,SP_INVITE_ITEM,SYS_DATA_ID,SY_I

NVITE_ITEM,S_AD,S_BID,S_BIDORG_EFFECT,S_BID_ITEM,S_BID_ITEM_TEMP,S_BID_PRODUCT,S

_BID_TEMP,S_DISCUSS_EXPERT,S_ENTER_COMM,S_EXPERT_BIDORG,S_EXPERT_ELLECT,S_EXPERT

_ENTER,S_EXPERT_FACTORY,S_EXPERT_ITEM,S_EXPERT_PRODUCT,S_EXPERT_SCHEME,S_FACTORY

_EFFECT,S_HIS_INV,S_ID,S_INVITE_APPRAISE,S_INVITE_APPRAISE_ITEM,S_INVITE_COMM,S_

INVITE_EXPERT,S_INVITE_ITEM,S_INVITE_PRODUCT_AFFIX,S_INVITE_SALER_AFFIX,S_JD_ARE

A,S_JD_REFERENCE_PRICE,S_JD_SCHEME_MODEL,S_JD_SEND_ORG,S_JD_SEND_SCHEME,S_MESSAG

E,S_PLAT_PRODUCT_6,S_PRODUCT,S_INFO_ID,S_PIC,S_USER_ID,S_INFO_ID,S_PIC,S_USER_ID

,S_ID,S_SEQ,GOV_SEQ,HI_TEMPTOTAL_ID,MICROSOFTSEQDTPROPERTIES,SEQZ_USER_INFO,SEQ_

TEMP_JP,SMS_ID_SEQ,SP_BID_ITEM,SP_INVITE_ITEM,SYS_DATA_ID,SY_INVITE_ITEM,S_AD,S_

BID,S_BIDORG_EFFECT,S_BID_ITEM,S_BID_ITEM_TEMP,S_BID_PRODUCT,S_BID_TEMP,S_DISCUS

S_EXPERT,S_ENTER_COMM,S_EXPERT_BIDORG,S_EXPERT_ELLECT,S_EXPERT_ENTER,S_EXPERT_FA

CTORY,S_EXPERT_ITEM,S_EXPERT_PRODUCT,S_EXPERT_SCHEME,S_FACTORY_EFFECT,S_HIS_INV,

S_ID,S_INVITE_APPRAISE,S_INVITE_APPRAISE_ITEM,S_INVITE_COMM,S_INVITE_EXPERT,S_IN

VITE_ITEM,S_INVITE_PRODUCT_AFFIX,S_INVITE_SALER_AFFIX,S_JD_AREA,S_JD_REFERENCE_P

RICE,S_JD_SCHEME_MODEL,S_JD_SEND_ORG,S_JD_SEND_SCHEME,S_MESSAGE,S_PLAT_PRODUCT_6

,S_PRODUCT

通过这种方法,可以将输入结果的上限从VARCHAR2的SQL类型4000扩大到PL/SQL的类型的32767,而且由于只在最后输出的部分使用了LOB类型,对性能基本上没有什么影响。

oracle 拼接字符串超长,字符串连接超长的解决(一)相关推荐

  1. Windows 2003上Oracle通过端口映射访问连接超时的解决办法

    布署在移动机房的Oracle数据库是在内网,没有分配公网IP,我需要连接上去,通过PortTunnel软件在WEB服务器上将1521端口映射到这台Oracle数据库服务器内网IP的1521端口,使用此 ...

  2. oracle 字符超长,oracle存储超长字符串

    oracle 字符.数值.日期处理_计算机软件及应用_IT/计算机_专业资料.字符及处理方法 1.固定长度字符串: char(n) 空格补足,效率高,最大 2000. 2.变长: varchar(n) ...

  3. js 字符串换行_JS代码编程中经常用到的超长字符串换行方法,你最喜欢哪一种?

    编写js代码的时候,经常会用到超长字符串的拼接. 例如,把系统时间中的年.月.日.时.分.秒共6个数字动态拼接到一个tr行,不换行的话,将是一个超长的字符串,阅读.维护都不方便.这时就需要将这个字符串 ...

  4. Oracle多行记录合并/连接/聚合字符串的几种方法

    Oracle多行记录合并/连接/聚合字符串的几种方法 怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.   ...

  5. oracle 拼接 长度,oracle操作字符串:拼接、替换、截取、查找、长度、判断详解...

    1.拼接字符串 1)可以使用"||"来拼接字符串 select '拼接'||'字符串' as str from dual 2)通过concat()函数实现 select conca ...

  6. oracle数据存储过程 中的循环 for 拼接字符串,oracle存储过程中使用字符串拼接

    1.使用拼接符号"||" v_sql := 'SELECT * FROM UserInfo WHERE ISDELETED = 0 AND ACCOUNT =''' || vAcc ...

  7. java连接字符串_Java字符串连接运算符

    Java字符串连接运算符 在java语言中所有的字符串都使用半角双引号括起来的,字符串属于引用数据类型,不属于基本数据类型的范畴,怎么定义一个字符串的变量呢?例如:String name = &quo ...

  8. 【Groovy】字符串 ( 字符串拼接 | 多行字符串 )

    文章目录 一.字符串类型变量 二.多行字符串 三.完整代码示例 一.字符串类型变量 在双引号字符串中 , 使用 ${变量名} 进行字符串拼接 , ${变量名} 符号的取值 , 是在 定义时取值 ; d ...

  9. vue动态拼接图片路径、img地址拼接问题 [模板字符串]

    写vue写的不多,记录一下这个小坑 知识点:es6模板字符串${} (一)需求: 使用vue根据后端传的json数组的某一字段来拼接img的src路径,动态的绑定img标签的图片,图片来源本地文件夹, ...

  10. java求拼接后的字符串长度,java如何拼接字符串

    java 动态拼接字符串,Java 字符串拼接效率分析及最佳实践,java字符串拼接,java如何拼接字符串 在JAVA 中拼接两个字符串的最简便的方式就是使用操作符"+"了.如果 ...

最新文章

  1. python使用input函数时、必须添加提示文字-Python中使用 input 函数来获取输入
  2. ffmpeg转码速度控制方法
  3. python空格_python 空格
  4. plotly python_使用Plotly for Python时的基本思路
  5. 连接不上sql server服务器的解决方案
  6. 试题12 交叉排序(小-大,大-小)
  7. 【LeetCode】【字符串】题号:*13. 罗马数字转整数
  8. 【NOIP2016提高A组模拟9.14】数列编辑器
  9. Java运行Python脚本的几种方式
  10. Linux Keepalived 高可用虚拟IP安装与配置
  11. 优化mac触摸板(Trackpad)使用体验的推荐设置
  12. CDH动态资源池配置
  13. Matplotlib学习笔记——画三维图
  14. JavaScript中0.1+0.2问题
  15. 微软官方推安全管家,或许不是一场作秀
  16. 印象笔记,石墨笔记和Effie哪个更适合学生?
  17. 消费心理学(04):价格锚点
  18. 机器学习——凸优化基础知识
  19. 翻译 第11章 of IEEE Std 1666-2011 IEEE Standard for Standard SystemC Language Reference Manual
  20. 九章算法面试题54 带重复元素的全排列

热门文章

  1. 谈一谈游戏AI - 综述
  2. layui弹出层在登录中的应用
  3. 社会工程学攻击案例-邮件钓鱼
  4. 货物贸易外汇监测系统 企业版_重点耗能企业能耗监测计量系统,能源管控平台方案...
  5. pikaqiu平台集成化漏洞练习
  6. 蔡高厅高等数学 09 函数的左右极限、无穷大量与无穷小量
  7. 织梦添加图片变量_dedecms编辑页面添加变量(织梦内容模型自定义字段)
  8. python电脑攻击_python实现MAC洪水攻击
  9. 微软一年后将“断供”XP系统 官网挂出倒计时牌
  10. Android携程高级用法,Android真正仿携程首页view实现