|
|
|
ORA-02309 atomic NULL violation
|
|||
|---|---|---|---|
|
#18+
существует таблица table в которой есть поле объектного типа my_type (тип имеет свои атрибуты attribute1, attribute2, attribute3) пытаюсь сделать update TABLE t set t.my_type.attribute1='строка' where t.id=10; оракл мне ругаеться ORA-02309 atomic NULL violation что я не правильно делаю, не могу понять... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 08:43 |
|
||
|
ORA-02309 atomic NULL violation
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 21:21 |
|
||
|
ORA-02309 atomic NULL violation
|
|||
|---|---|---|---|
|
#18+
Все оказалось банально просто, но черт возьми, я не нашел этого в документации по объектному типу... его необходимо ПРОИНИЦИАЛИЗИРОВАТЬ! дабы оракл его начал понимать... делаем шаманскую команду update TABLE t set t.my_type=MY_TYPE(NULL,NULL,NULL) where t.my_type IS NULL; и все, после этого все работет без проблем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 06:55 |
|
||
|
ORA-02309 atomic NULL violation
|
|||
|---|---|---|---|
|
#18+
Можно еще выпендриться с конструктором: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 10:36 |
|
||
|
ORA-02309 atomic NULL violation
|
|||
|---|---|---|---|
|
#18+
Не много не понял, служебное слово STATIC для чего???? Казань - брал Астрахань - брал MAP - брал ORDER - брал Static - не брал!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 11:19 |
|
||
|
ORA-02309 atomic NULL violation
|
|||
|---|---|---|---|
|
#18+
static - признак того, что это метод не экземпляра, а самого типа. Аналог static- методов в Java, в Delphi это называется class-методы. Ты имеешь право их вызывать, не создавая экземпляр типа/класса, что в данном случае и делается: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 11:30 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32123311&tid=1991401]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
139ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 466ms |

| 0 / 0 |
