加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ORA-06502: PL/SQL: 数字或值错误 : character string buffer too

(2015-01-08 11:30:08)
标签:

股票

oracle

it

分类: oracle
因为需要将特定列数据进行行转列,进行比较和处理。所以WM_CONCAT是最好的解决函数。但因长度限制,网上的方案是采用了CLOB返回值的方式,是针对一次数据查询的结果。而我现在是多次进行查询,每次查询的值不是很大,而引起的错误,分析是不是WM_CONCAT的内存块不够产生的原因。因而采用了另种解决方式。

一、针对多次返回结果解决方式
CREATE OR REPLACE FUNCTION GET_CUSTNO_GROUP(v_para1 in VARCHAR2,v_para2 in VARCHAR2,v_type in number)
RETURN VARCHAR2
IS
v_custno_tmp VARCHAR2(4000);
v_sql        VARCHAR2(1024);
v_custno t01_customer.cust_no%type;

TYPE C_UCR_TYPE IS REF CURSOR;
c_cur C_UCR_TYPE;
BEGIN
 
  case v_type
    when 1 then
         v_sql:='select t.cust_no from T01_CUST_IDENTIFY t where t.cust_iden_type!=''01zz'' and t.cust_iden_type='||v_para2||' and t.info_identify='||v_para1;
    when 2 then
         v_sql:='select t.cust_no from T01_CUST_IDENTIFY t where t.cust_iden_type!=''01zz'' and  t.info_identify='||v_para1;
    when 3 then
         v_sql:='select t.cust_no from T01_CONTACT t where t.contact_info='||v_para1;
 end case;

  open c_cur for v_sql;
  LOOP
   FETCH c_cur INTO v_custno;
         EXIT WHEN c_cur%NOTFOUND;
      v_custno_tmp := v_custno_tmp||','||v_custno;
  END LOOP;
  close c_cur;
 
  v_custno_tmp := substr(v_custno_tmp,2);
 
  RETURN v_custno_tmp;
END GET_CUSTNO_GROUP;
二、网上针对一次返回结果的代码

--错误   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;


根据不同问题,采用不同的解决方式。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有