Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чем лимитируется длина varchar2, если в скобках ничего не указано? / 13 сообщений из 13, страница 1 из 1
14.05.2018, 16:00
    #39644509
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
Сегодня столкнулись с ситуацией, что тестирование процедуры из 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
14.05.2018, 16:04
    #39644511
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
Было подозрение на ограничение 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
14.05.2018, 16:17
    #39644516
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
HawkmoonМануал и гугл ничего не дал в понимании ДАННОЙ ситуации.Потому что использование variable varchar2 без указания длины не документировано, но по аналогии с char можно предположить, что длина 1 символ.
...
Рейтинг: 0 / 0
14.05.2018, 16:27
    #39644521
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
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
15.05.2018, 09:52
    #39644789
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
-2-,
>>что длина 1 символ.
Почему прокатывает из одних SQLPlus сеансов и не прокатывает из других?
...
Рейтинг: 0 / 0
15.05.2018, 09:55
    #39644790
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
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
15.05.2018, 12:53
    #39644934
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
Потому что так делать не надо -- поэтому и поведение неопределенное (наверняка и от 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
15.05.2018, 12:57
    #39644944
K790
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
Вячеслав Любомудров,

авторПредложения переписать на указание явной длины можете оставить при себе.
С таким утверждением бесполезно что-то советовать :)
...
Рейтинг: 0 / 0
15.05.2018, 13:08
    #39644955
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
HawkmoonПредложения переписать на указание явной длины можете оставить при себе.
Сделай неявную длину 4000
...
Рейтинг: 0 / 0
15.05.2018, 14:15
    #39645010
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
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
15.05.2018, 14:16
    #39645012
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем лимитируется длина varchar2, если в скобках ничего не указано?
envHawkmoonПредложения переписать на указание явной длины можете оставить при себе.
Сделай неявную длину 4000
как?

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

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

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

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

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


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