| 👁 Logo języka PL/pgSQL Logo języka | |
| Pojawienie się | |
|---|---|
| Twórca |
Jan Wieck |
| Strona internetowa | |
PL/pgSQL jest językiem proceduralnym wspieranym przez RDBMS PostgreSQL. Język ten jest bardzo podobny do języka proceduralnego PL/SQL w bazie Oracle.
PL/pgSQL jest prawdziwym językiem programowania, o znacznie większych możliwościach niż język SQL, umożliwiającym m.in. stosowanie pętli i zaawansowanych struktur sterujących. Programy napisane w języku PL/pgSQL są funkcjami, które można stosować jako część polecenia SQL albo jako wyzwalacz.
Główne zalety języka PL/pgSQL:
- może być używany do tworzenia funkcji i wyzwalaczy,
- dodaje struktury sterujące do języka SQL,
- można wykonywać złożone obliczenia,
- dziedziczy wszystkie typy zdefiniowane przez użytkownika, funkcje i operatory,
- może zostać zdefiniowany jako zaufany dla serwera,
- jest łatwy w użyciu.
PL/pgSQL nie jest jedynym "PL" instalowanym domyślnie dla PostgreSQL, lecz dostępnych jest wiele innych, takich jak: PL/Java, PL/Perl, plPHP, PL/Python, PL/R, PL/Ruby, PL/sh, PL/Tcl.
Funkcje w PostgreSQL
[edytuj | edytuj kod]Polecenie CREATE FUNCTION
[edytuj | edytuj kod]Funkcje w PostgreSQL tworzone są za pomocą polecenia CREATE FUNCTION. Uproszczona składnia wygląda następująco:
CREATEFUNCTIONnazwa([rodzaj_argumentu][nazwa_argumentu]typ_argumentu[,...]) RETURNStyp_wyniku AS' definicja ' LANGUAGE'nazwa_języka'
Przykład
CREATEFUNCTIONsubt_one(int4)RETURNSINT4AS' BEGIN RETURN $1 -1; END; 'LANGUAGE'plpgsql';
W tym przypadku wykorzystano język PL/pgSQL. Jest to język specyficzny dla PostgreSQL, w innych bazach danych są dostępne podobne języki. W Oracle na przykład jest to PL/SQL, w Sybase Transact-SQL.
Dodanie języka PL/pgSQL do bazy danych
[edytuj | edytuj kod]Aby skorzystać z języka PL/pgSQL, należy samodzielnie zainstalować program obsługi. Ponieważ jest to dość skomplikowana operacja, w PostgreSQL umieszczono skrypt pomocniczy, składnia jest następująca:
createlang[opcje][nazwa_jezyka]nazwa_bazy_danych
Zwykły użytkownik nie ma prawa dodawać obsługi języka do bazy danych, dlatego zazwyczaj należy połączyć się jako supeużytkownik postgres, wtedy dodajemy przełącznik U z nazwą superużytkownika:
createlang-Upostgresplpgsqlbpfinal-L/usr/local/pgsql/lib
Usunięcie języka możliwe jest również tylko dla superużytkownika przez wpisanie w konsoli psql polecenia
DROPLANGUAGE'plpgsql';
W języku PL/pgSQL nie ma znaczenia wielkość liter w słowach kluczowych takich jak BEGIN oraz układ kodu. Możliwe jest również przeciążanie funkcji. Aby użyć znaku apostrofu w definicji funkcji należy poprzedzić go dodatkowym apostrofem.
CREATE FUNCTION jest tylko zapisem kodu funkcji, aby ją skompilować musi zostać wywołana, np. poprzez
SELECTnazwa_funkcji(argumenty)
lub
SELECT*FROMnazwa_funkcji(argumenty)
Pełniejsza składnia polecenia CREATE FUNCTION wygląda następująco:
Składnia CREATE FUNCTION
[edytuj | edytuj kod]CREATE[ORREPLACE]FUNCTIONnazwa([rodzaj_argumentu][nazwa_argumentu]typ_argumentu[{DEFAULT|=}wartość_domyślna}][,...]) [RETURNStyp_wyniku|RETURNSTABLE(nazwa_kolumnytyp_kolumny[,...])] AS‘ DECLARE --deklaracje zmiennych, skladnia: nazwa[CONSTANT]typ[NOTNULL][DEFAULT|:=wartość]; /* CONSTANT sprawia, że wartości zmiennej nie można zmieniać NOT NULL sprawia, że wartości zmiennej nie można przypisać wartości NULL np.: */ n1integer; BEGIN instrukcje--komentarz jednowierszowy /* komentarz wielowierszowy – zagnieżdżanie takich nie jest dozwolone. Po BEGIN można tworzyć nowe bloki, (zmienne mają zasięg w zadeklarowanym bloku): DECLARE zmienne BEGIN instrukcje END;*/ RETURN[wartość]--obowiązkowo funkcja musi zwracać wartość END; ‘LANGUAGE'plpgsql';
Typ zmiennej w sekcji DECLARE może być jednym z wbudowanych typów PostgreSQL, użytkownika lub odpowiadającym wierszowi w tabeli.
Usuwanie funkcji
[edytuj | edytuj kod]Funkcje usuwa się za pomocą polecenia DROP FUNCTION:
DROPFUNCTION[IFEXISTS]nazwa_funkcji[([typ_argumentu[,…]])],[,...][CASCADE|RESTRICT]
Przykład
DROPFUNCTIONsubt_one(int4);
Aliasy zmiennych
[edytuj | edytuj kod]Odwołania do parametrów, z którymi uruchomiono funkcję, realizuje się poprzez $1, $2 itd. Za pomocą deklaracji ALIAS można się do nich odwoływać za pomocą własnych zdefiniowanych nazw:
nazwaALIASFOR$n
Instrukcje warunkowe
[edytuj | edytuj kod]IF-THEN-ELSE
[edytuj | edytuj kod]IFwyrażenie THEN instrukcje–zagnieżdżaniedozwolone [ELSE instrukcje–zagnieżdżanierównieżdozwolone] ENDIF;
NULLIF
[edytuj | edytuj kod]NULLIF(wejście,wartość)
Funkcja ta zwraca wartość NULL, jeżeli wartością wyrażenie wejście=wartość jest TRUE, w innym przypadku zwraca wartość wejście.
CASE
[edytuj | edytuj kod]CASE WHENwyrażenie THENwyrażenie ELSEwyrażenie END;
Pętle
[edytuj | edytuj kod]WHILE
[edytuj | edytuj kod]WHILEwyrażenie LOOP instrukcje ENDLOOP;
FOR
[edytuj | edytuj kod]FORnazwaIN[REVERSE]od..do LOOP instrukcje ENDLOOP;
FORwierszINSELECT[treśćzapytania] LOOP instrukcje ENDLOOP;--pętla wykonuje się dla każdego wiersza zwróconego przez SELECT
Procedury wyzwalane
[edytuj | edytuj kod]Za pomocą procedury wyzwalanej (tzw. wyzwalacz, triger) można sprawić, że PostgreSQL wykona automatycznie procedurę zapisywaną w bazie danych, jeżeli dla określonej tabeli będą podjęte takie operacje jak INSERT, UPDATE oraz DELETE.
Aby wykorzystać procedurę wyzwalaną, najpierw należy zdefiniować procedurę, a następnie utworzyć sam wyzwalacz, który określa, kiedy procedura wyzwalana będzie wykonywana.
Tworzy się je za pomocą polecenia CREATE TRIGGER. Składnia:
Składnia
[edytuj | edytuj kod]CREATE[ORREPLACE]TRIGGERnazwa{BEFORE|AFTER} {INSERT|UPDATE|DELETE[OR...]} ONtabelaFOREACH{ROW|STATEMENT} EXECUTEPROCEDUREfunkcja(argumenty)
Innymi słowy:
Stwórz [lub zastąp] wyzwalacz nazwa, przed lub po
operacji {INSERT | UPDATE | DELETE} lub {INSERT | UPDATE | DELETE} lub …
na tabeli, dla każdego wiersza lub raz dla każdego wywołania aktualizacji,
i wykonaj procedurę.
Wewnątrz procedury wyzwalanej dostępne są specjalne zmienne, m.in.
new – rekord zawierający nowy wiersz bazy danych
old – rekord zawierający stary wiersz bazy danych
Zawierają one (dla wyzwalaczy typu ROW) dane z wierszy, których dotyczą te operacje aktualizacji, które spowodowały zadziałanie wyzwalacza. OLD zawiera dane sprzed aktualizacji, natomiast NEW zawiera dane po aktualizacji (lub proponowany wiersz dla wyzwalaczy typu BEFORE).
Usuwanie wyzwalacza
[edytuj | edytuj kod]Wyzwalacze usuwa się za pomocą polecenia DROP TRIGGER:
DROPTRIGGER[IFEXISTS]nazwa_triggeraONnazwa_tabeli[CASCADE|RESTRICT];
Bibliografia
[edytuj | edytuj kod]- Bazy danych i PostgreSQL od podstaw, R.Stones, N. Matthew, Wydawnictwo Helion 2002
Linki zewnętrzne
[edytuj | edytuj kod]
| 👁 Image |
Zobacz publikację Procedury składowane w PostgreSQL w Wikibooks |
| 1GL | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2GL/ Język drugiej generacji/ Asembler | |||||||||||||||
| 3GL / Język trzeciej generacji |
| ||||||||||||||
| 4GL/ Język czwartej generacji/ Język dziedzinowy |
| ||||||||||||||
| 5GL/Logiczne | |||||||||||||||
| Ezoteryczne | |||||||||||||||
| Inne |
