Tabele wykorzystywane w przykładach

Podobne dokumenty
Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

PODSTAWY BAZ DANYCH 13. PL/SQL

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Bloki anonimowe w PL/SQL

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

PL/SQL. Zaawansowane tematy PL/SQL

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Oracle PL/SQL. Paweł Rajba.

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Bloki anonimowe w PL/SQL

SQL 4 Structured Query Lenguage

Język PL/SQL Procedury i funkcje składowane

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

W PostgreSQL mamy do dyspozycji nie tylko funkcje wbudowane, ale również możemy tworzyć własne. Są one zapisywane w tabeli systemowej pg_proc.

BAZA DANYCH SIECI HOTELI

Procedury i funkcje składowane

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Pakiety podprogramów Dynamiczny SQL

Składowane procedury i funkcje

Hurtownia Świętego Mikołaja projekt bazy danych

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

SQL :: Data Definition Language

CREATE TABLE autorzy ( id_autora SERIAL PRIMARY KEY, imie TEXT, nazwisko TEXT );

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Oracle PL/SQL. Paweł Rajba.

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Deklarowanie kursora

Język PL/SQL. Rozdział 2. Kursory

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Język SQL, zajęcia nr 1

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

Zaawansowane bazy danych i hurtownie danych semestr I

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Projekt-bazy danych Poczta

Baza danych hotel Maciej Gerus

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

1. ELEMENTY JĘZYKA PL/SQL

Wyzwalacze (triggery) Przykład

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Multimedialne bazy danych - laboratorium

BAZY DANYCH W APLIKACJACH SIECIOWYCH

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH

Systemowe aspekty baz danych

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

15. Funkcje i procedury składowane PL/SQL

Systemowe aspekty baz

Wykład 05 Bazy danych

Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

Bartosz Jachnik - Kino

Bazy danych. Plan wykładu. Złczenia tabel. Perspektywy cd. Wykład 9: Programowanie aplikacji baz danych po stronie serwera. Sekwencje Wyzwalacze

Monika Sychla Daniel Smolarek Projekt bazy danych

Bazy danych 8. Procedury składowane i kursory. P. F. Góra

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Język PL/SQL Wprowadzenie

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Projekt bazy danych. Schemat bazy danych. Opis bazy danych

PL/SQL. Zaawansowane tematy PL/SQL

Język PL/SQL. Rozdział 4. Procedury i funkcje składowane

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

1. Wyzwalacze BD (ang. triggers)

Bazy danych programowanie Wykład dla studentów matematyk

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

PL/SQL. Lidia Małkiewicz i Cezary Skubała

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Podprogramy. Rozdział 11 Procedury i funkcje składowane

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Plan wykładu BAZY DANYCH II WYKŁAD 9. Dynamiczny SQL. Dynamiczny SQL

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

11 marca Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

2 PL/SQL - podstawy Zmienne i stałe Operatory SQL w PL/SQL Instrukcje sterujące... 8

Zarządzanie bazą danych. Bazy Danych i Systemy informacyjne Wykład 4. Piotr Syga

Język PL/SQL Wprowadzenie

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Comarch ERP XL Business Intelligence Start. Migracja do wersji 2018

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

Ćwiczenia 2 IBM DB2 Data Studio

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Indeksy. Indeks typu B drzewo

Oracle11g: Programowanie w PL/SQL

Transkrypt:

Tabele wykorzystywane w przykładach create table departamenty( dep_id serial primary key, nazwa_departamentu text ); Tabele używane w wybranych przkładach create table pracownicy ( emp_id serial primary key, imie text, nazwisko text, pensja numeric, data_zatrudnienia date, dep_id integer references departamenty(dep_id) ); insert into departamenty values(1,'it'); insert into departamenty values(2,'dział sprzedaży'); insert into pracownicy values (1,'Jan','Kowalski',5500,current_date-1000,1); insert into pracownicy values (2,'Krzysztof','Nowak',4750,current_date-100,1); insert into pracownicy values (3,'Marek','Bobek',3200,current_date-22,1); insert into pracownicy values (4,'Grażyna','Typowa',1750,current_date-1500,2); insert into pracownicy values (5,'Anna','Zgrabna',1980,current_date-170,2); insert into pracownicy values (6,'Mirek','Typowy',1300,current_date-1100,2); insert into pracownicy values (7,'Halina','Przybyła',2100,current_date-760,2); Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 1/25

Bloki anonimowe DO DO LANGUAGE plpgsql; language 'plpgsql'; DO raise notice 'hello world'; LANGUAGE plpgsql; Do x integer:=60; raise notice 'x jest równe %',x; Najprostszy blok anonimowy Alternatywa z daniem LANGUAGE nie jest to wymagane Jak wyżej ale inna forma Prosty komunikat wypisywany na ekran Używanie zmiennych deklaracja i przypisanie wartości Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 2/25

x pracownicy.emp_id%type; Deklaracja zmiennej typu opartego o kolumnę tabeli x integer:=90; x integer:=60; raise notice 'x jest równe %',x; language plpgsql; x integer:=9; y integer:=8; z integer; z=x+y; raise notice 'z=%',z; language plpgsql; Blok zagnieżdżony Operacje arytmetyczne Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 3/25

x integer:=2; y integer:=3; z numeric; z:=x/y; raise notice '%',z; Automatyczna konwersja w tle. Porównaj wyniki z obu bloków. Różnica w typie danych wejściowych. x numeric:=2; y numeric:=3; z numeric; z:=x/y; raise notice '%',z; wynik numeric; select avg(pole1) into wynik from tabelka; raise notice 'wynik=%',wynik; wynik numeric; select avg(pole1) into wynik from tabelka; raise notice 'wynik=%',trunc(wynik); Wczytywanie wartości z bazy zmiennej typu prostego Stosowanie funkcji SQL na zmiennych w pl/pgsql Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 4/25

Typy złożone w pracownicy%rowtype; w pracownicy; create or replace function przyjmewiersza(w pracownicy) returns void as raise notice 'ok! '; language plpgsql; generyczny record; select * into generyczny from pracownicy where emp_id=1; raise notice '%',generyczny; create table tabelka ( pole1 integer, pole2 numeric, pole3 text ); Zmienna typu wierszowego Alternatywa powyższego (nie trzeba podawać %rowtype) Przyjmowanie zmiennej typu złożonego przez parametr. wersja (w pracownicy%rowtype) już nie przechodzi Typ złożony generyczny odpowiednik typu RECORD w Oracle. Ręczne przypisywanie wartości pól typu złożonego. Typ złożony oparty o buwę tabeli insert into tabelka values (1,1/3,'lorem ipsum'); select * from tabelka; Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 5/25

wiersz tabelka%rowtype; wiersz.pole1:=1; wiersz.pole2:=4/5; wiersz.pole3:='copacabana'; raise notice '% % %',wiersz.pole1,wiersz.pole2,wiersz.pole3; wiersz tabelka%rowtype; wiersz.pole1:=1; wiersz.pole2:=4/5; wiersz.pole3:='copacabana'; raise notice '%',wiersz; Wypisywanie zawartości całego wiersza. Zauważ że nie trzeba wypisywać wszystkich pól jak w Oracle. Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 6/25

Instrukcje warunkowe wzrost numeric:=1.76; masa numeric:=84; bmi numeric; bmi:=trunc(masa/power(wzrost,2),2); raise notice 'bmi=%',bmi; if(bmi<18.5) then raise notice 'niewaga'; elsif (bmi<25) then raise notice 'OK'; else raise notice 'grubo'; end if; x integer:=2; case x when 1 then raise notice 'x równe 1'; when 2 then raise notice 'x równe 2'; when 3 then raise notice 'x równe 3'; end case; x integer:=2; y integer:=10; case when x=1 then raise notice 'x równe 1'; when x=1 and y<10 then raise notice 'x równe 1 i y mniejsze od 10'; else raise notice 'coś innego'; end case; Instrukcja warunkowa IF. Jeśli warunek nie jest spełniony, sprawdzany jest kolejny. Instrukcja warunkowa CASE. Warunki oparte o wartości pojawiające się w zmiennej X. Instrukcja CASE. Różne warunki Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 7/25

x integer:=2; case x when 1,2,50 then raise notice 'x równe 1... albo 2... albo nie wiem...'; when 3 then raise notice 'x równe 3'; when 4 then raise notice 'x równe 4'; else raise notice 'coś innego'; end case; W PostgreSQL możemy rozdzielając przecinkiem wymienić kilka wartości dla zmiennej w warunku. Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 8/25

Pętle x integer:=1; loop raise notice '%',x; exit when x=10; x:=x+1; end loop; x integer:=1; loop raise notice '%',x; IF(X=10) THEN EXIT; END IF; x:=x+1; end loop; x integer:=1; while x<=10 loop raise notice '%',x; x:=x+1; end loop; for x in 1..10 loop raise notice '%',x; end loop; Pętla z użyciem klauzuli exit when Warunkowe wywołanie EXIT Pętla while. Pętla będzie się wykonywać tak długo jak długo prawdziwy jest warunek określony w klauzuli WHILE Pętla for. Wykona się 10 razy. Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 9/25

z1 integer:=1; z2 integer:=10; for x in z1..z2 loop raise notice '%',x; end loop; for x in reverse 10..1 loop raise notice '%',x; end loop; for x in 2..10 by 2 loop raise notice '%',x; end loop; DO DECLARE X INTEGER:=1; Y INTEGER:=1; BEGIN LOOP LOOP RAISE NOTICE 'Y=% X=%',Y,X; EXIT WHEN X=10; X:=X+1; END LOOP; X:=1; EXIT WHEN Y=10; Y:=Y+1; END LOOP; END; Pętla for z użyciem zmiennych jako punktów granicznych Pętla for z malejącym iteratorem. Zauważ że pobnie jak w Oracle wprowadzamy klauzulę REVERSE, jednak różnica polega na tym że tutaj jako pierwszą wartość graniczą podajemy tę większą. Pętla for z przeskakiwaniem o dwie wartości :) Pętle zagnieżdżone Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 10/25

x integer:=1; loop raise notice '%',x; exit when x=10; x:=x+1; continue when x<=5; raise notice 'hurra!'; end loop; Instrukcja CONTINUE z warunkiem od którego spełnienia zależy wykonanie następnych instrukcji Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 11/25

Wczytywanie danych z bazy i kursory wiersz tabelka%rowtype; select * into wiersz from tabelka; raise notice '%',wiersz; x integer:=3; wiersz pracownicy; select * into wiersz from pracownicy where emp_id=x; x integer:=30; wiersz pracownicy; select * into wiersz from pracownicy where emp_id=x; if not found then raise exception 'nie ma pracownika o id=%',x; end if; raise notice '%', wiersz; k1 refcursor; null; Wczytanie typu wierszowego danych z tabeli oczywiście musi to być jeden wiersz :) Wczytanie jednego wiersza z użyciem zmiennej w zapytaniu. Próba odczytania nieistniejącego wiersza. Wyjatku zadnego nie rzuca mimo ze nie ma takiego pracownika,ale mozna taki brak wyłapać i rzucić własnym wyjątkiem Deklaracja kursora dynamicznego takiego którego treść zapytania podajemy w czasie wykonania. Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 12/25

k2 cursor is select * from pracownicy; null; k3 cursor(x integer) is select * from pracownicy where dep_id=x; null; k refcursor; open k for select * from pracownicy; k refcursor; x integer:=2; open k for select * from pracownicy where dep_id=x; k refcursor; x integer:=2; open k for execute 'select * from pracownicy where dep_id=' x; Deklaracja kursora ze z góry zdefiniowanym zapytaniem. Deklaracja kursora ze z góry zdefiniowanym zapytaniem używającym parametru Otwarcie kursora dynamicznego Otwarcie kursora dynamicznego z użyciem zapytania z parametrem. Otwarcie kursora dynamicznego z dynamicznie tworzonym zapytaniem (kursor w SQL dynamicznym) Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 13/25

k refcursor; x integer:=2; open k for execute 'select * from pracownicy where dep_id=$1' using x; k2 cursor is select * from pracownicy; open k2; k2 cursor(x integer) is select * from pracownicy where dep_id=x; open k2(2); k1 cursor is select * from pracownicy; w pracownicy%rowtype; open k1; fetch k1 into w; raise notice '%',w; close k1; Otwarcie kursora dynamicznego z dynamicznie tworzonym zapytaniem z użyciem klauzuli using Otwarcie zwykłego kursora Otwarcie kursora sparametryzowanego Wczytanie jednego wiersza z kursora i wypisanie go na konsoli. Dla przyzwyczajonych PL/SQL w Oracle - nie działa taka konstrukcja jak k%rowtype. Alternatywnie można zmienną przeznaczoną na wiersz zdeklarować jako : w record; Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 14/25

k1 cursor is select * from pracownicy; w record; open k1; fetch k1 into w; raise notice '%',w; close k1; eid integer; imie text; nazwisko text; k1 cursor is select * From pracownicy; open k1; fetch k1 into eid,imie,nazwisko; raise notice '% % %',eid,imie,nazwisko; close k1; k1 cursor is select * from pracownicy; w pracownicy%rowtype; open k1; move k1; fetch k1 into w; raise notice '%',w; close k1; k1 cursor is select * from pracownicy; w pracownicy%rowtype; open k1; move forward 2 from k1; fetch k1 into w; raise notice '%',w; Zmienna przeznaczona przechowywania wiersza zdeklarowana jako niezdefiowany typ złożony. Odczyt takiej zmiennej. Wczytanie zawartości wiersza kolejnych zmiennych. Ciekawostka ilość podanych po into zmiennych nie musi odpowiadać ilości kolumn w zapytaniu wartości podawane są wg kolejności. Jeśli zmiennych będzie za mało to po prostu staniemy pierwsze X kolumn. Przesunięcie o jeden wiersz w kursorze bez jego odczytywania. Przesunięcie o wskazaną liczbę wierszy w kursorze bez ich odczytu. Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 15/25

close k1; k1 cursor is select * from pracownicy; w pracownicy%rowtype; open k1; move last from k1; fetch k1 into w; raise notice '%',w; close k1; k cursor is select * From pracownicy; w pracownicy%rowtype; open k; move first from k; fetch k into w; raise notice '%',w; close k; k1 cursor is select * from pracownicy; w pracownicy%rowtype; open k1; move forward 4 from k1; move forward -2 from k1; fetch k1 into w; raise notice '%',w; close k1; Przejście za ostatni wiersz kursora fetch zwraca pusty wiersz. Przesunięcie się pierwszego wiersza w kursorze. Przesunięcie się najpierw o 4 wiersze przodu, a następnie o 2 tyłu w kursorze. Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 16/25

Wyjątki x numeric; x:=1/0; exception when division_by_zero then raise notice 'nie można dzielić przez zero'; Wyłapywanie wystąpień wyjątków Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 17/25

Funkcje create or replace function nowa() returns numeric as return 2*7; language plpgsql; select nowa(); wynik integer; wynik:=dawaj10(); raise notice '%', wynik; create or replace function pirazydrzwi() returns numeric as 'select 3.14' language 'sql'; select pirazydrzwi(); create or replace function funkcjasql() returns numeric as 'select x from tujestliczba' language 'sql'; select funkcjasql(); create or replace function pomnoz(x numeric,y numeric) returns numeric as 'select x*y' language 'sql'; Najprostsza funkcja zwracająca liczbę (bez parametrów wejściowych). Końcówka language plpgsql musi się tutaj znajwać. Wywołanie funkcji bezparametrowej Wywołanie funkcji bezparametrowej z kodu plpgsql Funkcja będąca po prostu opakowaniem zapytania w SQL i jej wywołanie. Zwróć uwagę na language. Przykład zbliżony powyższego, wraz z wywołaniem. Tym razem dane pochodzą jednak z tabeli Funkcja będąca opakowaniem SQLowego wywołania będącego opakowaniem zwykłej operacji arytmetycznej :) select pomnoz(3,2); create or replace function podziel(numeric,numeric) returns numeric as 'select $1/$2' language 'sql'; Można też nie podawać nazw parametrów funkcji ale potem odnosimy się nich po kolejności patrz $1 i $2 select podziel(1,2); Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 18/25

create or replace function dajdox(y integer) returns integer as ' update manipulacji set x=x+y; select x from manipulacji; ' language 'sql'; select dajx(4); create or replace function zrobddl() returns integer as ' create table hello (x integer); select 1' language 'sql'; Funkcja może też zwracać wartość bezpośrednio z zapytania. Można też zaszyć operację DDL. select zrobddl(); create or replace function nic() returns void as '' language 'sql'; Funkcja może też tak jak w C zwracać NIC. Deklarujemy wtedy typ zwracany jako VOID select nic(); create or replace function nicniezwracam() returns void as raise notice 'a kuku'; language plpgsql; select nicniezwracam(); create or replace function srednie_zarobki() returns numeric as wynik numeric; select trunc(avg(pensja),2) into wynik from pracownicy; raise notice 'srednie zarobki w całej firmie = %',wynik; return wynik; language plpgsql; Nic nie zwracająca funkcja innym sposobem (zwróć uwagę na language). Funkcja bezparametrowa zwracająca średnią zarobków w calej firmie. select srednie_zarobki(); Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 19/25

create or replace function srednie_zarobki(did integer) returns numeric as wynik numeric; select trunc(avg(pensja),2) into wynik from pracownicy where dep_id=did; raise notice 'srednie zarobki w departamencie % = %',did,wynik; return wynik; language plpgsql; Funkcja z parametrem o nazwie takiej jak już istniejąca bezparametrowa. W PostgreSQL jest możliwe przeciążanie funkcji bez użycia pakietów (pakietów swoją drogą tutaj nie ma). select srednie_zarobki(); select srednie_zarobki(1); --przeciążanie jak widać jest możliwe select srednie_zarobki(2); select srednie_zarobki(3); -- null dla nieistniejącego departamentu create or replace function dawajwiersza(x integer) returns pracownicy as wiersz pracownicy%rowtype; select * into wiersz from pracownicy where emp_id=x; return wiersz; language plpgsql; select dawajwiersza(1); create function wynikzapytania() returns table (imie_nazwisko text,roczne_zarobki numeric) as return query select imie ' ' nazwisko,pensja*12 roczne from pracownicy; language plpgsql; Funkcja zwracająca typ złożony wersja z returns pracownicy %rowtype nie działa. Funkcja zwracająca tabelę (format nieco zbliżony jsona). select wynikzapytania(); Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 20/25

create or replace function parametr_zewnetrzny(x numeric,y out numeric) as y:=x*2; language plpgsql; create or replace function dawajpracownikow(did integer) returns setof pracownicy as w pracownicy%rowtype; for w in select * from pracownicy where dep_id=did order by pensja desc loop raise notice '%', w; return next w; end loop; return; language plpgsql; Parametr typu OUT w funkcji. Jeśli jest parametr out to nie musi być użyta klauzula returns w nagłówku deklaracji. Fukcja zwracająca zestaw wierszy działanie zbliżone funkcji strumieniowych w Oracle. Zwracane dane są w formacie zbliżonym JSONa select dawajpracownikow(1); Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 21/25

Dynamiczny SQL x integer; tab text:='pracownicy'; execute 'select count(*) from ' tab into x; raise notice 'x=%',x; x integer; tab text:='pracownicy'; did integer:=2; execute 'select count(*) from ' tab ' where dep_id=$1' into x using did; raise notice 'x=%',x; x integer; update pracownicy set pensja=pensja+100; get diagnostics x:=row_count; raise notice 'x=%',x; Najprostszy przykład z konkatenacją i wczytaniem wyniku zapytania zmiennej. Użycie klauzuli using podanie zmiennej. coś jak k%rowcount w Oracle Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 22/25

Wyzwalacze CREATE or replace FUNCTION podniesienie_pensji() RETURNS trigger AS BEGIN raise notice 'jeśli zmienia się departament to podnosimy pensję'; if(new.dep_id<>old.dep_id) then NEW.pensja:=old.pensja+100; raise notice '%',new; end if; RETURN NEW; END; LANGUAGE plpgsql; CREATE TRIGGER tzd BEFORE UPDATE ON pracownicy FOR EACH ROW EXECUTE PROCEDURE podniesienie_pensji(); CREATE TRIGGER tzd2 BEFORE UPDATE ON pracownicy EXECUTE PROCEDURE podniesienie_pensji(); drop trigger tzd on pracownicy; Deklaracja funkcji będącej podstawą dla wyzwalacza. Funkcja taka musi zwracać element typu wierszowego odpowiadającego buwą wierszowi tabeli na którą zakładamy wyzwalacz. Jeśli wyzwalacz wierszowy typu BEFORE zwróci null zamiast wiersza, operacja która uruchomiła wyzwalacz nie zostaje wykonana. Zmieniając cokowiek w zmiennej NEW zmieniamy w aktualizowanym lub dawanym wierszu. Założenie wyzwalacza wierszowego. Nie ma tutaj konstrukcji CREATE OR REPLACE (jak w Oracle). Wyzwalacze zarówno wierszowe jak i obiektowe mogą być zarówno BEFORE jak i AFTER. Założenie wyzwalacza obiektowego. Kasowanie wyzwalacza Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 23/25

INNE perform * from pracownicy; perform wywolaj_mnie(); DO DECLARE X INTEGER:=1; BEGIN RAISE NOTICE 'przed blokiem'; <<caly_blok>> RAISE NOTICE 'przed pętlą'; loop if(x=10) then exit caly_blok; end if; x:=x+1; end loop; RAISE NOTICE 'po pętli'; RAISE NOTICE 'po bloku'; END; copy (select * from pracownicy order by nazwisko) to 'c:\temp\pracownicy.csv'; wykonanie SQLa ale bez zwracania wyników - słowo PERFORM zamiast SELECT Wywołanie funkcji bez odbierania tego co zwraca (nawet jeśli coś zwraca, a nie musi) Wyskoczenie z zagnieżdżonego bloku Pisanie pliku Pisanie pliku ze zmianą rozdzielacza kolumn copy (select * from pracownicy order by nazwisko) to 'c:\temp\pracownicy.csv' with csv delimiter ';'; Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 24/25

copy (select * from pracownicy order by nazwisko) to 'c:\temp\pracownicy2.csv'; DO DECLARE X INTEGER:=60; BEGIN RAISE NOTICE 'HELLO WORLD'; --ZWYKŁY KOMUNIKAT RAISE NOTICE 'HELLO WORLD ZMIENNA=%',X; -- ZWYKŁY KOMUNIKAT ZE ZMIENNĄ RAISE 'OMG!'; -- RZUCENIE BŁĘDEM O WSKAZANYM KOMUNIKACIE. PRZERYWA WYKONYWANIE PROGRAMU --RAISE EXCEPTION 'NIE MA TAKIEGO ID --> %', X USING HINT = 'SPRAWDZ PODANE ID'; -- WYJĄTEK Z PODPOWIEDZIĄ. PRZERYWA WYKONYWANIE PROGRAMU RAISE NOTICE 'COSTAM DALEJ'; --ZWYKŁY KOMUNIKAT RAISE division_by_zero; RAISE 'Duplicate user ID: %', x USING ERRCODE = '23505'; END; Przykład pisania pliku z bloku kodu Różne rodzaje komunikatów Cheatsheet PLPGSQL v 1.0 PostgreSQL Andrzej Klusiewicz www.jsystems.pl 25/25