Instrukcja Select
Transkrypt
Instrukcja Select
Bazy danych – zadania lista nr 10 Procedury przechowywane na serwerze Procedury przechowywane są obiektami bazy danych i są zapisywane w pliku bazy danych. Można tworzyć własne procedury, a także korzystać z procedur systemowych. 44. Procedury systemowe Wybrane procedury systemowe Procedura Opis sp_help wyświetla właściwości obiektów bazy danych sp_sphelpdb tworzy listę wszystkich baz danych przechowywanych na serwerze sp_helprotect wyświetla informacje o obiektach i pozwoleniach sp_lock zwraca informacje o blokadach sp_configure wyświetla lub zmienia globalne ustawienia konfiguracyjne sp_dboption wyświetla lub zmienia ustawienia konfiguracyjne bazy danych sp_rename służy do zmiany nazwy obiektu bazy danych EXEC sp_rename Stara_nazwa ','Nowa_nazwa' sp_renamedb zmienia nazwę bazy danych – operacji tej nie można wykonać w Enterprise Menagerze sp_who zwraca listę aktualnych połączeń z serwerem sp_depends zwraca listę procedur odwołujących się do tabeli lub widoku EXEC sp_depends nazwa_tabeli lub listę wszystkich obiektów, które pojawiają się w kodzie wskazanej procedury EXEC sp_depends nazwa_procedury sp_helptext wyświetla kod źródłowy procedury 45. Wykonywanie procedur Wywołanie procedury – to wpisanie jej nazwy i ewentualnych parametrów wejściowych i wyjściowych. Jeśli instrukcja wywołująca procedurę, nie jest pierwszą instrukcją we wsadzie, to przed jej nazwę należy umieścić słowo kluczowe EXECUTE lub jego skrót EXEC Przykład EXEC sp_helpdb 46. Tworzenie procedur CREATE PROCEDURE nazwa_procedury [lista_parametrów] AS instrukcje_procedury [RETURN] Przykład A Przygotowała: mgr Aneta Klaczyńska 1/1 Bazy danych – zadania lista nr 10 CREATE PROCEDURE WypiszOlejki AS SELECT * FROM Olejki RETURN GO EXEC WypiszOlejki Przykład B – wypisanie tresci procedury EXEC sp_helptext WypiszOlejki Przykład C – wypisanie do jakich tabel odwołuje się procedura EXEC sp_depends WypiszOlejki Przykład D – wypisanie informacji, które procedury odwołuja się do danej tabeli EXEC sp_depends Olejki 47. Modyfikacja, sprawdzenie czy procedura istnieje, usuwanie procedury Procedurę można modyfikować przy pomocy polecenia ALTER PROCEDURE, którego składnia jest identyczna jak CREATE PROCEDURE Przykład – Modyfikacja procedury WypiszOlejki ALTER PROCEDURE WypiszOlejki AS SELECT NazwaOlejku, Nazwalacinska FROM Olejki RETURN Usunięcie procedury dokonuje się poleceniem DROP PROCEDURE Przykład – Usunięcie procedury WypiszOlejki DROP PROCEDURE WypiszOlejki Sprawdzenie, czy obiekt istnieje: IF EXISTS (SELECT name FROM sysobjects WHERE name=’Nazwa’ and type=’Typ’) Przykład – Sprawdzenie czy procedura WypiszOlejki istnieje: IF EXISTS (SELECT name FROM sysobjects WHERE name='WypiszOlejki' and type='P') PRINT 'PROCEDURA ISTNIEJE' ELSE PRINT 'PROCEDURA NIE ISTNIEJE' 48. Parametry wejściowe – każdej procedurze przechowywanej na serwerze, można przekazywać parametry wejściowe. Nazwy parametrów obłożone są takimi samymi ograniczeniami jak zmienne lokalne (np. max 128 znaków razem ze znakiem @), każda procedura może przyjmować 2100 parametrów wejściowych CREATE PROCEDURE nazwa_procedury @parametr1 typ1, @parametr2 typ2,… AS instrukcje i operacje RETURN Przygotowała: mgr Aneta Klaczyńska 2/2 Bazy danych – zadania lista nr 10 Przykład – CREATE PROCEDURE WypiszOlejki @typ varchar(20) AS SELECT * FROM Olejki INNER JOIN RoslinyTypy ON Olejki.IDTypuRosliny=RoslinyTypy.IDTypuRosliny WHERE TypRosliny =@typ RETURN exec WypiszOlejki @typ='Drzewo' Każdemu parametrowi można nadać wartość domyślną i jeśli w wywołaniu procedury zostanie pominięty lub w miejscu jego wystąpienia będzie słowo kluczowe DEFAULT to SQL Server przypisze parametrowi właśnie taką wartość. Przykład – CREATE PROCEDURE WypiszOlejki @typ varchar(20)='%' AS SELECT * FROM Olejki inner join RoslinyTypy ON Olejki.IDTypuRosliny=RoslinyTypy.IDTypuRosliny WHERE TypRosliny return go exec WypiszOlejki exec WypiszOlejki DEFAULT exec WypiszOlejki @typ=DEFAULT like @typ W powyższym przykładzie zastosowano parametr jako maskę, dla wyszukiwania danych tekstowych w tabeli. W przypadku danych liczbowych np. typu integer występują pewne problemy. Załóżmy że stworzono tabele jak poniżej: CREATE TABLE TABELA ( NAZWA VARCHAR(10), LICZBA INT ) INSERT INTO TABELA VALUES('aLA',1) INSERT INTO TABELA VALUES('B',2) INSERT INTO TABELA VALUES('C',3) INSERT INTO TABELA (NAZWA)VALUES('D') INSERT INTO TABELA (NAZWA)VALUES('E') INSERT INTO TABELA (NAZWA)VALUES('F') Procedura z parametrem o wartości domyślnej NULL nie da oczekiwanych wyników CREATE PROCEDURE WYPISZ @LICZBA INT=NULL AS SELECT * FROM TABELA WHERE LICZBA=@LICZBA RETURN GO Przygotowała: mgr Aneta Klaczyńska 3/3 Bazy danych – zadania lista nr 10 EXEC WYPISZ Wywołanie powyższej procedury nie zwróci żadnych wierszy. W SQL SERVERZE DWIE WARTOŚCI NULL NIGDY NIE SĄ SOBIE RÓWNE! Problem ten można rozwiązać w następujący sposób: CREATE PROCEDURE WYPISZ @LICZBA INT=NULL AS IF @LICZBA IS NULL SELECT * FROM TABELA WHERE LICZBA IS NULL ELSE SELECT * FROM TABELA WHERE LICZBA=@LICZBA RETURN GO EXEC WYPISZ Problemem może być również sytuacja, gdy do procedury chcemy przekazać nazwę jakiegoś obiektu np. tabeli. Poniższa procedura będzie sygnalizowała błąd, gdyż parametr @tabela powinien być zadeklarowany jako zmienna tabelowa (patrz poprzednia lista nr 9) CREATE PROCEDURE Dane_z_dowolnej_tabeli AS SELECT * FROM @tabela RETURN @tabela varchar(20) Problem można również rozwiązać w następujący sposób: CREATE PROCEDURE Dane_z_dowolnej_tabeli AS EXEC ('SELECT * FROM '+@tabela) RETURN @tabela varchar(20) 49. Parametry wyjściowe – pozwalają na przekazanie znalezionej lub obliczonej wartości z powrotem do skryptu. Można do zrobić jeśli przy tworzeniu procedury i przy jej wywołaniu użyje się kluczowego słowo OUTPUT.W poniższym przykładzie zmienna @x przejmuje wartość wyliczoną w procedurze. CREATE PROCEDURE ObliczSredniaCene @srednia float OUTPUT AS SELECT @srednia= avg(Cena)FROM OlejkiCeny RETURN DECLARE @x float EXEC ObliczSredniaCene @x OUTPUT PRINT @x 50. Zagnieżdżanie procedur – procedury można zagnieżdżać do 32 poziomów – można dowolnie wywoływać jedną procedurę w drugiej. 51. Procedury rekurencyjne – procedury mogą być również rekurencyjne tzn. wywoływać same siebie aż do 32-go poziomu. Przygotowała: mgr Aneta Klaczyńska 4/4