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

Есть коллекция:
Код: plsql
1.
type sometable is table of varchar2(128) index by varchar(32)


тип данных не важен, пусть будет varchar2(128)

вопросы: может ли быть ключ нулевым? Если да, то когда? А можно как-то сделать так, чтобы нельзя было задать нулевой ключ? Влияет ли на это тип ключа? Может, есть ещё какие-то важные моменты?
Есть ли где почитать документацию? Тут ничего не нашёл
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39376288
VALUE_ERROR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb Тут ничего не нашёл
Assigning Collections If the subscript is null or is not convertible to the right datatype, PL/SQL raises the predefined exception VALUE_ERROR .
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39376498
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тут все очень весело
В PL/SQL константа '' не совсем null, поэтому вот такие вот казусы возможны
Код: 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.
tst> declare type tab is table of number index by varchar2(10);
  2          t tab;
  3          i varchar2(10);
  4  begin t('') := 5;
  5        i := t.first;
  6        if i is null then dbms_output.put_line('i is null');
  7        elsif i is not null then dbms_output.put_line('i is not null');
  8        else dbms_output.put_line('i is unknown');
  9        end if;
 10        dbms_output.put_line(t(i));
 11  end;
 12  /
i is null
5

PL/SQL procedure successfully completed.

tst> declare type tab is table of number index by varchar2(10);
  2          t tab;
  3          i varchar2(10);
  4  begin i := null;
  5        t(i) := 5;
  6  end;
  7  /
declare type tab is table of number index by varchar2(10);
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: NULL index table key value
ORA-06512: at line 5
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39376499
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
tst> declare type tab is table of number index by varchar2(10);
  2          t tab;
  3          i varchar2(10);
  4  begin i := '';
  5        t(i) := 5;
  6  end;
  7  /

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39376564
VALUE_ERROR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Вячеслав Любомудров]казусы возможны[src oracle]
Спасибо, забавно.

Удивило, что в соответствующей статье в 12.2 как-то еще более обтекаемо про нуллабельность индекса написано (если вообще написано, как-то сходу не нашел). Даже нет примеров, встречавшихся мне в экзамплах от 9.2 и ранее процитированного фрагмента описания. И value_erorr матчится в статье лишь единожды и немного не о том.
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377149
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VALUE_ERRORСпасибо, забавно.


Код: 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.
SQL> declare
  2       type tab is table of number index by varchar2(10);
  3       t tab;
  4       i varchar2(10);
  5  begin
  6      i := '';
  7      t(i) := 5;
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL> alter session set events '10932 trace name context forever, level 16384'
  2  /

Session altered.

SQL> declare
  2       type tab is table of number index by varchar2(10);
  3       t tab;
  4       i varchar2(10);
  5  begin
  6      i := '';
  7      t(i) := 5;
  8  end;
  9  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: NULL index table key value
ORA-06512: at line 7


SQL> 



Из серии:

Bug 727361: ZERO-LENGTH STRING DOES NOT RETURN NULL WHEN USED WITH CHAR DATA TYPE IN PL/SQL

SY.
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377159
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VALUE_ERRORСпасибо, забавно.


Куда забавней вот такой баг где пустая строка ('') присутствует нeявно:

Код: 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.
SQL> declare
  2      type tab is table of number index by varchar2(10);
  3      t tab;
  4      i varchar2(10);
  5      p number;
  6  begin
  7      i := regexp_replace('VALUE_ERROR','^VALUE.*',p);
  8      if i is null
  9        then
 10          dbms_output.put_line('i is null - t(i) := 5; should raise:');
 11          dbms_output.put_line('ORA-06502: PL/SQL: numeric or value error: NULL index table key value');
 12      end if;
 13      t(i) := 5;
 14  end;
 15  /
i is null - t(i) := 5; should raise:
ORA-06502: PL/SQL: numeric or value error: NULL index table key value

PL/SQL procedure successfully completed.

SQL> alter session set events '10932 trace name context forever, level 16384'
  2  /

Session altered.

SQL> declare
  2      type tab is table of number index by varchar2(10);
  3      t tab;
  4      i varchar2(10);
  5      p number;
  6  begin
  7      i := regexp_replace('VALUE_ERROR','^VALUE.*',p);
  8      if i is null
  9        then
 10          dbms_output.put_line('i is null - t(i) := 5; should raise:');
 11          dbms_output.put_line('ORA-06502: PL/SQL: numeric or value error: NULL index table key value');
 12      end if;
 13      t(i) := 5;
 14  end;
 15  /
i is null - t(i) := 5; should raise:
ORA-06502: PL/SQL: numeric or value error: NULL index table key value
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: NULL index table key value
ORA-06512: at line 13


SQL> 



SY.
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377571
BuLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо))
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377646
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevGym: NULL Values and Zero Length Strings

P.S. Привет Валентину!
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377788
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377808
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY Спасибо всем, кого "зацепило".

SY.О, Соломон, спасибо за экскурс! До сих пор торчу :)

Чтобы меньше торчать, есть простое правило: никогда не использовать допотопный CHAR. Как ни странно (по крайней мере для меня), но даже Стивен записал этот ROT себе в анналы.
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377815
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicЧтобы меньше торчать, есть простое правило: никогда не использовать допотопный CHAR.

К сожалению в REGEXP с NULL позицией CHAR возвращается самим oracle...

SY.
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377822
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYElicЧтобы меньше торчать, есть простое правило: никогда не использовать допотопный CHAR.

К сожалению в REGEXP с NULL позицией CHAR возвращается самим oracle...

SY.
ну и cast ему по всей морде, как только..
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377823
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYК сожалению в REGEXP с NULL позицией CHAR возвращается самим oracle...Ээээээ... SQL? PL/SQL?
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377832
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377848
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYElicЭэээээ... SQL? PL/SQL?
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1244232&msg=20057887 Ага, понял. Но это, я бы сказал, слишком искусственный случай. В практике на такое наступить сложно. (Про быдлокодеров не скажу)
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377968
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishну и cast ему по всей морде, как только..

Какой cast? Куда саst? Тип то уже строковой:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> set serveroutput on
SQL> declare
  2      type tab is table of number index by varchar2(10);
  3      t tab;
  4      i varchar2(10);
  5      p number;
  6  begin
  7      i := cast(regexp_replace('VALUE_ERROR','^VALUE.*',p) as varchar2);
  8      if i is null
  9        then
 10          dbms_output.put_line('i is null - t(i) := 5; should raise:');
 11          dbms_output.put_line('ORA-06502: PL/SQL: numeric or value error: NULL index table key value');
 12      end if;
 13      t(i) := 5;
 14  end;
 15  /
    i := cast(regexp_replace('VALUE_ERROR','^VALUE.*',p) as varchar2);
              *
ERROR at line 7:
ORA-06550: line 7, column 15:
PLS-00382: expression is of wrong type
ORA-06550: line 7, column 5:
PL/SQL: Statement ignored



SY.
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39377970
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYorawishну и cast ему по всей морде, как только..

Какой cast? Куда саst? Тип то уже строковой:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> set serveroutput on
SQL> declare
  2      type tab is table of number index by varchar2(10);
  3      t tab;
  4      i varchar2(10);
  5      p number;
  6  begin
  7      i := cast(regexp_replace('VALUE_ERROR','^VALUE.*',p) as varchar2);
  8      if i is null
  9        then
 10          dbms_output.put_line('i is null - t(i) := 5; should raise:');
 11          dbms_output.put_line('ORA-06502: PL/SQL: numeric or value error: NULL index table key value');
 12      end if;
 13      t(i) := 5;
 14  end;
 15  /
    i := cast(regexp_replace('VALUE_ERROR','^VALUE.*',p) as varchar2);
              *
ERROR at line 7:
ORA-06550: line 7, column 15:
PLS-00382: expression is of wrong type
ORA-06550: line 7, column 5:
PL/SQL: Statement ignored




SY.
Да ладно, так то и я могу че угодно поломать;-)

Regards

Maxim
...
Рейтинг: 0 / 0
Ключи в ассоциативных коллекциях
    #39378062
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле, иногда эта разница молчаливо учитывалась
Например, в версиях ниже 11 установка событий требовала именно пустую строку, причем NULL принимался, но событие не выставлялось
Код: 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.
asv> sho user
USER is "SYSTEM"
asv> select sid, serial# from v$session where sid=sys_context('userenv', 'sid');

       SID    SERIAL#
---------- ----------
        18      11954

asv> exec sys.dbms_system.set_ev(18, 11954, 10046, 1, null)

PL/SQL procedure successfully completed.

asv> exec sys.dbms_system.set_ev(18, 11954, 10046, 0, null)

PL/SQL procedure successfully completed.

asv> exec sys.dbms_system.set_ev(18, 11954, 10046, 1, '')

PL/SQL procedure successfully completed.

asv> exec sys.dbms_system.set_ev(18, 11954, 10046, 0, '')

PL/SQL procedure successfully completed.

asv> select * from v$version where rownum=1;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
*** 2016-12-30 09:30:50.155
*** ACTION NAME:() 2016-12-30 09:30:50.154
*** MODULE NAME:(SQL*Plus) 2016-12-30 09:30:50.154
*** SERVICE NAME:(asv.xxx.ru) 2016-12-30 09:30:50.154
*** SESSION ID:(18.11954) 2016-12-30 09:30:50.154
=====================
PARSING IN CURSOR #4 len=61 dep=0 uid=5 oct=47 lid=5 tim=10246319682864 hv=2775961732 ad='899cf930'
BEGIN sys.dbms_system.set_ev(18, 11954, 10046, 0, ''); END;
END OF STMT
PARSE #4:c=10000,e=1977,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=10246319682859
EXEC #4:c=0,e=92,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=10246319683589
В 11.2 NULL работает
Код: plaintext
1.
2.
3.
4.
PARSING IN CURSOR #18446744071471996688 len=64 dep=0 uid=5 oct=47 lid=5 tim=10491929760278 hv=410768961 ad='3e3f58938' sqlid='669udu8c7rpk1'
BEGIN sys.dbms_system.set_ev(204, 16195, 10046, 0, null); END;
END OF STMT
PARSE #18446744071471996688:c=0,e=2120,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=10491929760275
EXEC #18446744071471996688:c=0,e=125,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=10491929766440
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ключи в ассоциативных коллекциях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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