Jak definiujemy składowaną procedurę?
Aby móc zdefiniować procedurę w mysql trzeba posiadać odpowiednie przywileje (CREATE ROUTINE, ALTER ROUTINE, EXECUTE ). Jeśli nie posiadamy takich przywilejów (można to łatwo sprawdzić poleceniem SHOW GRANTS FOR 'user'@'localhost';) wówczas nie pozostaje nam nic innego jak udać sie do administratora bazy danych i poprosić o takie przywileje.
Może się zdarzyć również, że administrator wykona tylko odpowiednie polecenie GRANT jednak nie sprawdzi, czy mamy już prawo definiować własne procedury (tzn. czy przywileje które nam nadał poleceniem GRANT rzeczywiście zostały nam nadane). Może się bowiem okazać, że serwer baz danych MySQL w wersji 5.* nie był do tej pory wykorzystywany do definiowanie procedur i w bazie mysql nie ma odpowiednich tablic (a w szczególności tablicy proc). Należy wówczas uruchomić odpowiedni skrypt dostępny po instalacji MySQL, o nazwie mysql_fix_privilege_tables. Może go uruchomić zwykły użytkownik bazy danych, nie potrzebne są do wykonania tego skryptu uprawnienia administratora.
A zatem, przed wykonaniem skryptu mysql_fix_privilege_tables
shell> mysql -u root -p mysql mysql> SHOW TABLES; +-----------------+ | Tables_in_mysql | +-----------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-----------------+ 6 rows in set (0.00 sec) |
natomiast po wykonaniu skryptu mysql_fix_privilege_tables
shell> mysql -u root -p mysql mysql> SHOW TABLES; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | func | | help_category | | help_keyword | | help_relation | | help_topic | | host | | proc | | procs_priv | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ 17 rows in set (0.00 sec) |
Następnie administrator powinien nadać nam odpowiednie przywileje, o których była mowa wcześniej.
Ponieważ w dalszej części wykładu będę używał specjalnej bazy danych na potrzeby testowania definiowania procedur i funkcji i ich używania, dlatego w przykładzie poniżej najpierw jako administrator utworzę odpowiednią bazę danych dla tych celów a dopiero później nadam odpowiednie przywileje użytkownikowi user do dokonywania testów definiowania i używania procedur i funkcji w tej bazie danych.
shell> mysql -u root -p mysql> create database bank; Query OK, 1 row affected (0.00 sec) mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE ROUTINE, ALTER ROUTINE, EXECUTE, #!!! ON bank.* TO 'user'@'localhost' IDENTIFIED BY 'haslo'; Query OK, 0 rows affected (0.00 sec) mysql> SHOW GRANTS FOR 'user'@'localhost'; Grants for mate@localhost GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `bank`.* TO 'user'@'localhost' IDENTIFIED BY 'haslo' |
Po takiej interwencji administratora możemy być pewni, że możemy używać składowanych procedur i funkcji w bazie bank. Spróbujmy więc wykonać pierwszy najprostszy test. Na początek utworzymy tablicę, do której wstawimy wartość 5.
shell> mysql -u user -p bank mysql> show tables; Empty set (0.00 sec) mysql> CREATE TABLE tab (s1 INT); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO tab VALUES (5); Query OK, 1 row affected (0.00 sec) |
Nastepnie juz zdefiniujemy najprostszą procedurę. Potrzebny jednak do tego będzie jakiś charakterystyczny i unikalny ciąg znaków, który zapewni, że koniec procedury zostanie łatwo rozpoznany. Takim znakiem, który określa koniec wyrażenia jest normalnie średnik ';', jednak średnik nie może określać końca definicji procedury, gdyż występuje na końcu każdego wyrażenia SQL. Najczęściej stosuje się podwójny ukośnik '//'.
A zatem
mysql> DELIMITER // |
A następnie już definiujemy procedurę.
mysql> CREATE PROCEDURE p1 () SELECT * FROM tab; // Query OK, 0 rows affected (0.00 sec) |
Po takiej definicji procedury warto wrócić do powszechnie przyjętego i zestandaryzowanego znaku końca polecenia, którym jest ';'
mysql> DELIMITER ;// |
Jak widzimy, procedurę definiuje się używając polecenia CREATE PROCEDURE, po którym następuje nazwa procedury (tutaj p1), lista argumentów w nawiasach okrągłych, a następnie ciało procedury i na końcu znak kończący definicję procedury. Wielkość liter w nazwie procedury nie gra roli, zatem w naszym przykładzie p1 jest równoważne P1.
Nie można używać dwóch procedur o tej samej nazwie w tej samej bazie danych. Można używać notacji kropkowej przy definicji procedury, wskazując nazwę bazy danych, z którą związana jest procedura, np. bank.p1.
Ranga: Administrator serwisu Punktów: 0