Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ключи в ассоциативных коллекциях / 19 сообщений из 19, страница 1 из 1
27.12.2016, 13:55
    #39376046
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ключи в ассоциативных коллекциях
Добрый день

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


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

вопросы: может ли быть ключ нулевым? Если да, то когда? А можно как-то сделать так, чтобы нельзя было задать нулевой ключ? Влияет ли на это тип ключа? Может, есть ещё какие-то важные моменты?
Есть ли где почитать документацию? Тут ничего не нашёл
...
Рейтинг: 0 / 0
27.12.2016, 17:33
    #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
28.12.2016, 06:28
    #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
28.12.2016, 06:29
    #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
28.12.2016, 09:33
    #39376564
VALUE_ERROR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ключи в ассоциативных коллекциях
[quot Вячеслав Любомудров]казусы возможны[src oracle]
Спасибо, забавно.

Удивило, что в соответствующей статье в 12.2 как-то еще более обтекаемо про нуллабельность индекса написано (если вообще написано, как-то сходу не нашел). Даже нет примеров, встречавшихся мне в экзамплах от 9.2 и ранее процитированного фрагмента описания. И value_erorr матчится в статье лишь единожды и немного не о том.
...
Рейтинг: 0 / 0
28.12.2016, 18:14
    #39377149
SY
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
28.12.2016, 18:42
    #39377159
SY
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
29.12.2016, 12:57
    #39377571
BuLet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ключи в ассоциативных коллекциях
Спасибо))
...
Рейтинг: 0 / 0
29.12.2016, 13:45
    #39377646
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ключи в ассоциативных коллекциях
DevGym: NULL Values and Zero Length Strings

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

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

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

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

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

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

SY.
ну и cast ему по всей морде, как только..
...
Рейтинг: 0 / 0
29.12.2016, 16:36
    #39377823
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ключи в ассоциативных коллекциях
SYК сожалению в REGEXP с NULL позицией CHAR возвращается самим oracle...Ээээээ... SQL? PL/SQL?
...
Рейтинг: 0 / 0
29.12.2016, 16:55
    #39377832
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ключи в ассоциативных коллекциях
...
Рейтинг: 0 / 0
29.12.2016, 17:21
    #39377848
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ключи в ассоциативных коллекциях
SYElicЭэээээ... SQL? PL/SQL?
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1244232&msg=20057887 Ага, понял. Но это, я бы сказал, слишком искусственный случай. В практике на такое наступить сложно. (Про быдлокодеров не скажу)
...
Рейтинг: 0 / 0
29.12.2016, 20:51
    #39377968
SY
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
29.12.2016, 21:02
    #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
30.12.2016, 02:45
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ключи в ассоциативных коллекциях / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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