powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чем лимитируется длина varchar2, если в скобках ничего не указано?
13 сообщений из 13, страница 1 из 1
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644509
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня столкнулись с ситуацией, что тестирование процедуры из sqlplus:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
VARIABLE O_RC VARCHAR2
VARIABLE O_ERR VARCHAR2
VARIABLE O_RS REFCURSOR
EXEC PKG_KIT_xxx.SP_FIND(:O_RC, :O_ERR, null, null, null, 'C', 500,  :O_RS);
PRINT O_RC
PRINT O_ERR
PRINT O_RS


падает внутри процедуры на строке:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
PROCEDURE SP_FIND(
                      O_RC  OUT   NUMBER,
                      O_ERR OUT VARCHAR2,
                      I_xxx_ID IN NUMBER,
                      I_yyy_zzID IN VARCHAR2,
                      I_zzz_ID IN NUMBER,
                      I_SHOW_MODE IN VARCHAR2,
                      I_ROWS_LIMIT    IN   NUMBER, 
                      O_RS  OUT SYS_REFCURSOR
                     ) IS
  V_PROCNAME PROC_DICT.PROCD_NAME%TYPE := 'PKG_KIT_xxx.SP_FIND';
BEGIN
  IF I_xxx_ID IS NULL AND I_yyy_zzID IS NULL AND I_zzz_ID IS NULL THEN
    O_RC  := -102;
    O_ERR := V_PROCNAME || '():Недопустимые параметры I_xxx_ID = I_yyy_zzID = I_zzz_ID = NULL';
    RETURN;
  END IF;
 ....
END;


вот тут вот:
O_ERR := V_PROCNAME || '():Недопустимые параметры I_xxx_ID = I_yyy_zzID = I_zzz_ID = NULL';
Везде используется varchar2 без указания длины.
И при этом на одном из соединений падает с ошибкой:
Код: plsql
1.
2.
3.
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "test_schema12345.PKG_KIT_xxx", line <именно этот номер строки в Body пакета>


При этом в других вариантах соединений - все ок.

Внимание, вопрос:
Чем лимитировано ограничение длины varchar2 в отсутствие ограничений? Явно что-то творится на стороне клиента/иных параметров соединений.

Предложения переписать на указание явной длины можете оставить при себе.
Мне интересно, где и как может происходить ограничение.
Мануал и гугл ничего не дал в понимании ДАННОЙ ситуации.
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644511
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было подозрение на ограничение SQLPlus, но:
- на других sqlplus все работает, через SQL Developer-Alt-F10 все работает, а вот там конкретно - неа.
- повторяется в более коротком случае:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "ttt2.PKG_KIT_xxxx", line 111
ORA-06512: at line 1
в строке
V_PROCNAME PROC_DICT.PROCD_NAME%TYPE := 'PKG_KIT_xxxx.SP_GET';
O_ERR := V_PROCNAME || '():Недопустимые параметры I_kkk_ID = NULL';
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644516
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HawkmoonМануал и гугл ничего не дал в понимании ДАННОЙ ситуации.Потому что использование variable varchar2 без указания длины не документировано, но по аналогии с char можно предположить, что длина 1 символ.
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644521
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HawkmoonБыло подозрение на ограничение SQLPlus, но:
- на других sqlplus все работает, через SQL Developer-Alt-F10 все работает, а вот там конкретно - неа.
- повторяется в более коротком случае:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "ttt2.PKG_KIT_xxxx", line 111
ORA-06512: at line 1
в строке
V_PROCNAME PROC_DICT.PROCD_NAME %TYPE := 'PKG_KIT_xxxx.SP_GET';
O_ERR := V_PROCNAME || '():Недопустимые параметры I_kkk_ID = NULL';
этим и лимитируется
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644789
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,
>>что длина 1 символ.
Почему прокатывает из одних SQLPlus сеансов и не прокатывает из других?
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644790
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishHawkmoonБыло подозрение на ограничение SQLPlus, но:
- на других sqlplus все работает, через SQL Developer-Alt-F10 все работает, а вот там конкретно - неа.
- повторяется в более коротком случае:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "ttt2.PKG_KIT_xxxx", line 111
ORA-06512: at line 1
в строке
V_PROCNAME PROC_DICT.PROCD_NAME %TYPE := 'PKG_KIT_xxxx.SP_GET';
O_ERR := V_PROCNAME || '():Недопустимые параметры I_kkk_ID = NULL';
этим и лимитируется
PROC_DICT: PROCD_NAME VARCHAR2(61 CHAR)
но падает то на присвоении переменной O_ERR! У которой длина не указана.
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644934
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что так делать не надо -- поэтому и поведение неопределенное (наверняка и от NLS_LANG зависит)
ORA-06502: PL/SQL: Numeric or Value Error When Assigning a Sqlplus Variable (Doc ID 1050612.6)The variable declared in SQL*Plus must have a length value if the
variable type is varchar2.
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644944
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

авторПредложения переписать на указание явной длины можете оставить при себе.
С таким утверждением бесполезно что-то советовать :)
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39644955
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HawkmoonПредложения переписать на указание явной длины можете оставить при себе.
Сделай неявную длину 4000
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39645010
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hawkmoon,

я б сделал так
там где падает

к переменной добавлял по одному символу, и определил в какой именно момент слетает
а дальше уже б искал почему, напр из-за нлс

1) V_PROCNAME
2) O_ERR

если 2) то смотреть на фактический параметр мож он по разному опеределен

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2  v_rc number;
  3  v_err varchar2(10);
  4  v_rs sys_refcursor;
  5  PROCEDURE SP_FIND(
  6                        O_RC  OUT   NUMBER,
  7                        O_ERR OUT VARCHAR2,
  8                        I_xxx_ID IN NUMBER,
  9                        I_yyy_zzID IN VARCHAR2,
 10                        I_zzz_ID IN NUMBER,
 11                        I_SHOW_MODE IN VARCHAR2,
 12                        I_ROWS_LIMIT    IN   NUMBER,
 13                        O_RS  OUT SYS_REFCURSOR
 14                       ) IS
 15    V_PROCNAME emp.ename%type := 'PKG_KIT';
 16  BEGIN
 17    IF I_xxx_ID IS NULL AND I_yyy_zzID IS NULL AND I_zzz_ID IS NULL THEN
 18      O_RC  := -102;
 19      O_ERR := V_PROCNAME || '():Недопустимые параметры I_xxx_ID = I_yyy_zzID = I_zzz_ID = NULL';
 20      RETURN;
 21    END IF;
 22  END;
 23  begin
 24   null;
 25   SP_FIND(v_rc,v_err,null,null,null,null,null,v_rs);
 26* end;
SQL> /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 19
ORA-06512: at line 25



.....
stax
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39645012
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envHawkmoonПредложения переписать на указание явной длины можете оставить при себе.
Сделай неявную длину 4000
как?

.....
stax
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39645028
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Заменить обесскобленный varchar2 на varchar2(4000), а byte или char останется неявным.
...
Рейтинг: 0 / 0
Чем лимитируется длина varchar2, если в скобках ничего не указано?
    #39645044
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawish этим и лимитируется
Гонишь :)

Утенок прав.
Хост-переменная, прибитая к O_ERR, объявлена без длины -> по факту выделяется 1 (символ или байт - в зависимости от NLS_LENGTH_SEMANTICS).

Hawkmoon-2-,
>>что длина 1 символ.
Почему прокатывает из одних SQLPlus сеансов и не прокатывает из других?

Не документировано => никто никому ничего не обещал.
Может от версии SQL*Plus зависит, может от платформы, а может от погоды в Индии.
Или вообще не SQL*Plus используете там, где "прокатывает".
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чем лимитируется длина varchar2, если в скобках ничего не указано?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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