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

Podobne dokumenty