Thursday, October 18, 2018

Funkcje


Funkcje to nazwane bloki kodu. Mogą ale nie muszą przyjmować parametry. Mogą ale nie muszą niczego zwracać. Może to być pewnym zaskoczeniem dla programistów Oracle - tu nie ma podziału na funkcje i procedury. Odpowiednikiem procedury jest funkcja która nic nie zwraca. Funkcje będą składowane w bazie danych.



Deklaracja i wywoływanie funkcji




Najprostsza funkcja której jedynym zadaniem będzie wyświetlenie komunikatu mogłaby wyglądać tak:

create or replace function sayhello() returns void as $$
begin
raise notice 'Hello my friend!';
end $$ language plpgsql;



Jak widzisz po słówku "returns" następuje deklaracja zwracanego przez funkcję typu danych, jeśli funkcja nic nie zwraca (czyli jest odpowiednikiem procedury w bazach Oracle) to piszemy "returns void". Zauważ że w samym kodzie funkcji nigdzie nie ma też zwrotu wartości z funkcji z użyciem klauzuli "return".



Wywołać tę funkcję możemy na jeden z dwóch sposobów (podobnie jak i każdą natywną funkcję w PostgreSQL). Albo z użyciem SELECT, albo wewnątrz kodu plpgsql z użyciem klauzuli "perform":



select sayhello();



do
$$
begin
perform sayhello();
end $$;




Parametry funkcji i zwracanie wartości




Zaczniemy od zwracania wartości przez funkcję. Jeśli chcemy by funkcja nam coś zwracała, po słówku returns w nagłówku podajemy zwracany typ danych.



create or replace function dawajliczbe() returns numeric as $$
begin
return 12;
end $$ language plpgsql;



Skoro zobligowałem się do zwrotu wartości typu numeric, to zobowiązanie muszę spełnić umieszczając w kodzie funkcji klauzulę "return" zwracającą zadeklarowaną wartość. Działanie tej funkcji sprowadza się do oddania nam liczby 12. Możemy tę funkcję wywołać selectem:





lub odbierając wartość zwracaną przez funkcję w innej funkcji lub bloku anonimowym:

do
$$
declare
x numeric;
begin
x:=dawajliczbe();
raise notice 'Dostałem %',x;
end $$;




Funkcje mogą przyjmować parametry. Nie wiąże się to w żaden sposób ze zwracaniem przez nie wyników - to są dwie niezależne sprawy. Jeśli chcemy by funkcja coś przyjęła, deklarujemy parametry w nawiasach po nazwie funkcji deklarując jednocześnie typ parametrów. W typ przypadku będą to dwa parametry liczbowe:


create or replace function dodaj(x numeric,y numeric) returns numeric as $$
declare
suma numeric;
begin
suma:=x+y;
return suma;
end $$ language plpgsql;


Przy wywołaniu funkcji musimy teraz podać wartości które trafią do parametrów:





Nasze funkcje podobnie jak funkcje natywne, możemy używać następnie w SQL. Poniżej zdeklarowałem funkcję która do wartości podanej przez parametr dolicza 23% podatek VAT:


create or replace function vat(netto numeric) returns numeric as $$
declare
brutto numeric;
begin
brutto:=netto*1.23;
return brutto;
end $$ language plpgsql;


Możemy podać wartość "z palca" jak poniżej...




... lub użyć do przetwarzania danych z tabeli:



No comments:

Post a Comment

Bezpłatny kurs PL/pgSQL by Andrzej Klusiewicz

Cześć  :) Oddaję w Wasze ręce wersję 1.0.0.0.0.(0) swojego tutoriala dotyczącego języka PL/pgSQL - czyli proceduralnego języka przetwarza...