oracle SQL, procedura, select into, deklarowanie zmiennych

0

tworze procedurę PodajStworcow , parametr wejściowy pesel osoby, której Stworców chcemy znać.
Zadanie procedury to wypisywać na ekran imiona i nazwiska rodziców osoby o zadanym peselu.
dla danych wejściowych

screenshot-20170121120438.png

Stworzylem coś takiego

create or replace PROCEDURE podajStworcow
(
  p_Pesel IN Osoba.Pesel%TYPE,
  p_ImieOjca OUT Osoba.Ojciec%TYPE,
  p_ImieMatki OUT Osoba.Matka%TYPE,
  p_ImieImieOjca out Osoba.Imie%TYpe
) 
IS
v_PESELOjca char(11);
v_ImieOjca Varchar(20);
BEGIN
                                    --INSERT INTO Osoba(Pesel,ojciec,matka)
                                    --values (p_Pesel, p_ImieOjca, p_ImieMatki);
SELECT osoba.ojciec
Into v_PESELOjca
from Osoba 
Where 
osoba.pesel=p_PESEL; --AND p_Pesel=P_imieImieOjca;
IF v_PESELOJCA IS NOT NULL
THEN

/*SELECT osoba.Ojciec
INTO v_ImieOjca
FROM Osoba
Where 
osoba.imie=  osoba.ojciec;*/
DBMS_OUTPUT.PUT_LINE('imię i nazwisko ojca i matki osoby o PESLU nr' ||p_PESEL|| 'to'||v_PESELOjca||p_ImieImieOjca);
END IF;
COMMIT;
END podajStworcow;

co daje mi wynik

screenshot-20170121120613.png
i dalej nie wiem jak przekształcić pesel na imię i nazwisko

0

teraz próbuje z joinem bo daje mi to dobry wynik w zwykłym select-cie wyglada to tak

select a.imie as imieOjca, b.imie as ojciec
FROM osoba a
inner join osoba b on a.Ojciec=b.Pesel;

ale za nic w świecie nie wiem jak joina wstawić do procedury

0

i nie chodziło o żadne joiny w procedurze tylko o serie selectów

0

swoją dogą doszedłem że żeby zrobić joina z tej samej tabeli w procedurze należy użyć kursorów więc może jest alternatywne rozwiązanie

0

Zapewne już to zrobiłeś ale moja propozycja tej procedury to, oczywiście można się bawić, sprawdzać i wymyślać jakieś inne przypadki EXCE:

 CREATE OR REPLACE PROCEDURE podajstworcow(p_pesel        IN osoba.pesel%TYPE,
                                          p_imieojca     OUT osoba.ojciec%TYPE,
                                          p_imiematki    OUT osoba.matka%TYPE,
                                          p_imieimieojca OUT osoba.imie%TYPE) IS
    v_peselmatki VARCHAR2(11);
    v_peselojca VARCHAR2(11);

    ex_1 EXCEPTION;
    ex_2 EXCEPTION;
    ex_3 EXCEPTION;
BEGIN
    BEGIN
        SELECT os.ojciec, os.matka
          INTO v_peselojca, v_peselmatki
          FROM osoba os
         WHERE os.pesel = p_pesel;
    EXCEPTION
        WHEN OTHERS THEN
            RAISE ex_1;
    END;

    IF v_peselojca IS NOT NULL THEN
        --NULL kiedy ojciec nie jest znany 
        BEGIN
            SELECT os.imie
              INTO p_imieojca
              FROM osoba os
             WHERE os.pesel = v_peselojca;
        EXCEPTION
            WHEN OTHERS THEN
                RAISE ex_2;
        END;
    
    ELSE
        dbms_output.put_line('Brak informacji o ojcu');
    END IF;

    IF v_peselmatki IS NOT NULL THEN
        --NULL kiedy matka nie jest znana  
        BEGIN
            SELECT os.imie
              INTO p_imiematki
              FROM osoba os
             WHERE os.pesel = v_peselmatki;
        EXCEPTION
            WHEN OTHERS THEN
                RAISE ex_3;
        END;
    ELSE
        dbms_output.put_line('Brak informacji o matce');
    END IF;

    IF p_imieojca IS NOT NULL AND p_imiematki IS NOT NULL THEN
    
        dbms_output.put_line('Imię ojca i matki osoby o PESLU nr. ' || p_pesel || ' to ' ||
                             p_imieojca || p_imiematki);
    END IF;

EXCEPTION
    WHEN ex_1 THEN
        dbms_output.put_line('Błąd podczas pobrania danych ojca i matki dla osoby o nr PESEL ' ||
                             p_pesel || SQLCODE || SQLERRM);
    WHEN ex_2 THEN
        dbms_output.put_line('Błąd podczas pobrania danych ojca o nr PESEL ' || v_peselojca || SQLCODE || SQLERRM);
    WHEN ex_3 THEN
        dbms_output.put_line('Błąd podczas pobrania danych matki o nr PESEL ' || v_peselmatki || SQLCODE || SQLERRM);
    WHEN OTHERS THEN
        dbms_output.put_line('Błąd w procedurze podajstworcow: ' || SQLCODE || SQLERRM);
END podajstworcow;

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