Dodawanie rekordów w pętli i sprawdzanie powtórzeń

0

Napisałem skrypt który dodaje mi rekordy ale chciałem dodać do tego warunek że doda mi rekord dopiero w przypadku jak nie ma powtórzeń w bazie

To poniżej mam w pętli
Mój warunek musi sprawdzić czy w tabeli TEST nie ma już w EMAIL i TEST_ID w tym samym rekordzie. Jeżeli występują razem w tym samym rekordzie to ma nie robić INSERTU


 INSERT INTO TEST (EMAIL_ID,EMAIL,TEST_ID ,OID,STATUS)
        VALUES (var_next_count ,c.email,d.test_id, GET_OID,'1');

BAZA ORACLE

2

unique constraint

ALTER TABLE TEST  ADD CONSTRAINT u_TEST  UNIQUE (EMAIL, TEST_ID );

lub indeks funkcyjny
http://www.dba-oracle.com/plsql/t_plsql_deterministic.htm

1

Twój komentarz do mojego poprzedniego posta mogę porównać do czegoś takieg:

Śniegu po pachy, auto nie jedzie, mówię Ci załóż łańcuchy, a ty mówisz, że nie chcesz. Inne rozwiązanie wykop drogę w śniegu, poukładaj bele na ziemi i śmigaj.

Jednak klient nasz pan. Tworzysz blok pl/sql (funkcja, procedura, pakiet co tam sobie chcesz lub zwykły blok pl/sql )

if not exists (select 1 from test where email = c.email and test_id =d.test_id) then
  INSERT INTO TEST (EMAIL_ID,EMAIL,TEST_ID ,OID,STATUS)
        VALUES (var_next_count ,c.email,d.test_id, GET_OID,'1');
0

@woolfik Sorki za nie precyzyjną odpowiedz. Prowałem już wcześniej dodac if not exists podobnie ale używając tego nie mogę odpalić w ogóle skryptu brak błędu. Używam DBeavera

3

Dobra to wróćmy do podstaw ...

Najpierw musisz nam powiedzieć skąd bierzesz c.email i d.test_id jak mniemam masz tam jakiś kursor po jakimś zapytaniu joinującym dwie tabele (wnioskuję po aliasach c i d) czyli coś takiego

for rec in (select c.email, d.test_id from tabelaA c join tabelaB d on c.id = d.c_id) loop
  if not exists (select 1 from test where email = rec.email and test_id =rec.test_id) then
  INSERT INTO TEST (EMAIL_ID,EMAIL,TEST_ID ,OID,STATUS)
        VALUES (var_next_count ,c.email,d.test_id, GET_OID,'1');
  else
    dbms_output.put_line('email: ' || rec.email || ' i test_id:' || rec.test_id||' już istnieją');
  end if;
end loop;

powinno Ci na konsoli wyrzucić czy dany email i test_id istnieje już w tabeli test

0

Trochę odkopię temat.

Normalnie to się robi klucz unikalny i obsługuje wyjątek na nim.

A w skryptach to robię tak (de facto warunek wewnątrz not exists też identyfikuje klucz unikalny, tylko niekoniecznie musi być on stworzony):

 INSERT INTO TEST t1 (EMAIL_ID,EMAIL,TEST_ID ,OID,STATUS)
 select var_next_count ,c.email,d.test_id, GET_OID,'1'
 from dual
 where not exists (select 1 from test t2 where t2.test_id = d.test_id and t2.email = c.email);

Jak taki rekord istnieje, to SELECT nic nie zwraca, zatem INSERT się nie wykona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1