Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка только уникальных записей / 7 сообщений из 7, страница 1 из 1
05.12.2020, 16:54
    #40024875
WНаталья
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка только уникальных записей
Есть экелька. Из нее импортирую в БД записи с помощью хранимой процедуры.
В эксельке пользователи могут дублировать записи. Такие вставлять не нужно.

Не могу разобраться , как переписать ХП, чтобы дубли не вставлялись.
Проверять на уникальность нужно только поле PATH.

При компиляции получаю ошибку
SQL Statement ignored
SQL command not properly ended



Код: 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.
create or replace PROCEDURE INSERT_NEW_VALUE
(
    i_ID NUMBER,
    i_PARENT NUMBER,
    i_TYPE_OF_NODE NUMBER,
    i_CAPTION VARCHAR2,
    i_CAP VARCHAR2,
    i_PATH VARCHAR2 --,

 

) AS
BEGIN

     INSERT INTO MAIN
     (ID,              
     PARENT,           
     TYPE_OF_NODE,     
     CAPTION,          
     CAP,              
     PATH             
     )

     VALUES (
      i_ID,
      i_PARENT,
      i_TYPE_OF_NODE,
      i_CAPTION,
      i_CAP,
      i_PATH
     )
     where not EXISTS (select path from main where path = i_PATH );   
     COMMIT;
END INSERT_NEW_VALUE;
...
Рейтинг: 0 / 0
05.12.2020, 17:16
    #40024878
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка только уникальных записей
WНаталья,

Код: 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.
create or replace PROCEDURE INSERT_NEW_VALUE
(
    i_ID NUMBER,
    i_PARENT NUMBER,
    i_TYPE_OF_NODE NUMBER,
    i_CAPTION VARCHAR2,
    i_CAP VARCHAR2,
    i_PATH VARCHAR2 --,

 

) AS
BEGIN

     INSERT INTO MAIN
     (ID,              
     PARENT,           
     TYPE_OF_NODE,     
     CAPTION,          
     CAP,              
     PATH             
     )
     SELECT      i_ID,
      i_PARENT,
      i_TYPE_OF_NODE,
      i_CAPTION,
      i_CAP,
      i_PATH
     FROM DUAL
     where not EXISTS (select path from main where path = i_PATH );   
     COMMIT;
END INSERT_NEW_VALUE;



SY.
...
Рейтинг: 0 / 0
05.12.2020, 17:23
    #40024880
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка только уникальных записей
Это нельзя так писать

where not EXISTS (select path from main where path = i_PATH )

нет такой конструкции в операторе INSERT.

Можно на MAIN создать уникальный ключ

Код: plsql
1.
ALTER TABLE MAIN ADD UNIQUE(PATH);



а в процедуре ловить и игнорировать исключения

Код: plsql
1.
2.
EXCEPTION
  WHEN dup_val_on_index then null;
...
Рейтинг: 0 / 0
05.12.2020, 19:53
    #40024915
WНаталья
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка только уникальных записей
mcureenab,

я думала. про уникальный ключ, но не пойдет.
админ БД не я, и таблица main уже имеет 1000 записей, и уникальный ключ по другому полю.

У меня же при вставке не должен совпадать именно path (древовидная структура)

Может до вставка выполнять выборки, искать запись = path
и если count таких записей = 0, то выполнять Insert
...
Рейтинг: 0 / 0
05.12.2020, 20:03
    #40024916
WНаталья
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка только уникальных записей
у думала сделать вставку в цикле , типа

Код: 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.
create or replace PROCEDURE INSERT_NEW_VALUE

(
    i_ID NUMBER,
    i_PARENT NUMBER,
    i_TYPE_OF_NODE NUMBER,
     i_CAPTION VARCHAR2,
     i_CAP VARCHAR2,
     i_PATH VARCHAR2

) AS
    i Number;
BEGIN
i := 0;
for main_table in (
select  ID, PARENT, TYPE_OF_NODE ,CAPTION, CAP, PATH
FROM main
where not EXISTS (select * from main where path = i_PATH )
) loop
     INSERT INTO MAIN
     (ID,              
     PARENT,           
     TYPE_OF_NODE,     
     CAPTION,          
     CAP,              
     PATH             
     )

     VALUES (
      i_ID,
      i_PARENT,
      i_TYPE_OF_NODE,
     i_CAPTION,
      i_CAP,
      i_PATH
     );
i := i+1;
  End Loop;
  COMMIT;

END INSERT_NEW_VALUE;




но получилась хрень. Вставилось овер 100500 одинаковых записей
...
Рейтинг: 0 / 0
05.12.2020, 21:30
    #40024939
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка только уникальных записей
WНаталья

но получилась хрень. Вставилось овер 100500 одинаковых записей


видать в табличке 100500 записей (for main_table in )

чем не устраивает 22243021 в однопользовательском режиме?

.....
stax
...
Рейтинг: 0 / 0
05.12.2020, 23:38
    #40024969
WНаталья
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка только уникальных записей
SY,

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


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