Michał P.

Michał P. Kierownik, AEGON
Towarzystwo
Ubezpieczeń na Życie
S.A.

Temat: Procedura wstawiająca dane z 3 tabel do 1 łączącej.

Witam,
Proszę o pomoc w napisaniu procedury w Sql.

Mam 4 tabele:
1.
osoba z kolumnami: osoba_id, nazwisko, imie

2.
oceny z kolumnami: ocena_id, ocena

3.
Przedmioty z kolumnami: przedmiot_id, nazwa

4.
osoby_oceny z kolumnami
Wpisy w tej tabeli są wpisami łączącymi 3 powyższe tabele czyli (osoba_id, przedmiot_id, ocena_id)

Chciałbym napisać procedurę która wstawiałaby mi te dane do tabeli sprawdzając wpisane w wywołaniu dane (nazwisko, nazwa przedmiotu, ocena) w poszczególnych tabelach i po sprawdzeniu ich istnienia do tabeli nr 4 wprowadziłaby wartości id tych parametrów.

Przykład wywołania:
Exec wstaw_ocene (Kowalski, Matematyka, 2,5)

Udało mi się napisać jak poniżej ale problem jest taki, że nie są brane pod uwagę parametry wpisane w wywołaniu tylko do tabeli osoby_oceny wstawiane są zawsze id ostanich wierszy z poszczególnych tabel.

ALTER PROCEDURE [dbo].[wstaw_ocene]
@nazwisko VARCHAR(30)
,@imie CHAR(15)
,@przedmiot_nazwa CHAR(15)
,@ocena char(3)
AS
DECLARE
@osoba_id INT
,@przedmiot_id INT
,@ocena_id INT
BEGIN
IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych'
SELECT @osoba_id = osoba_id FROM osoba

IF EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa)
SELECT @przedmiot_id = przedmiot_id FROM przedmioty

IF EXISTS (SELECT 1 FROM oceny WHERE ocena = @ocena)
SELECT @ocena_id = ocena_id FROM oceny

INSERT INTO osoby_oceny (osoba_id, przedmiot_id, ocena_id)
VALUES (@osoba_id, @przedmiot_id, @ocena_id)

END;

Z góry serdecznie dziękuję za pomoc.
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Procedura wstawiająca dane z 3 tabel do 1 łączącej.

Michał Paluch:
Udało mi się napisać jak poniżej ale problem jest taki, że nie są brane pod uwagę parametry wpisane w wywołaniu tylko do tabeli osoby_oceny wstawiane są zawsze id ostanich wierszy z poszczególnych tabel.

Bo SELECT robisz z całej tabeli, bez użycia WHERE.


IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych'
SELECT @osoba_id = osoba_id FROM osoba


a powinno być


IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych'
SELECT @osoba_id = osoba_id FROM osoba
WHERE nazwisko = @nazwisko AND imie = @imie


Co zresztą też nie będzie działać, ale komunikat błędu powinien być oczywisty ;)Bartosz Ślepowronski edytował(a) ten post dnia 07.08.10 o godzinie 00:43
Michał P.

Michał P. Kierownik, AEGON
Towarzystwo
Ubezpieczeń na Życie
S.A.

Temat: Procedura wstawiająca dane z 3 tabel do 1 łączącej.

Witam,

Zmodyfikowałem procedure jak poniżej:

BEGIN

IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych' SELECT @osoba_id = osoba_id FROM osoba
WHERE nazwisko = @nazwisko AND imie = @imie
IF EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa)
SELECT @przedmiot_id = przedmiot_id FROM przedmioty
WHERE nazwa = @przedmiot_nazwa
PRINT 'W bazie nie istnieje taki przedmiot'

IF EXISTS (SELECT 1 FROM oceny WHERE ocena = @ocena)
SELECT @ocena_id = ocena_id FROM oceny
WHERE ocena = @ocena
PRINT 'W bazie nie ma takiej oceny'

INSERT INTO osoby_oceny (osoba_id, przedmiot_id, ocena_id)
VALUES (@osoba_id, @przedmiot_id, @ocena_id)

END;

Teraz sprawdzane są wartości zadane w wywołaniu ale procedura nie jest przerywana jak np. nie ma w tabeli nazwiska z wywołania.
Wyświetlany jest PRINT ale do tabeli osoby_oceny dodawany jest rekord bez wartości w kolumnie osoba_id.

Jak zmienię wartości kolumn na NOT NULL - tak jak powinno być to mam komunikat, że nie może być null w osoba_id.

Jak zrobić aby po sprawdzeniu w tabeli osoby np. nazwiska i jego braku procedura była przerywana oraz tak samo przykolejnych paramatrach?

Dziękuję za pomoc
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Procedura wstawiająca dane z 3 tabel do 1 łączącej.

Michał Paluch:
Teraz sprawdzane są wartości zadane w wywołaniu ale procedura nie jest przerywana jak np. nie ma w tabeli nazwiska z wywołania.
Wyświetlany jest PRINT ale do tabeli osoby_oceny dodawany jest rekord bez wartości w kolumnie osoba_id.

No właśnie. Mogłem od razu napisać, ale po pierwsze było już bardzo późno a po drugie nie wszystko na raz ;)

W żadnym miejscu kodu nie napisałeś, co ma się dziać kiedy warunek jest spełniony + po IF wykonywana jest tylko pierwsza linijka kodu (lub precyzyjniej pierwszy statement) jesli nie wstawisz bloku BEGIN END. W przypadku twojego kodu:

IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych'
SELECT @osoba_id = osoba_id FROM osoba
WHERE nazwisko = @nazwisko AND imie = @imie

Jeśli nie istnieje taka osoba, to wykonywana jest pierwszy statement po IF (print) i potem cały kod leci normalnie. Czyli musiałbyś zrobić coś takiego:


IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
BEGIN
PRINT 'W bazie nie istnieje osoba o takich danych'
RETURN
END

SELECT @osoba_id = osoba_id FROM osoba
WHERE nazwisko = @nazwisko AND imie = @imie


RETURN zakonczy dzialanie procedury i cala reszta kodu juz sie nie wykona.Bartosz Ślepowronski edytował(a) ten post dnia 07.08.10 o godzinie 15:30
Michał P.

Michał P. Kierownik, AEGON
Towarzystwo
Ubezpieczeń na Życie
S.A.

Temat: Procedura wstawiająca dane z 3 tabel do 1 łączącej.

No i udało się.
Z RETURN działa tak jak powinno i w przypadku wpisania któregokolwiek nieistniejącego parametru z wywołania wyświetlany jest komunikat i procedura jest przerywana.

Serdecznie dziękuję za pomoc.
Pozdrawiam.

konto usunięte

Temat: Procedura wstawiająca dane z 3 tabel do 1 łączącej.

Michał Paluch:
No i udało się.
Z RETURN działa tak jak powinno i w przypadku wpisania któregokolwiek nieistniejącego parametru z wywołania wyświetlany jest komunikat i procedura jest przerywana.

Serdecznie dziękuję za pomoc.
Pozdrawiam.

IF warunek
BEGIN
-- segment przy spełnionym warunku
-- może mieć wiele linii
END

ELSE

BEGIN
-- segment przy niespełnionym warunku
-- może mieć wiele linii
END

Następna dyskusja:

how to: dane z 2ch tabel, n...




Wyślij zaproszenie do