Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-02309 atomic NULL violation / 6 сообщений из 6, страница 1 из 1
18.03.2003, 08:43
    #32121676
Divan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-02309 atomic NULL violation
существует таблица table в которой есть поле объектного типа my_type (тип имеет свои атрибуты attribute1, attribute2, attribute3)

пытаюсь сделать

update TABLE t
set t.my_type.attribute1='строка'
where t.id=10;

оракл мне ругаеться
ORA-02309 atomic NULL violation

что я не правильно делаю, не могу понять...
...
Рейтинг: 0 / 0
18.03.2003, 21:21
    #32122483
Solomon Yakobson
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-02309 atomic NULL violation
It means column MY_TYPE in table T where ID=10 is NULL. Another words there is no object for ID=10. Therefore your update is asking to set attribute of an object that does not exist and Oracle spits out an error:

SQL> CREATE OR REPLACE
2 TYPE MY_TYPE
3 IS OBJECT(ATTRIBUTE1 VARCHAR2(10),ATTRIBUTE2 VARCHAR2(10),ATTRIBUTE3 VARCHAR2(10));
4 /

Type created.

SQL> CREATE TABLE T(ID NUMBER,MY_TYPE MY_TYPE)
2 /

Table created.

SQL> INSERT INTO T VALUES(1,MY_TYPE('A','B','C'))
2 /

1 row created.

SQL> INSERT INTO T(ID) VALUES(10);

1 row created.

SQL> COMMIT
2 /

Commit complete.

SQL> UPDATE T p SET p.MY_TYPE.ATTRIBUTE1 = 'X'
2 WHERE p.ID = 1
3 /

1 row updated.

SQL> UPDATE T p SET p.MY_TYPE.ATTRIBUTE1 = 'X'
2 WHERE p.ID = 10
3 /
UPDATE T p SET p.MY_TYPE.ATTRIBUTE1 = 'X'
*
ERROR at line 1:
ORA-02309: atomic NULL violation


What to do depends on your business requirements. If you do not want to update object attribute if object does not exists use:

SQL> UPDATE T p SET p.MY_TYPE.ATTRIBUTE1 = 'X'
2 WHERE p.ID = 10
3 AND p.my_type IS NOT NULL
4 /

0 rows updated.

If you want to update object attribute when object exists and create object when it does not exist you need to issue two updates:

SQL> DROP TABLE T;

Table dropped.

SQL> CREATE TABLE T(ID NUMBER,MY_TYPE MY_TYPE);

Table created.

SQL> INSERT INTO T VALUES(10,MY_TYPE('A','B','C'));

1 row created.

SQL> INSERT INTO T(ID) VALUES(10);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM T;

ID
-----------
MY_TYPE(ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3)
--------------------------------------------------------------------------------
10
MY_TYPE('A', 'B', 'C')

10



SQL> UPDATE T p SET p.MY_TYPE.ATTRIBUTE1 = 'X'
2 WHERE p.ID = 10
3 AND p.my_type IS NOT NULL;

1 row updated.

SQL> SELECT * FROM T;

ID
-----------
MY_TYPE(ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3)
--------------------------------------------------------------------------------
10
MY_TYPE('X', 'B', 'C')

10



SQL> UPDATE T p SET p.MY_TYPE = MY_TYPE('X',NULL,NULL)
2 WHERE p.ID = 10
3 AND p.my_type IS NULL;

1 row updated.

SQL> SELECT * FROM T;

ID
-----------
MY_TYPE(ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3)
--------------------------------------------------------------------------------
10
MY_TYPE('X', 'B', 'C')

10
MY_TYPE('X', NULL, NULL)


Solomon Yakobson.
...
Рейтинг: 0 / 0
20.03.2003, 06:55
    #32123311
Divan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-02309 atomic NULL violation
Все оказалось банально просто, но черт возьми, я не нашел этого в документации по объектному типу...
его необходимо ПРОИНИЦИАЛИЗИРОВАТЬ! дабы оракл его начал понимать...
делаем шаманскую команду
update TABLE t
set t.my_type=MY_TYPE(NULL,NULL,NULL)
where t.my_type IS NULL;

и все, после этого все работет без проблем
...
Рейтинг: 0 / 0
20.03.2003, 10:36
    #32123461
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-02309 atomic NULL violation
Можно еще выпендриться с конструктором:

Код: plaintext
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.
create or replace type o_mref as object (
  typ        number( 4 ),
  kod        number( 12 ),
  least_name varchar2( 250 ),
  full_name  varchar2( 250 ),

  static function get return o_mref
);
/

create or replace type body o_mref as
  static function get
  return o_mref
  is
  begin
    return o_mref(null, null, null, null);
  end open;
end;
/

declare
  o_m o_mref;
begin
  o_m := o_mref.get;
end;
/
...
Рейтинг: 0 / 0
20.03.2003, 11:19
    #32123525
Divan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-02309 atomic NULL violation
Не много не понял, служебное слово STATIC для чего????

Казань - брал
Астрахань - брал
MAP - брал
ORDER - брал

Static - не брал!!!
...
Рейтинг: 0 / 0
20.03.2003, 11:30
    #32123539
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-02309 atomic NULL violation
static - признак того, что это метод не экземпляра, а самого типа. Аналог static- методов в Java, в Delphi это называется class-методы. Ты имеешь право их вызывать, не создавая экземпляр типа/класса, что в данном случае и делается:

Код: plaintext
1.
o_m := o_mref.get;
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-02309 atomic NULL violation / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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