powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00001: нарушено ограничение уникальности
11 сообщений из 11, страница 1 из 1
ORA-00001: нарушено ограничение уникальности
    #39753761
blvckvtvnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем. С наступающим)
Есть 2 view. Мне нужно данные с одной переписывать в другую.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 CREATE OR REPLACE VIEW ZPL_BEL_V AS
SELECT '112' mandt,
        NVL (KOD,'0') KOD,
                NVL (CHETD,'0') CHETD,
                NVL (CHETK,'0') CHETK,
                NVL(SUM,'0')SUM,
                NVL(TO_CHAR(DATA, 'yyyymmdd'), '00000000') DATA
FROM sap_send.zpl_bel; 



В первой view 69 записей допустим за 10ый месяц. Во второй уже записаны 69 за тот же месяц + добавлены еще 31 за 11ый. Так вот есть некоторые совпадения по полю KOD в 11 месяце. Пример на рисунках.

Из за чего получаю ошибку: ORA-00001: нарушено ограничение уникальности.
Подскажите , что нужно делать и почему такая процедура не перезаписывает данные ?

Код: 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.
PROCEDURE zpl_bel(in_date IN DATE, err_msg OUT VARCHAR2,
                        exec_status OUT NUMBER) IS
    CURSOR zpl_bel_cur(v_idate_ DATE) IS
      SELECT s.*
        FROM zpl_bel_v s, sap_send.zpl_bel@asup.iron u
       WHERE s.ROWID = u.ROWID AND u.data = v_idate_;
  BEGIN
    FOR c IN zpl_bel_cur(in_date) LOOP
      BEGIN
        INSERT INTO sapsr3.ZMPOST_VO_V VALUES c;
      EXCEPTION
        WHEN DUP_VAL_ON_INDEX THEN
          UPDATE sapsr3.ZMPOST_VO_V
             SET ROW = c
           WHERE VOKOD = c.KOD AND DEBET = c.CHETD AND CREDIT = c.CHETK AND DATE_LOAD = c.DATA;
           COMMIT;
      END;
    END LOOP;
  EXCEPTION
    WHEN OTHERS THEN
      exec_status := cfg.c_status_error;
      err_msg     := SUBSTRB(SQLERRM, 1, 2048);
      ROLLBACK;
  END;
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #39753846
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
$ oerr ora 00001
00001, 00000, "unique constraint (%s.%s) violated"
// *Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
//         For Trusted Oracle configured in DBMS MAC mode, you may see
//         this message if a duplicate entry exists at a different level.
// *Action: Either remove the unique restriction or do not insert the key.


Oracle Doc PL/SQL Error Handling
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #39753925
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blvckvtvnv почему такая процедура не перезаписывает данные ?
Ангел-хранитель у тебя норм.
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #39754090
maverick2104
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри структуру таблицы sap_send.zpl_bel , какие поля имеют уникальность , потом посмотри на то что и куда твоя процедура инсертит и ты увидишь что такое значение в этом поле уже имеется . Это и означает нарушение ограничение уникальности.
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #39754229
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blvckvtvnv
Код: 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.
PROCEDURE zpl_bel(in_date IN DATE, err_msg OUT VARCHAR2,
                        exec_status OUT NUMBER) IS
    CURSOR zpl_bel_cur(v_idate_ DATE) IS
      SELECT s.*
        FROM zpl_bel_v s, sap_send.zpl_bel@asup.iron u
       WHERE s.ROWID = u.ROWID AND u.data = v_idate_;
  BEGIN
    FOR c IN zpl_bel_cur(in_date) LOOP
      BEGIN
        INSERT INTO sapsr3.ZMPOST_VO_V VALUES c;
      EXCEPTION
        WHEN DUP_VAL_ON_INDEX THEN
          UPDATE sapsr3.ZMPOST_VO_V
             SET ROW = c
           WHERE VOKOD = c.KOD AND DEBET = c.CHETD AND CREDIT = c.CHETK AND DATE_LOAD = c.DATA;
           COMMIT;
      END;
    END LOOP;
  EXCEPTION
    WHEN OTHERS THEN
      exec_status := cfg.c_status_error;
      err_msg     := SUBSTRB(SQLERRM, 1, 2048);
      ROLLBACK;
  END;



Однако ты и наваял, используй MERGE .
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #39754258
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flexgenиспользуй MERGE .от dup_val_on_index не избавляет.
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #39754297
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blvckvtvnv
Код: plsql
1.
2.
3.
4.
    CURSOR zpl_bel_cur(v_idate_ DATE) IS
      SELECT s.*
        FROM zpl_bel_v s, sap_send.zpl_bel@asup.iron u
===>       WHERE s.ROWID = u.ROWID AND u.data = v_idate_;


Уверены?
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #39754304
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousУверены?Может v_ это вовсе не вью, а синоним на таблицу за дблинком.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ORA-00001: нарушено ограничение уникальности
    #40076829
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тоже вопрос по ORA-00001: unique constraint violated применительно к Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production.

Есть таблица с уникальным ключом, состоящим из нескольких полей. Я туда добавлял записи, у которых одно из полей этого составного ключа было пусто (null). И это не вызывало ошибок. Потом почему-то это стало вызывать ошибку ORA-00001: unique constraint violated.

Я обсудил это с коллегами, и было выдвинуто 2 предположения:
1) Это работало потому что раньше была версия Oracle 18.3.
2) Это работало потому что раньше был включён какой-то настроечный параметр СУБД.

Действительно ли в Oracle есть настроечный параметр, который управляет появлением ошибки ORA-00001 для составных ключей, в том случае, если одно из полей этого составного ключа пусто (null)?
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #40076833
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic,

имхо, в табличке есть строка с таким ключом

зы
из фич гляньте ignore_row_on_dupkey_index

.....
stax
...
Рейтинг: 0 / 0
ORA-00001: нарушено ограничение уникальности
    #40076937
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic
У меня тоже вопрос по ORA-00001: unique constraint violated применительно к Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production.

Есть таблица с уникальным ключом, состоящим из нескольких полей. Я туда добавлял записи, у которых одно из полей этого составного ключа было пусто (null). И это не вызывало ошибок. Потом почему-то это стало вызывать ошибку ORA-00001: unique constraint violated.

Я обсудил это с коллегами, и было выдвинуто 2 предположения:
1) Это работало потому что раньше была версия Oracle 18.3.
2) Это работало потому что раньше был включён какой-то настроечный параметр СУБД.

Действительно ли в Oracle есть настроечный параметр, который управляет появлением ошибки ORA-00001 для составных ключей, в том случае, если одно из полей этого составного ключа пусто (null)?

Если вы добавляли одну запись с NULL в одном из полей, это не нарушало ограничение целостности UNIQUE
Но когда вы добавляете еще одну (вторую) такую запись, происходит нарушение.

Если все поля составного уникального ключа будут NULL таких строк можно внести сколько угодно,
поскольку в индексе, поддерживающем ограничение UNIQUE значения состоящие из одних 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
SQL> SET ECHO ON;
 
SQL> CREATE TABLE my_tab(
  2     id_1 NUMBER(3)
  3   , id_2 NUMBER(3)
  4   , txt VARCHAR2(30)
  5   , CONSTRAINT my_tab#U#id_1#id_2
  6        UNIQUE (id_1, id_2)
  7     )
  8  ;

Table MY_TAB created.

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(1, 1, 'Id_1=1, id_2 = 1');
1 row inserted.

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(2, NULL, 'Id_1=2, id_2 = NULL');
1 row inserted.

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(NULL, 3, 'Id_1=NULL, id_2 = 3');
1 row inserted.

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(NULL, NULL, 'Id_1=NULL, id_2 = NULL 1-st');
1 row inserted.

SQL> COMMIT;
Commit complete.

SQL> SELECT * FROM my_tab;

      ID_1       ID_2 TXT                           
---------- ---------- ------------------------------
         1          1 Id_1=1, id_2 = 1              
         2            Id_1=2, id_2 = NULL           
                    3 Id_1=NULL, id_2 = 3           
                      Id_1=NULL, id_2 = NULL 1-st   

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(NULL, NULL, 'Id_1=NULL, id_2 = NULL 2-nd');
1 row inserted.

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(NULL, NULL, 'Id_1=NULL, id_2 = NULL 3-rd');
1 row inserted.

SQL> COMMIT;
Commit complete.

SQL> SELECT * FROM my_tab;

      ID_1       ID_2 TXT                           
---------- ---------- ------------------------------
         1          1 Id_1=1, id_2 = 1              
         2            Id_1=2, id_2 = NULL           
                    3 Id_1=NULL, id_2 = 3           
                      Id_1=NULL, id_2 = NULL 1-st   
                      Id_1=NULL, id_2 = NULL 2-nd   
                      Id_1=NULL, id_2 = NULL 3-rd   
6 rows selected. 

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(2, NULL, 'Id_1=2, id_2 = NULL 2-nd');

Error starting at line : 30 in command -
INSERT INTO my_tab(id_1, id_2, txt) VALUES(2, NULL, 'Id_1=2, id_2 = NULL 2-nd')
Error report -
ORA-00001: unique constraint (MELCOMPRESS.MY_TAB#U#ID_1#ID_2) violated

SQL> INSERT INTO my_tab(id_1, id_2, txt) VALUES(NULL, 3, 'Id_1=NULL, id_2 = 3 2-nd');

Error starting at line : 31 in command -
INSERT INTO my_tab(id_1, id_2, txt) VALUES(NULL, 3, 'Id_1=NULL, id_2 = 3 2-nd')
Error report -
ORA-00001: unique constraint (MELCOMPRESS.MY_TAB#U#ID_1#ID_2) violated

SQL> COMMIT;
Commit complete.

SQL> SELECT * FROM my_tab;

      ID_1       ID_2 TXT                           
---------- ---------- ------------------------------
         1          1 Id_1=1, id_2 = 1              
         2            Id_1=2, id_2 = NULL           
                    3 Id_1=NULL, id_2 = 3           
                      Id_1=NULL, id_2 = NULL 1-st   
                      Id_1=NULL, id_2 = NULL 2-nd   
                      Id_1=NULL, id_2 = NULL 3-rd   
6 rows selected. 



Скрипт приложен.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00001: нарушено ограничение уникальности
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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