Mar 10

Krótko o funkcjach w MySQL

Tag: MySQLradmen @ 10:48

Podobnie jak PHP, C++, Java i masa innych języków programowania ma funkcje. Jak wiadomo mogą one posłużyć do wielu różnych rzeczy. W MySQL można je wykorzystać aby zwiększyć bezpieczeństwo. Zapisana funkcja/procedura może być bez problemu wywołana z poziomu PHP, ponieważ wystarczy wysłać zapytanie do bazy będące wywołaniem funkcji.
W dalszej części postaram się nieco opisać sposób tworzenia, oraz wykonywania funkcji.
Getting Started

Podczas korzystania z funkcji mogą wystąpić pewne problemy.
Jednym z ważniejszych jest znak średnika ‘;’, który jest wpisywany podczas tworzenia funkcji. Jest prosty sposób na obejście tego. Wystarczy, że w konsoli mysql wpiszemy “DELIMITER //”, co spokojnie pozwoli nam na zapisanie kodu. Natomiast znak średnika zastąpi ‘//’. Tak więc warto nie zapominać o tym, a na końcu warto wpisać “DELIMITER ;” tak aby średnik miał swoje dawne “znaczenie”.

Poza tym warto ustawić zmienna globalną log_bin_trust_function_creators na 1. Pozwoli to nam na zapisywanie funkcji. Możemy się do tego celu posłużyć poleceniem “SET GLOBAL log_bin_trust_function_creators = 1;“, które wpisujemy w konsoli mysql.

Na koniec dodam, że wygodnie jest pisać wszelkie funkcje w osobnym pliku *.sql, a później korzystać z polecenia “source nazwa_pliku” w konsoli mysql. Taki plik może, przykladowo, wyglądać tak:

delimiter //

CREATE FUNCTION nazwa () RETURNS VARCHAR(20)
BEGIN

RETURN ‘jakis napis’;

END

delimiter ;

Ogólna budowa funkcji jest bardzo prosta. Wygląda mniej więcej tak:

CREATE FUNCTION ( ) <nazwa> RETURNS <typ>
BEGIN

{ciało funkcji}

END

Prosty “Hello World”

To zacznijmy od oklepanego przykładu. Funkcja będzie (póki co) wypisywała napis “Hello World”. Najpierw przedstawię kod, oraz sposób wywołania funkcji, a potem postaram się opisać co i jak.

delimiter //

CREATE FUNCTION HelloWorld () RETURNS VARCHAR(20)
BEGIN

RETURN ‘Hello World’;

END

delimiter ;

Tak jak pisałem wcześniej, można ten kod zapisać do pliku, a później wczytać poleceniem “source”.
Wywołanie naszej funkcji polega na wpisaniu do konsoli mysql “SELECT HelloWorld();“. Efekt tego będzie taki:

mysql> select helloworld();
+————–+
| helloworld() |
+————–+
| Hello World |
+————–+
1 row in set (0.00 sec)

Funkcja zwraca już gotową wartość. Polecenie SELECT służy do wypisania wyników dalszych poleceń (gdy wpiszemy np. SELECT NOW() pokaże nam się aktualna data i godzina), także w tym wypadku wyświetli napis, który jest zwracany przez funkcję.

Mała dygresja

Jeżeli kod funkcji zapisujesz do pliku, a potem go ładujesz go, to dopisz na początku coś takiego: “DROP FUNCTION IF EXISTS HelloWorld;“. Służy to do kasowania funkcji HelloWorld() jeżeli istnieje. Ponieważ później w pliku jest ponowna deklaracja funkcji, to stara zostanie skasowana i od razy zastąpiona nową.

W innym wypadku, trzeba będzie ręcznie kasować funkcję zanim zadeklarujemy ją na nowo (to samo polecenie co wyżej). Jeśli tego nie zrobimy otrzymamy komunikat: “ERROR 1304 (42000): FUNCTION helloworld already exists

Zmienne

W naszej funkcji możemy deklarować zmienne. Ich deklaracja wygląda tak: “DECLARE nazwa_zmiennej typ_zmiennej“;

W naszym przykładzie możemy się posłużyć zmienną (np. jakis_napis), która będzie przechowywała wartość, która później będzie zwracana. Kod po zmianach wygląda tak:

DROP FUNCTION IF EXISTS HelloWorld;

delimiter //

CREATE FUNCTION HelloWorld () RETURNS VARCHAR(20)
BEGIN

DECLARE jakis_napis VARCHAR(20);
SET jakis_napis = ‘Hello World’;
RETURN jakis_napis;

END

delimiter ;

Oczywiście zmiennych może być więcej. Możemy również takiej zmiennej przypisać wartość domyślną. Aby to uczynić podczas deklaracji należy dopisać “DEFAULT ‘jakas wartosc’ “. Także można powyższy kod nieco zmodyfikować, tak aby zmiennej od razu była przypisana wartość, która będzie zwracana. W obu przypadkach wynik działania funkcji możemy sprawdzić w ten sam sposób, który został opisany wcześniej.

DROP FUNCTION IF EXISTS HelloWorld;

delimiter //

CREATE FUNCTION HelloWorld () RETURNS VARCHAR(20)
BEGIN
DECLARE jakis_napis VARCHAR(20) DEFAULT = ‘Hello World’;
RETURN jakis_napis;
END

delimiter ;

Parametry

Do funkcji również można wprowadzić parametr. Deklaracja tego parametru jest podczas tworzenia funkcji (podobnie robi się podczas tworzenia funkcji w innych językach programowania).

Deklaracja parametru następuje zaraz po podaniu nazwy funkcji (w nawiasach), czyli np: “CREATE FUNCTION ( parametr VARCHAR(20) ) RETURNS …”

Poniższy przykład pokaże stworzenie funkcji, która odczyta zmienna paramter podawaną przy woływaniu funkcji, oraz zwróci jej wartość.

DROP FUNCTION IF EXISTS HelloWorld;

delimiter //

CREATE FUNCTION HelloWorld (parametr VARCHAR(20)) RETURNS VARCHAR(20)
BEGIN

RETURN parametr;

END

delimiter ;

Przykład działania:

mysql> select HelloWorld(’zlo’);
+——————-+
| HelloWorld(’zlo’) |
+——————-+
| zlo |
+——————-+

1 row in set (0.00 sec)

Zapytania SQL w funkcjach

Jeszcze całkiem niedawno serwer MysQL nie pozwalał na wykonywanie zapytań SQL wewnątrz funkcji. Sytuacja się zmieniła, jednakże aby móc wykorzystywac te zapytania należy do deklaracji funkcji dopisać “READS SQL DATA“. Przyklad:

delimiter //
CREATE FUNCTION logowanie( username varchar(50), password varchar(50) ) RETURNS tinyint READS SQL DATA
BEGIN

RETURN ( SELECT COUNT(*) FROM users AS usr WHERE usr.username = username AND usr.password = password );

END

delimiter ;

Da end
Pierwotnie artykuł był dłuższy o opisanie procedur, jednakże ten temat był potrakowany trochę po macoszemu, dlatego postanowiłem zrezygnować z opisywania procedur.

One Response to “Krótko o funkcjach w MySQL”

  1. dooshek says:

    Chciałbym tylko zauważyć, że niestety większość firmy hostingowych w Polsce (np. home.pl, nazwa.pl, iq.pl) nie pozwalają na tworzenie SP (Stored Procedures) a wielka szkoda :( To samo dotyczy również widoków (views)

Leave a Reply