2015-08-06 10 views
1

У меня есть таблица А с одним столбцомOracle Преобразование строк таблицы в список

**TableA** 
    Row1 
    Row2 
    Row3 
    ..... 

Я должен преобразовать строки таблицы в виде списка и хранить их в переменных. Чтобы они сохранялись как

Row1,Row2,Row3,....,Rown 

Я использовал функцию listagg() для достижения решения.

DECLARE 
tbl_list CLOB; 

BEGIN 

SELECT listagg (''''||Column_name||'''',',') WITHIN GROUP (ORDER BY Column_name) INTO TBL_LIST FROM TableA; 
END; 

Это прекрасно работает, если в таблице А есть несколько строк. Но если таблица имеет много строк я получаю следующее сообщение об ошибке

ORA-01489: result of string concatenation is too long 

Является ли это из-за лимит хранения переменной TBL_LIST? Может ли кто-нибудь объяснить мне, что не так. И есть ли альтернатива для lisagg(), для достижения результата, я хочу?

+0

Тип what - имя_колонны? Почему вам нужно преобразовать строки таблицы в список? – Mihai

+0

Можете посмотреть на это [Методы агрегирования строк] (https://oracle-base.com/articles/misc/string-aggregation-techniques), если вы хотите пойти на другие методы – Crazy2crack

+0

column_name - varchar2, мне нужны строки, которые должны быть упорядочивается как список (row1, row2, ....), потому что я передаю переменную tbl_list другому процессу, который принимает входные данные в виде списка – Saroj

ответ

1

listagg функция ограничена до 4000 символов, если она превышает 4000 символов года могут получить сообщение об ошибке ORA-01489: result of string concatenation is too long

Вы можете использовать XMLAGG, которое не ограничивается 4000 полукоксом.

SELECT 
    RTRIM(XMLAGG(XMLELEMENT(E,''''||Column_name||'''',',').EXTRACT('//text()') 
    ORDER BY Column_name).GetClobVal(),',') 
from TableA; 

вы можете передать этот вопрос: How to tweak LISTAGG to support more than 4000 character in select query?

0

Если вы ожидаете результат агрегации, чтобы быть более чем 4000 байт? Если это так, вы можете создать пользовательскую агрегированную функцию, которая возвращает CLOB, а не VARCHAR2. Если вы не ожидаете, что результат превысит 4000 байт, возможно, что-то не так, как вы указали агрегат.

См. «https://oracle-base.com/articles/misc/string-aggregation-techniques» для пользовательской агрегации.

+0

Да, проблема заключается в том, что функция возвращает результаты больше, чем 4000 байт. Потому что он отлично работает, если в таблице меньше строк. – Saroj

Смежные вопросы