Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / результат строковой конкатинации слишком велик / 25 сообщений из 29, страница 1 из 2
17.11.2021, 13:00
    #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
17.11.2021, 13:06
    #40112517
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
ОК, понятно.
...
Рейтинг: 0 / 0
17.11.2021, 13:09
    #40112519
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
в чём тут проблема?
...
Рейтинг: 0 / 0
17.11.2021, 13:21
    #40112529
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
результат строковой конкатинации слишком велик
...
Рейтинг: 0 / 0
17.11.2021, 13:28
    #40112533
Агрох
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
Скорее всего это потому, что когда конкатенацией в запросе собираешь строку из строк типа VARCHAR то результатом и будет строка типа VARCHAR, со всеми положенными ограничениями.
...
Рейтинг: 0 / 0
17.11.2021, 13:30
    #40112534
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
и как можно решить эту проблему?
...
Рейтинг: 0 / 0
17.11.2021, 13:40
    #40112538
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
kmskmskms
и как можно решить эту проблему?
Обрезать строку до допустимого размера varchar2 или вернуть clob/xml. Последние версии, емнип, позволяют сделать первое элегантно средствами той же listagg.
...
Рейтинг: 0 / 0
17.11.2021, 13:47
    #40112543
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
Ну или max_string_size = extended, но это на любителя.
...
Рейтинг: 0 / 0
17.11.2021, 13:47
    #40112544
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
Собирать прямо в CLOB функциями соответствующего пакета.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.11.2021, 13:49
    #40112546
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
PuM256
Ну или max_string_size = extended, но это на любителя.
Это всего лишь отсрочит момент срабатывания взрывателя.
...
Рейтинг: 0 / 0
17.11.2021, 13:51
    #40112548
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
Dimitry Sibiryakov

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

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

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

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

Форматирование там, конечно, отсутствует как класс, но я вижу всего один
мегазапрос, обёрнутый как раз в list_agg в clob. Чего я не замечаю?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.11.2021, 14:37
    #40112568
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
ты не замечаешь того что это LISTAGG а не XMLAGG.
а вообще не подскажете как будет выглядеть аналог для
SELECT LISTAGG(text,'') WITHIN GROUP (ORDER BY sortcode ASC) с использованием XMLAGG?
...
Рейтинг: 0 / 0
17.11.2021, 14:58
    #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
17.11.2021, 15:45
    #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
17.11.2021, 16:14
    #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
17.11.2021, 17:42
    #40112648
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
andrey_anonymous, короче он так ошибкой реагирует если попадается text с пустой строкой
...
Рейтинг: 0 / 0
17.11.2021, 18:15
    #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
11.01.2022, 10:27
    #40125678
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
а как можно конкатинировать клоб с символом? тобиж "clob_text || '123'"
как я понимаю эта конструкция выдаст в запросе туже ошибку что результат строковой конкатинации слишком велик. Как грамотно приклеить к клобу текст в запросе?
...
Рейтинг: 0 / 0
11.01.2022, 11:09
    #40125685
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
kmskmskms

как я понимаю

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



.....
stax
...
Рейтинг: 0 / 0
11.01.2022, 11:59
    #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
11.01.2022, 13:00
    #40125722
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
результат строковой конкатинации слишком велик
kmskmskmsпочему тогда в этой функции может вылетать эта ошибка?

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

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


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