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:
$$
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:
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:
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