powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / результат строковой конкатинации слишком велик
25 сообщений из 29, страница 1 из 2
результат строковой конкатинации слишком велик
    #40112513
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при попытке выполнить функцию вот такая вот ошибка.

Сама функция:
create or replace FUNCTION FN_1GKB_GET_TEXT_ANSWERS (var_form_id IN VARCHAR2,var_from IN VARCHAR2,var_to IN VARCHAR2) RETURN clob AS
res clob;
BEGIN
SELECT LISTAGG(text,'') WITHIN GROUP (ORDER BY sortcode ASC) INTO res
FROM (SELECT
CASE
WHEN typ = 1 THEN
text ||
CASE
WHEN SUBSTR(text,-1) != '.' AND SUBSTR(text,-1) != '!' AND SUBSTR(text,-1) != '?' THEN '.'
END ||
CASE
WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 0) THEN chr(10)
WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 1) THEN ' '
END
WHEN typ = 0 THEN
CASE WHEN text = ' ' THEN '' ELSE '~b' || text || '.b& ' END
END text,sortcode,typ FROM
(SELECT text,sortcode,
CASE WHEN typ = 0 THEN
CASE WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 1) THEN 0 ELSE 1 END
ELSE 0
END del,typ
FROM (SELECT CASE WHEN fi.text = ' ' THEN '' ELSE fi.text || ' ' END || TRIM(fv.text) AS text, fi.sortcode, fi.typ
FROM
solution_reg.form_result_desc fd,
solution_form.form_item fi,
solution_reg.form_result_value_desc fv
WHERE fd.id = var_form_id
AND fv.form_result_id = fd.id
AND fi.id = fv.form_item_id
AND fv.text <> ' '
AND fi.typ=1
AND fi.sortcode BETWEEN var_from AND var_to
UNION ALL
SELECT fi.text, fi.sortcode, fi.typ
FROM
solution_reg.form_result_desc fd,
solution_form.form_item fi
WHERE fd.id = var_form_id
AND fi.form_id = fd.form_id
AND fi.typ=0
AND fi.sortcode BETWEEN var_from AND var_to
ORDER BY sortcode ASC))
WHERE del != 1);
RETURN res;
END FN_1GKB_GET_TEXT_ANSWERS;

вызов функции:
SELECT
FN_1GKB_GET_TEXT_ANSWERS('117094023',0,9999) FORM
FROM DUAL
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112517
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОК, понятно.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112519
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в чём тут проблема?
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112529
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
результат строковой конкатинации слишком велик
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112533
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего это потому, что когда конкатенацией в запросе собираешь строку из строк типа VARCHAR то результатом и будет строка типа VARCHAR, со всеми положенными ограничениями.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112534
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и как можно решить эту проблему?
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112538
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms
и как можно решить эту проблему?
Обрезать строку до допустимого размера varchar2 или вернуть clob/xml. Последние версии, емнип, позволяют сделать первое элегантно средствами той же listagg.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112543
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну или max_string_size = extended, но это на любителя.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112544
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собирать прямо в CLOB функциями соответствующего пакета.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112546
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PuM256
Ну или max_string_size = extended, но это на любителя.
Это всего лишь отсрочит момент срабатывания взрывателя.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112548
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Собирать прямо в CLOB функциями соответствующего пакета.
Можно и без пакета собрать средствами xmlagg и последующей конвертацией в clob.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112554
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadМожно и без пакета собрать средствами xmlagg и последующей конвертацией в clob.

Именно это он уже и делает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112559
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

AmKadМожно и без пакета собрать средствами xmlagg и последующей конвертацией в clob.

Именно это он уже и делает.
Если мы говорим про код в первом посте, то нет.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112565
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadЕсли мы говорим про код в первом посте, то нет.

Форматирование там, конечно, отсутствует как класс, но я вижу всего один
мегазапрос, обёрнутый как раз в list_agg в clob. Чего я не замечаю?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112568
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ты не замечаешь того что это LISTAGG а не XMLAGG.
а вообще не подскажете как будет выглядеть аналог для
SELECT LISTAGG(text,'') WITHIN GROUP (ORDER BY sortcode ASC) с использованием XMLAGG?
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112575
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох уж этот copypaste-driven девелопмент...
1. Изложите свою мегафункцию, раз уж всё одно вылезли в PL/SQL, на PL/SQL.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace FUNCTION FN_1GKB_GET_TEXT_ANSWERS(var_form_id IN VARCHAR2,
                                                    var_from    IN VARCHAR2,
                                                    var_to      IN VARCHAR2)
  RETURN clob AS
  res clob;
BEGIN
  dbms_lob.createtemporary(res,false);
  for i in ( SELECT ...
       ) loop
         dbms_lob.writeappend(res, length(i.text), i.text);
       end loop;
  RETURN res;
END FN_1GKB_GET_TEXT_ANSWERS;



2. Раз уж вылезли в PL/SQL - то стоит избавиться от unon all и сделать необходимую логику в цикле по одному проходу через таблички.

3. Подрываетесь вы, к гадалке не ходи, на конкатенациях - если их выполнить не в запросе, а в pl/sql, где varchar2 длиннее, то проскочите.
Да и текст сопровождать будет попроще.

Dimitry Sibiryakov
Чего я не замечаю?

Контатенаций в copypaste-style мегазапросе :)
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112593
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Ох уж этот copypaste-driven девелопмент...
1. Изложите свою мегафункцию, раз уж всё одно вылезли в PL/SQL, на PL/SQL.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace FUNCTION FN_1GKB_GET_TEXT_ANSWERS(var_form_id IN VARCHAR2,
                                                    var_from    IN VARCHAR2,
                                                    var_to      IN VARCHAR2)
  RETURN clob AS
  res clob;
BEGIN
  dbms_lob.createtemporary(res,false);
  for i in ( SELECT ...
       ) loop
         dbms_lob.writeappend(res, length(i.text), i.text);
       end loop;
  RETURN res;
END FN_1GKB_GET_TEXT_ANSWERS;



2. Раз уж вылезли в PL/SQL - то стоит избавиться от unon all и сделать необходимую логику в цикле по одному проходу через таблички.

3. Подрываетесь вы, к гадалке не ходи, на конкатенациях - если их выполнить не в запросе, а в pl/sql, где varchar2 длиннее, то проскочите.
Да и текст сопровождать будет попроще.

Dimitry Sibiryakov
Чего я не замечаю?

Контатенаций в copypaste-style мегазапросе :)


не работает

функция
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
create or replace FUNCTION FN_1GKB_TEST (var_form_id IN VARCHAR2,var_from IN VARCHAR2,var_to IN VARCHAR2) RETURN clob AS
res	clob;
BEGIN

dbms_lob.createtemporary(res,false);

FOR i IN (SELECT 
CASE 
WHEN typ = 1 THEN 
    text || 
    CASE 
        WHEN SUBSTR(text,-1) != '.' AND SUBSTR(text,-1) != '!' AND SUBSTR(text,-1) != '?' THEN '.'
    END ||
    CASE 
        WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 0) THEN chr(10)
        WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 1) THEN ' ' 
    END
WHEN typ = 0 THEN 
    CASE WHEN text = ' ' THEN '' ELSE '~b' || text || '.b& ' END
END text,sortcode,typ FROM
(SELECT text,sortcode,
CASE WHEN typ = 0 THEN
    CASE WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 1) THEN 0 ELSE 1 END
ELSE 0
END del,typ
FROM (SELECT CASE WHEN fi.text = ' ' THEN '' ELSE  fi.text || ' ' END ||  TRIM(fv.text) AS  text, fi.sortcode, fi.typ
FROM 
solution_reg.form_result_desc fd,
solution_form.form_item fi,
solution_reg.form_result_value_desc fv
WHERE fd.id = var_form_id
	AND fv.form_result_id = fd.id
	AND fi.id = fv.form_item_id
	AND fv.text <> ' '
	AND fi.typ=1
	AND fi.sortcode BETWEEN var_from AND var_to
UNION ALL
SELECT fi.text, fi.sortcode, fi.typ
FROM 
solution_reg.form_result_desc fd,
solution_form.form_item fi
WHERE fd.id = var_form_id
	AND fi.form_id = fd.form_id
	AND fi.typ=0
	AND fi.sortcode BETWEEN var_from AND var_to
ORDER BY sortcode ASC))
) LOOP
    dbms_lob.writeappend(res, length(i.text), i.text);
END LOOP;

RETURN res;
END;



вызов:
Код: plsql
1.
2.
3.
SELECT
FN_1GKB_TEST('117094023',0,9999) FORM
FROM DUAL



ошибка:
ORA-06502: PL/SQL: ошибка числа или значения
ORA-06512: на "SYS.DBMS_LOB", line 1163
ORA-06512: на "SOLUTION_MED.FN_1GKB_TEST", line 49
ORA-06512: на "SOLUTION_MED.FN_1GKB_TEST", line 49
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause: An arithmetic, numeric, string, conversion, or constraint error
occurred. For example, this error occurs if an attempt is made to
assign the value NULL to a variable declared NOT NULL, or if an
attempt is made to assign an integer larger than 99 to a variable
declared NUMBER(2).
*Action: Change the data, how it is manipulated, or how it is declared so
that values do not violate constraints.
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112608
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms
SELECT LISTAGG(text,'') WITHIN GROUP (ORDER BY sortcode ASC) с использованием XMLAGG?
Код: plsql
1.
2.
3.
select rtrim(xmlcast(xmlagg(xmlelement("x", object_name || ',')) as clob), ',') x
from user_objects
where rownum <= 1000;
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112648
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous, короче он так ошибкой реагирует если попадается text с пустой строкой
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40112656
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2   res clob;
  3   v_text varchar2(100);
  4  BEGIN
  5   dbms_lob.createtemporary(res,false);
  6   dbms_lob.writeappend(res, length(v_text), v_text);
  7   dbms_lob.freetemporary(res);
  8* end;
SQL> /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.DBMS_LOB", line 1146
ORA-06512: at line 6


SQL> ed
Wrote file afiedt.buf

  1  declare
  2   res clob;
  3   v_text varchar2(100);
  4  BEGIN
  5   dbms_lob.createtemporary(res,false);
  6   if v_text is not null then
  7     dbms_lob.writeappend(res, length(v_text), v_text);
  8   end if;
  9   dbms_lob.freetemporary(res);
 10* end;
SQL> /

PL/SQL procedure successfully completed.

SQL>



.....
stax
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40125678
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как можно конкатинировать клоб с символом? тобиж "clob_text || '123'"
как я понимаю эта конструкция выдаст в запросе туже ошибку что результат строковой конкатинации слишком велик. Как грамотно приклеить к клобу текст в запросе?
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40125685
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskms

как я понимаю

Код: plsql
1.
2.
3.
4.
select length(c||'123') , c||'123' s from t_clob
/
L	S
8003	+++...



.....
stax
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40125703
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Ок, почему тогда в этой функции может вылетать эта ошибка?


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
create or replace FUNCTION FN_1GKB_TEST (var_form_id IN VARCHAR2,var_from IN VARCHAR2,var_to IN VARCHAR2) RETURN clob AS
res	clob;
BEGIN

dbms_lob.createtemporary(res,false);

FOR i IN (SELECT 
CASE 
WHEN typ = 1 THEN 
    text || 
    CASE 
        WHEN SUBSTR(text,-1) != '.' AND SUBSTR(text,-1) != '!' AND SUBSTR(text,-1) != '?' THEN '.'
    END ||
    CASE 
        WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 0) THEN chr(10)
        WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 1) THEN ' ' 
    END
WHEN typ = 0 THEN 
    CASE WHEN text = ' ' THEN '' ELSE '~b' || text || '.b& ' END
END text,sortcode,typ FROM
(SELECT text,sortcode,
CASE WHEN typ = 0 THEN
    CASE WHEN (lag(typ,1) over (ORDER BY sortcode DESC) = 1) THEN 0 ELSE 1 END
ELSE 0
END del,typ
FROM (SELECT CASE WHEN fi.text = ' ' THEN '' ELSE  fi.text || ' ' END ||  TRIM(fv.text) AS  text, fi.sortcode, fi.typ
FROM 
solution_reg.form_result_desc fd,
solution_form.form_item fi,
solution_reg.form_result_value_desc fv
WHERE fd.id = var_form_id
	AND fv.form_result_id = fd.id
	AND fi.id = fv.form_item_id
	AND fv.text <> ' '
	AND fi.typ=1
	AND fi.sortcode BETWEEN var_from AND var_to
UNION ALL
SELECT fi.text, fi.sortcode, fi.typ
FROM 
solution_reg.form_result_desc fd,
solution_form.form_item fi
WHERE fd.id = var_form_id
	AND fi.form_id = fd.form_id
	AND fi.typ=0
	AND fi.sortcode BETWEEN var_from AND var_to
ORDER BY sortcode ASC))
) LOOP
    dbms_lob.writeappend(res, length(i.text), i.text);
END LOOP;

RETURN res;
END;



ошибка возникает когда поле text попадается очень большой текст "результат строковой конкатинации слишком велик"
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40125722
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kmskmskmsпочему тогда в этой функции может вылетать эта ошибка?

У тебя там конкатенация двух полей с константами. Какие размеры у fi.text и fv.text?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
результат строковой конкатинации слишком велик
    #40125729
kmskmskms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

fv.text VARCHAR2(4000 CHAR)
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / результат строковой конкатинации слишком велик
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]