![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 3.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
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) Z góry serdecznie dziękuję za odpowiedzi. Pozdrawiam |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Pomoc w napisaniu, czy napisanie?
Pokaż swoje próby. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 3.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Rzeczywiście trochę źle sformułowałem pierwsze zdanie . Moje próby przeróbek jakiś procedur znalezionych w necie skończyły na niczym. Jestem osobą początkującą w kwestii procedur, wyzwalaczy itp. i o ile wyciągnięcie danych zapytaniem sql lub napisanie prostej procedury typu dodanie danych nowego pracownika nie jest jakimś problemem to napisanie tej procedury wykracza poza moje możliwości. Z góry serdecznie dziękuję za pomoc Pozdrawiam. |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Pokaż swoje próby.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 3.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Poniżej umieszczam to co udało mi się napisać: Na poniższym przykładzie chcę na razie umieścić osoba_id w tabeli. Domyślam się, że umieszczenie przedmiot_id i ocena_id będzie wyglądało tak samo. CREATE PROCEDURE wstaw_ocene @nazwisko VARCHAR(30), @imie CHAR(15) AS DECLARE @osoba_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' ELSE --nie wiem jak tutaj pobrać osoba_id pracownika z wywołania oraz jak wstawić je do tabeli osoby_oceny SELECT @osoba_id from osoba INSERT INTO osoby_oceny (osoba_id) VALUES (@osoba_id) END; --exec wstaw_ocene 'Nowak', 'Jan' |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Poniżej umieszczam to co udało mi się napisać: No i od razu lepiej. Co do Twojego pytania: Cytat --nie wiem jak tutaj pobrać osoba_id pracownika z wywołania oraz jak wstawić je do tabeli osoby_oceny Polecałbym utworzyć zmienną wewnątrz procedury (np. user_id), do której przypiszesz ID użytkownika na podstawie imienia i nazwiska. Przydatna do tego będzie pewnie* konstrukcja SELECT INTO (chyba, że MS SQL Server umożliwia inne przypisanie wartości do zmiennej). * bo nie korzystam z MS SQL Server (IMG:style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 3.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
No i od razu lepiej. Co do Twojego pytania: Polecałbym utworzyć zmienną wewnątrz procedury (np. user_id), do której przypiszesz ID użytkownika na podstawie imienia i nazwiska. Przydatna do tego będzie pewnie* konstrukcja SELECT INTO (chyba, że MS SQL Server umożliwia inne przypisanie wartości do zmiennej). * bo nie korzystam z MS SQL Server (IMG:style_emoticons/default/winksmiley.jpg) problem tylko w tym, że nie wiem jak to zrobić :-( Pls o pomoc :-( |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 171 Pomógł: 18 Dołączył: 13.03.2009 Skąd: lublin Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 3.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
Serdecznie dziękuję za pomoc.
Chciałbym jednak jeszcze prosić o pomoc ponieważ małymi kroczkami "idę do przodu" (wstawianie jednej wartości np. osoba_id już mi wyszło) ale nie mogę teraz dodać przedmiot_id. ALTER PROCEDURE wstaw_ocene @nazwisko VARCHAR(30) ,@imie CHAR(15) --,@przedmiot_nazwa CHAR(15) AS DECLARE @osoba_id INT --,@przedmiot_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 INSERT INTO osoby_oceny (osoba_id) VALUES (@osoba_id) END; --jak dodać poniższe? Jak wstawiam w tej formie przez END to krzyczy komunikat, że osoba_id nie może być null i nic nie wstawia. IF NOT EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa) PRINT 'W bazie nie istnieje taki przedmiot' SELECT @przedmiot_nazwa = przedmiot_id FROM przedmioty INSERT INTO osoby_oceny (przedmiot_id) VALUES (@przedmiot_id) Z góry serdecznie dziękuję za odpowiedzi. Pozdrawiam |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 171 Pomógł: 18 Dołączył: 13.03.2009 Skąd: lublin Ostrzeżenie: (0%) ![]() ![]() |
ISNULL(@zmienna,'wartość w przypadku gdzy @zmienna jest Null')
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 3.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
ISNULL(@zmienna,'wartość w przypadku gdzy @zmienna jest Null') Ale id nie ma prawa być null bo w celach testów wpisuję nazwisko i imię osoby która istnieje w bazie. Zresztą jak próbuję tylko na pierwszej części procedury czyli wpisanie id osoby to działa, błędami sypie w chwili jak chcę sprawdzić i dodać jeszcze id przedmiotu. Domyślam się, że chodzi o "połączenie" pomiędzy IF-ami i nie wiem jak je zrobić. ALTER PROCEDURE wstaw_ocene @nazwisko VARCHAR(30) ,@imie CHAR(15) ,@przedmiot_nazwa CHAR(15) AS DECLARE @osoba_id INT ,@przedmiot_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 INSERT INTO osoby_oceny (osoba_id) VALUES (ISNULL(@osoba_id, 'BRAK ID OSOBY') -- ja za powyższym nawiasem wpiszę średnik to krzyczy błedem -- jak go usunę to krzyczy Incorrect syntax near 'IF' -- Jak to połączyć ? IF NOT EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa) PRINT 'W bazie nie istnieje taki przedmiot' SELECT @przedmiot_nazwa = przedmiot_id FROM przedmioty INSERT INTO osoby_oceny (przedmiot_id) VALUES (@przedmiot_id) END; Zmieniłem na 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 INSERT INTO osoby_oceny (osoba_id) VALUES (@osoba_id) IF EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa) SELECT @przedmiot_id = przedmiot_id FROM przedmioty INSERT INTO osoby_oceny (przedmiot_id) VALUES (@przedmiot_id) END; Procedura się wykonuje ale wstawia w osobny wiersz osoba_id a w osobny przedmiot_id (w celach ćwiczeniowych zdjąłem warunek z tych kolumn NOT NULL). Jak zrobić aby wstawiał je w jeden wiersz? Kolumny musza mieć warunek NOT NULL ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- kolejny update :-) Zmieniłem procedurę jak poniżej ale teraz 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; ---------------------------------------------------------------------------------------------------- Witam, Poniżej zamieszczam końcową wersję procedury. Za wszelkie wskazówki i pomoc serdecznie dziękuję. CREATE 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) 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; IF NOT EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa) BEGIN PRINT 'W bazie nie istnieje taki przedmiot' RETURN END SELECT @przedmiot_id = przedmiot_id FROM przedmioty WHERE nazwa = @przedmiot_nazwa; IF NOT EXISTS (SELECT 1 FROM oceny WHERE ocena = @ocena) BEGIN PRINT 'W bazie nie ma takiej oceny' RETURN END SELECT @ocena_id = ocena_id FROM oceny WHERE ocena = @ocena; INSERT INTO osoby_oceny (osoba_id, przedmiot_id, ocena_id) VALUES (@osoba_id, @przedmiot_id, @ocena_id); END; Ten post edytował miszka_p 9.08.2010, 21:16:19 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.09.2025 - 23:03 |