Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Procedura Sql
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
miszka_p
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
erix
Pomoc w napisaniu, czy napisanie?

Pokaż swoje próby.
miszka_p
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.


erix
Cytat
Pokaż swoje próby.
miszka_p
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'
phpion
Cytat(miszka_p @ 3.08.2010, 21:57:25 ) *
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 winksmiley.jpg
miszka_p
Cytat(phpion @ 3.08.2010, 22:56:43 ) *
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 winksmiley.jpg


problem tylko w tym, że nie wiem jak to zrobić :-(

Pls o pomoc :-(
prachwal
  1. declare @zmienna nvarchar(20)
  2. SET @zmienna = (SELECT pole FROM tabela)


lub

  1. declare @zmienna nvarchar(20)
  2. SELECT @zmienna =pole FROM tabela


jak kto woli
miszka_p
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
prachwal
ISNULL(@zmienna,'wartość w przypadku gdzy @zmienna jest Null')
miszka_p
Cytat(prachwal @ 6.08.2010, 14:19:48 ) *
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;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.