2013-09-09 2 views
0

Я использую функцию ниже, чтобы объединить строки в одну колонку.Объединение строк в столбцы; ORA-06502: ошибка

CREATE OR REPLACE FUNCTION getconcat(in_c1 IN t1.c1%TYPE) 
    RETURN VARCHAR2 
IS 
    value_concat VARCHAR2(1000); 
    BEGIN 
    FOR cur_rec IN (SELECT c7 
        FROM t1 
        WHERE c1 = in_c1 
        ORDER BY c1, c2, c3, c4, c5) 
    LOOP 
     value_concat := value_concat || ',' || cur_rec.c7;   
    END LOOP; 

    RETURN substr(LTRIM(value_concat, ','), 1, 400); 
    END; 

Я звоню эту функцию в хранимой процедуре мастера как

SELECT 
     C1, 
     getconcat (C1) AS After_concat, 
      .............. 
     FROM T1 
     GROUP BY C1 

Ошибка:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "xx.getconcat", line 14 (line corresponding to it value_CONCAT := value_CONCAT || ',' || cur_rec.C7;)

+1

похоже, что оракул считает, что 1000 символов недостаточно для всех ваших 'C7', чтобы вписаться. – Hellion

ответ

2

Это потому, что петля вы делаете для конкатенации c7 значений превышая вместимость value_CONCAT, чтобы избежать этого, просто объявите его

value_CONCAT varchar2(4000); --4k is the maximum length for a varchar2 

Однако, если единственное, что вы делаете в этой функции является конкатенация, вы лучше с LISTAGG функции, попробовать что-то вроде этого:

SELECT 
    C1, 
    (SELECT 
     LISTAGG(C7, ',') WITHIN GROUP (ORDER BY C1,C2,C3,C4,C5) 
     FROM T1 X 
     WHERE X.C1=T1.C1 ) After_concat 

FROM T1 
GROUP BY C1 

Таким образом, вы можете избежать создания пользовательской функции каждый раз.

+0

Но вы должны помнить, что LISTAGG может возвращать 4000 символов (макс.). На всякий случай :) – denied