oracle sql, Procedura, wstawianie nowego wiersza

0

do stworzenia mam procedurę WstawNastpniaka na wejściu mam dane
pesel, imię, nazwisko, datę i miejsce urodzenia oraz pesel matki i ojca.
przy wpisywaniu nowej osoby sprawdzenie czy
podany peselu istnieje już w bazie jesli tak nie wstawiaj
istnieją podane pesele rodziców. Jeśli nie, nie wstawiaj osoby, tylko wypisz komunikat.

doszedłem do takiego momentu

create or replace PROCEDURE WSTAWNastepniaka 
                                        (
                                          p_Pesel IN Osoba.Pesel%TYPE,
                                          p_Imie IN Osoba.Imie%TYPE,
                                          p_Nazwisko IN Osoba.Nazwisko% TYPE,
                                          p_DataUrodzenia IN Osoba.Data_Urodzenia%TYPE,
                                          p_MiejsceUrodzenia IN Osoba.Miejsce_Urodzenia%TYPE,
                                          p_PeselMatki IN Osoba.Ojciec%TYPE,
                                          P_PeselOjca IN Osoba.Matka%TYPE,
                                          p_ErrorMessage OUT VARCHAR2
) is 
v_PESEL NUMBER(11);
v_PESEL 
SET p_PESEL:=Pesel;

BEGIN


INSERT INTO Osoba(PESEL, Imie, Nazwisko, Data_Urodzenia, Miejsce_Urodzenia, Ojciec, Matka)
VALUES(p_Pesel, p_Imie, p_Nazwisko, p_DataUrodzenia, p_MiejsceUrodzenia, p_PeselMatki,P_PeselOjca);
--cailo
COMMIT;
EXCEPTION
WHEN  V_PESEL THEN
      raise_application_error (-20001,'PESEL JUŻ ISTNIEJE');

END WSTAWNastepniaka;

i utknąłem, jakieś sugestie ?? rozumiem że wątek z peslem następnika jest dosyć prosty bo pesel jest kluczem głównym zatem każde wpisanie tej samej wartości powoduje wyrzucenie błędu.
nie wiem kompletnie gdzie wpisać i co wpisać aby nastąpił warunek sprawdzenia.

0

no pewnie zrobić select i zobaczyć czy dostaniesz wynik czy nie

0

Rozwijając myśl @abrakadaber możesz zrobić blok

begin 
  select 1 from Osoba where pesel =  p_Pesel; 
 exception 
    when no_data_found then 
      insert into ... 
end

jednak ja bym spróbował z funkcją https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606

0

Jeżeli masz index na kolumnach z peselem, wystarczy obsłużyć wyjatek.

create or replace PROCEDURE WSTAWNastepniaka 
                                        (
                                          p_Pesel IN Osoba.Pesel%TYPE,
                                          p_Imie IN Osoba.Imie%TYPE,
                                          p_Nazwisko IN Osoba.Nazwisko% TYPE,
                                          p_DataUrodzenia IN Osoba.Data_Urodzenia%TYPE,
                                          p_MiejsceUrodzenia IN Osoba.Miejsce_Urodzenia%TYPE,
                                          p_PeselMatki IN Osoba.Ojciec%TYPE,
                                          P_PeselOjca IN Osoba.Matka%TYPE,
                                          p_ErrorMessage OUT VARCHAR2
) is 

BEGIN

  INSERT INTO Osoba(PESEL, Imie, Nazwisko, Data_Urodzenia, Miejsce_Urodzenia, Ojciec, Matka)
  VALUES(p_Pesel, p_Imie, p_Nazwisko, p_DataUrodzenia, p_MiejsceUrodzenia, p_PeselMatki,P_PeselOjca);

EXCEPTION
WHEN  DUP_VAL_ON_INDEX THEN
      p_ErrorMessage := 'PESEL JUŻ ISTNIEJE';
      --raise_application_error (-20001,'PESEL JUŻ ISTNIEJE');

END WSTAWNastepniaka;
0

@woolfik:

  1. no_data_found nie zadziała bez into (chyba)
  2. bardziej chodziło mi o coś w ten deseń - oba pesele jednym zapytaniem select count(*) from osoba where pesel in (pesel_ojciec, pesel_matka) i sprawdzić czy zwróci 2.
  3. jak ma FK na polach z peselem matki i ojca to sprawa sama się rozwiązuje
  4. pesel nie jest unikalny :)
0
  1. pesel nie jest unikalny :)

+1 pesel nie za bardzo nadaje się na klucz główny. Co prawda w teorii powinien być unikalny ale co jeśli mamy obcokrajowca, który nie ma peselu ?, a nawet zakładając, że nie ma obcokrajowców - to 40-50 lat temu Pani w urzędzie wpisywała w urzędzie ręcznie z zaangażowaniem w pracę typową dla ówczesnych realiów :)

Dla osób imo najlepszym wyjściem jest klucz sztuczny, pesel może(ale nie musi) służyć jako deskryptor.

0

Dziękuje za pomoc
i
select count(*)
i
DUP_VAL_ON_INDEX

0

ale dlaczego Wielki Kaczor ??
jeszcze raz dzięki, w poprzednim poście nie byłem zalogowany

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