Loading:


    Procedury oraz funkcje składowe - MySQL

    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.



    Dalsza czê¶æ: 1 2 3 4 5 6 7

    Napisz Artyku³






    Dodano przez: divix
    Ranga: Administrator serwisu Punktów: 0
    Komentarze użytkowników
      • Tre¶æ komentarza
        Kod do komentarza (opcjonalnie)
        PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
        Autor
        Token
        token

         

         








    funkcje.net
    Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-2025 v.1.5 | design: diviXdesign & rainbowcolors