powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-02309 atomic NULL violation
6 сообщений из 6, страница 1 из 1
ORA-02309 atomic NULL violation
    #32121676
Divan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
существует таблица 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
ORA-02309 atomic NULL violation
    #32122483
Solomon Yakobson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
ORA-02309 atomic NULL violation
    #32123311
Divan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все оказалось банально просто, но черт возьми, я не нашел этого в документации по объектному типу...
его необходимо ПРОИНИЦИАЛИЗИРОВАТЬ! дабы оракл его начал понимать...
делаем шаманскую команду
update TABLE t
set t.my_type=MY_TYPE(NULL,NULL,NULL)
where t.my_type IS NULL;

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

Код: 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
ORA-02309 atomic NULL violation
    #32123525
Divan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не много не понял, служебное слово STATIC для чего????

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

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

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


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