Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/112: Рейтинг темы: голосов - 112, средняя оценка - 4.93
14 / 14 / 2
Регистрация: 03.02.2010
Сообщений: 142
1

PL/SQL: добавление строки к себе и "string buffer too small"

17.07.2012, 14:34. Показов 22534. Ответов 8
Метки нет (Все метки)

Здравствуйте!
При попытке выполнить такой код:
Oracle 11 SQL
1
s:=rec.s||s;
или такой код
Oracle 11 SQL
1
s:=CONCAT(rec.s,s);
Возникает ошибка "ORA-06502: PL/SQL: numeric or value error: character string buffer too small".
Если я правильно понял, это возникает потому, что я пытаюсь прибавить строку к самой себе, буфер результата сложения строк s и rec.s больше буфера строки s.

Есть ли способ добавить к строке ещё одну, так чтобы можно было повторить эту операцию заранее неопределённое число раз?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2012, 14:34
Ответы с готовыми решениями:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
CREATE or REPLACE TYPE PERSONALS_man as OBJECT( VAR VARCHAR2(15), UZV VARCHAR2(25), AMATS...

В цикле после 100 итерации ошибка исполнения "Buffer too small"
код такой: for (int i = 1; i <= 256; i++) { cout << GetVal(i) << ","; } GetVal(i) это...

Ошибка L"Buffer is too small"
Не работает программа, хотя по идее должна. Помогите разобраться. Вот задание: 3. Дана строка,...

Expression: ("buffer too small", 0)
Скажите в чем проблема. Если объявить как char w_str, все работает. Как записывать строку в...

8
Эксперт Java
4077 / 3811 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
17.07.2012, 16:17 2
Если действительно необходимо неопределённое число раз, то можно использовать clob, вместо обычной строки. Он имеет неограниченную длину.

Добавлено через 1 час 7 минут
На всякий случай:
Строки в pl/sql ограничены длиной 2^15 - 1, в sql - 4000.
Если не предполагается превысить этих лимитов, то лучше использовать все же обычный varchar2.
1
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
17.11.2015, 18:59 3
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    FUNCTION f1(sub_id_ IN NUMBER) RETURN VARCHAR2 IS
        v_ret_val VARCHAR2(4000);
    BEGIN
        FOR curs IN (SELECT p.wo_id, p.wo_code
                       FROM wo_pool p, wo_instance i
                      WHERE p.sub_id = sub_id_
                        AND p.wo_id = i.wo_id
                      ORDER BY p.wo_id) LOOP
            v_ret_val := v_ret_val || curs.wo_code || ':' ||
                         curs.wo_id || ';';
        END LOOP;
 
        RETURN v_ret_val;
 
    END;
Не совсем понятно, а если и так Varchar2(4000), юзать только clob, других вариантов нет? функция падает на
SQL
1
v_ret_val := v_ret_val || curs.wo_code || ':' ||
Добавлено через 12 минут
Проблема в том, что и clob не проходит =(
0
Модератор
3916 / 2894 / 555
Регистрация: 21.01.2011
Сообщений: 12,545
18.11.2015, 09:20 4
Цитата Сообщение от пк00мук Посмотреть сообщение
юзать только clob, других вариантов нет
Смотря для чего используется результат. Если для записи в таблицу, то либо varchar2 <= 4000, либо CLOB.
Если используется для дальнейшей обработки в PL/SQL, то либо CLOB, либо коллекция varchar2.
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
18.11.2015, 11:34 5
Цитата Сообщение от Grossmeister Посмотреть сообщение
Если используется для дальнейшей обработки в PL/SQL, то либо CLOB, либо коллекция varchar2.
Нет, в таблицу вроде не записывается, далее в пакете нигде v_ret_val не указывается.
И переменная вроде не глобальная. Хотя в других пакетах v_ret_val используется уйму раз для возврата через return каких либо значений.

Что такое коллекция varchar2? и как ее применить в данном случае?
0
Модератор
3916 / 2894 / 555
Регистрация: 21.01.2011
Сообщений: 12,545
18.11.2015, 12:01 6
Цитата Сообщение от пк00мук
Что такое коллекция varchar2?
В PL/SQL 3 типа коллекции: index by table, nested table, varray

Цитата Сообщение от пк00мук
и как ее применить в данном случае?
Зависит от дальнейшего использования. Например, писать каждый wo_code в свой элемент коллекции
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
18.11.2015, 12:11 7
index имеется ввиду, тот самый, который увеличивает производительность, аля CREATE INDEX supplier_idx
ON supplier (supplier_name)?
0
Модератор
3916 / 2894 / 555
Регистрация: 21.01.2011
Сообщений: 12,545
18.11.2015, 12:37 8
Я же сказал "В PL/SQL", а не "В SQL". В SQL типа Index by table нет. В Oracle исторически 2 разных engine: SQL и PL/SQL
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
19.11.2015, 11:57 9
Прошу помочь правильно оформить =(
указал в теле пакета
SQL
1
TYPE wo_id_coll IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
далее, судя по примеру отсюда http://www.firststeps.ru/sql/oracle/r.php?57, мне нужно мою переменную v_ret_val описать не как varchar2, а так?:

SQL
1
v_ret_val wo_id_coll;
Все, решил вопрос .спасибо всем
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2015, 11:57

При вызове конструктора ошибка: L "Buffer is too small" & & 0
Привет. При вызове конструктора вылетает эта ошибка. Student(char *n, char *s, char *p, int...

Expression: (L"Buffer is too small" && 0)
Где ошибка и как её исправить? #include &lt;iostream&gt; #include &lt;string&gt; using namespace std;...

Ошибка : " L Buffer is too small & & 0"
Здравствуйте. У меня возникла странная проблема: в недалеком прошлом рабочая программа начала...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления"
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru