1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type Tworzenie:
Procedury i funkcje. Tworzenie:. CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body. proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
Procedury i funkcje
CREATE
PROCEDURE nazwa ([proc_parameter[,...]])
[characteristic ...] routine_body
CREATE
FUNCTION nazwa ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
Tworzenie:
2
CREATE PROCEDURE przecena(IN nazwa varchar (64))UPDATE nieruchomoscSET czynsz = czynsz*1.2WHERE miasto = nazwa;
Zrealizować procedurę, która będzie zwiększać płacę pracowników o wartość podaną przy wywołaniu jako dana wejściowa dla stanowiska też podanego przy wywołaniu.
CREATE PROCEDURE podwyzka(IN ile int(4), IN jaki varchar (15))UPDATE personelSET pensja = pensja+ileWHERE stanowisko = jaki;
CALL podwyzka(50, 'asystent');
6
Przykład procedury losującej uczniów do klas:
DELIMITER |
CREATE PROCEDURE UtworzUczniow(IN r INT, IN kl CHAR, IN chlopcy INT, IN dziewczynki INT)BEGIN DECLARE dz INT; DECLARE ch INT; DECLARE rdata DATE; CASE r WHEN 1 THEN SET rdata='1992-01-01'; WHEN 2 THEN SET rdata='1991-01-01'; WHEN 3 THEN SET rdata='1990-01-01'; ELSE SELECT 'ERROR - ZLY ROK'; END CASE;
7
SET dz=0; WHILE (dz < dziewczynki) DO INSERT INTO Uczniowie VALUES (0, (SELECT nazwisko FROM __Nazwiska ORDER BY rand() LIMIT 1), (SELECT imie FROM __Imiona WHERE plec='K' ORDER BY rand() LIMIT 1), (SELECT rdata - INTERVAL rand()*365+1 DAY),'K', (SELECT id_klasy FROM Klasy WHERE rok=r AND klasa=kl)); SET dz=dz+1; END WHILE;
8
SET ch=0; WHILE (ch < chlopcy) DO INSERT INTO Uczniowie VALUES (0, (SELECT nazwisko FROM __Nazwiska ORDER BY rand() LIMIT 1), (SELECT imie FROM __Imiona WHERE plec='M' ORDER BY rand() LIMIT 1), (SELECT rdata - INTERVAL rand()*365+1 DAY),'M', (SELECT id_klasy FROM Klasy WHERE rok=r AND klasa=kl)); SET ch=ch+1; END WHILE;END|
DELIMITER ;
9
Nazwiska:CREATE TABLE __Nazwiska (
id_nazwiska INT UNSIGNED NOT NULL auto_increment,nazwisko char(30) NOT NULL,UNIQUE id(id_nazwiska),PRIMARY KEY (id_nazwiska)
);
INSERT INTO __Nazwiska VALUES(0,'Ancypo'),(0,'Arciuch'),(0,'Awdziej'),(0,'Chwiedzko'),(0,'Cychowska'),(0,'Czaplejewicz'),(0,'Filonowicz'),(0,'Filon'),(0,'Kuzbiel'),(0,'Gryszkiewicz'),(0,'Jackiewicz'),(0,'Jurgiel'),(0,'Kazimierowicz'),(0,'Kostera'),(0,'Kostro'),(0,'Nowak'),(0,'Krawiel'),(0,'Krupowicz'),(0,'Mizer'),(0,'Mrozowicz'),(0,'Mucus'),(0,'Niedzwiedz'),(0,'Ostasiewicz'),(0,'Surowiec'),(0,'Anisko'),(0,'Antoniuk'),(0,'Borowik'),(0,'Chodziutko'),(0,'Gieniusz'),(0,'Grygucis'),(0,'Gryszko'),(0,'Jurgiel'),(0,'Karpowicz'),(0,'Kargul'),(0,'Pawlak'),(0,'Marcinkiewicz'),(0,'Miller'),(0,'Sidor'),(0,'Siemianczuk'),(0,'Misiukiewicz'),(0,'Szymczyk'),(0,'Taudul'),(0,'Zapolnik'),(0,'Klej'),(0,'Kucharewicz'),(0,'Chlus'),(0,'Cilulko'),(0,'Puszko'),(0,'Loszczyk'),(0,'Makarewicz'),(0,'Solniczek'),(0,'Szczesnowicz'),(0,'Szyszko'),(0,'Werda'),(0,'Sietejko'),(0,'Sawon'),(0,'Smola'),(0,'Sloma'),(0,'Sacharczuk'),(0,'Miszkin'),(0,'Baszko'),(0,'Bilkiewicz'),(0,'Czaplejewicz'),(0,'Osial'),(0,'Borys'),(0,'Salak'),(0,'Zajczyk'),(0,'Lazarewicz'),(0,'Rudnik'),(0,'Recko'),(0,'Szczesiul'),(0,'Luba'),(0,'Mroczko'),(0,'Abramowicz'),(0,'Beczko'),(0,'Bleczko'),(0,'Butkiewicz'),(0,'Daszkilewicz'),(0,'Galuzyn'),(0,'Gryc'),(0,'Gudel'),(0,'Toczko'),(0,'Malkiewicz'),(0,'Potapa'),(0,'Pupek'),(0,'Prycz'),(0,'Koleda'),(0,'Gniedziejko'),(0,'Juchniewicz'),(0,'Lengiewicz'),(0,'Turko'),(0,'Kulak'),(0,'Dudziuk'),(0,'Trochanowicz'),(0,'Stefanczuk'),(0,'Lopata'),(0,'Loskot'),(0,'Matuk'),(0,'Kijek'),(0,'Woronko'),(0,'Romanowicz'),(0,'Pylko'),(0,'Misarko'),(0,'Waluszko'),(0,'Toloczko'),(0,'Pigiel'),(0,'Stupak'),(0,'Zdanuk'),(0,'Mackiewicz'),(0,'Hecman')
;
10
Imiona:
CREATE TABLE __Imiona (id_imienia INT UNSIGNED NOT NULL auto_increment,imie char(20) NOT NULL,plec ENUM('K','M'),UNIQUE id(id_imienia),PRIMARY KEY (id_imienia)
);
INSERT INTO __Imiona VALUES(0,'Lukasz','M'),(0,'Piotr','M'),(0,'Raroslaw','M'),(0,'Jacek','M'),(0,'Andrzej','M'),(0,'Maciej','M'),(0,'Zbigniew','M'),(0,'Leszek','M'),(0,'Kamil','M'),(0,'Pawel','M'),(0,'Wojciech','M'),(0,'Bartosz','M'),(0,'Jakub','M'),(0,'Marcin','M'),(0,'Rafal','M'),(0,'Adam','M'),(0,'Daniel','M'),(0,'Robert','M'),(0,'Boromir','M'),(0,'Slawomir','M'),(0,'Mateusz','M'),(0,'Marek','M'),(0,'Przemyslaw','M'),(0,'Mariusz','M'),(0,'Grzegorz','M'),(0,'Marzena','K'),(0,'Sylwia','K'),(0,'Edyta','K'),(0,'Urszula','K'),(0,'Malgorzata','K'),(0,'Justyna','K'),(0,'Magdalena','K'),(0,'Agnieszka','K'),(0,'Joanna','K'),(0,'Anna','K'),(0,'Monika','K'),(0,'Ewa','K'),(0,'Paulina','K'),(0,'Marta','K'),(0,'Jolanta','K'),(0,'Katarzyna','K'),(0,'Natalia','K'),(0,'Agata','K'),(0,'Elzbieta','K'),(0,'Celina','K'),(0,'Beata','K'),(0,'Karolina','K'),(0,'Dorota','K'),(0,'Izabela','K'),(0,'Wioletta','K')
mysql> CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);Query OK, 0 rows affected (0.08 sec)
mysql> CREATE TABLE test4( -> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> b4 INT DEFAULT 0 -> );Query OK, 0 rows affected (0.08 sec)
17
mysql> DELIMITER |mysql> CREATE TRIGGER testref BEFORE INSERT ON test1 -> FOR EACH ROW BEGIN -> INSERT INTO test2 SET a2 = NEW.a1; -> DELETE FROM test3 WHERE a3 = NEW.a1; -> UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; -> END; -> |Query OK, 0 rows affected (0.08 sec)
Transakcje w systemach zarządzania bazą danych stanowi sekwencje powiązanych ze sobą instrukcji, które muszą być traktowane jak pojedyncza jednostka. Rozumiemy to tak, że albo wszystkie zadania wchodzące w skład transakcji zostaną wykonane, albo żadne z nich.
Transakcja jest niepodzielna, ponieważ przy równoczesnym dostępie do zasobów przez wielu użytkowników lub trwających procesach, w czasie awarii może dojść do niespójności bazy danych.
Ważną cechą transakcji jest to, że są one nie widoczne dla innych sesji jeżeli nie zostaną wykonane. Nikt nie może odczytać danych z tabel, jeżeli jesteśmy w czasie ich aktualizacji
25
MySQL oferuje transakcje zgodne z tzw. właściwościami ACID:
Atomicity ( niepodzielność) – nie ma możliwości podziału transakcji, albo wszystkie zmiany zostaną zachowane w bazie danych albo żadna z nich
Consistency (spójność) – oznacza, że operacje przekształcają bazę danych z jednego stanu prawidłowego w inny. Nie powinny być możliwe etapy, kiedy dane są niespójne.
Isolation (izolacja) – oznacza, że transakcje nie kolidują ze sobą, gdy są wykonywane. Każda transakcja powinna być wykonywana tak, jakby w danej chwili tylko ona mogła wykonywać operacje odczytu i aktualizacji.
Durability (trwałość) – oznacza, że po wykonaniu transakcji w bazie danych, efekty transakcji są stałe.
26
START TRANSACTION [WITH CONSISTENT SNAPSHOT] | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
Transakcje rozpoczynamy wydając polecenie START TRANSACTION lub jego synonimy BEGIN WORK oraz BEGIN. Zalecane jest używanie tej pierwszej postaci, gdyż jest ona zgodna z norma SQL-99.
27
MySQL może pracować w dwóch trybach. Pierwszy, zwany autocommit, powoduje, że każde wydawane polecenie jest traktowana jako transakcja. Oznacza to, ze wynik działania tego polecenia jest automatycznie zatwierdzany w bazie danych i nie ma możliwości jego wycofania.
Aby wyłączyć działanie trybu autocommit należy wydąć polecenie:
SET AUTOCOMMIT = 0;
Wówczas można samodzielnie wydawać polecenia START TRANSACTION, COMMIT oraz ROLLBACK. Pierwsze z nich rozpoczyna nową transakcje, drugie zatwierdza wszystkie zmiany wprowadzone w ramach bieżącej transakcji. Ostatnie natomiast polecenie wycofuje wszystkie zmiany wprowadzone w ramach bieżącej transakcji.
28
Przykład:mysql> CREATE TABLE test (id INT PRIMARY KEY) ENGINE = InnoDB;mysql> INSERT INTO test VALUES (1), (2);mysql> select * from test;+----+| id |+----+| 1 || 2 |+----+mysql> SET AUTOCOMMIT = 0;mysql> START TRANSACTION;mysql> UPDATE test SET id=10 WHERE id=1;mysql> UPDATE test SET id=20 WHERE id=2;mysql> SELECT * FROM test;+----+| id |+----+| 10 || 20 |+----+mysql> COMMIT;
29
Po wykonaniu instrukcji SET AUTOCOMMIT = 0, MySQL zakłada, ze od tej pory wszystkie transakcje będą przez użytkownika jawnie kończone poleceniem COMMIT. Należy o tym zawsze pamiętać, bo gdy o tym zapomnimy i zakończymy sesje (np. zamykając aplikacje kliencką), MySQL automatycznie wycofa wszystkie zmiany wprowadzone w czasie całej sesji!
Ponowny powrót do trybu autocommit spowoduje polecenie:
SET AUTOCOMMIT = 1;
Sprawdzamy jaki tryb zatwierdzania transakcji obowiązuje:
mysql> SET AUTOCOMMIT = 0;mysql> START TRANSACTION;
---------------| SESJA B |---------------
mysql> SELECT * FROM test;+------+| id |+------+| 1 |+------+
mysql> UPDATE test SET id = 2;
mysql> SELECT * FROM test;+------+| id |+------+| 1 |+------+
mysql> DELETE FROM test;
31
mysql> SELECT * FROM test;+------+| id |+------+| 1 |+------+mysql> UPDATE test SET id = 2;---------------------------- sesja zablokowana ----------------------------
mysql> ROLLBACK;
-------------------------- sesja ’puszcza’ --------------------------mysql> UPDATE test SET id = 2;Query OK, 1 row affected (2.13 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> SELECT * FROM test;+------+| id |+------+| 2 |+------+
32
Przykład z zakleszczeniem:mysql> DROP TABLE test;mysql> CREATE TABLE test (id INT PRIMARY KEY) ENGINE = InnoDB;mysql> INSERT INTO test VALUES
(1), (2);mysql> COMMIT;mysql> select * from test;+----+| id |+----+| 1 || 2 |+----+
---------------| SESJA A |---------------
---------------| SESJA B |---------------
mysql> SET AUTOCOMMIT = 0; mysql> SET AUTOCOMMIT = 0;
Metadane to dane o danych (definicja struktury danych), takie jak nazwa bazy danych lub tabeli, typ danych kolumny lub przywileje dostępu. Nazywany czasami słownikiem danych lub katalogiem systemowym.
INFORMATION_SCHEMA to ''baza informacyjna'', gdzie magazynuje się informacje o wszystkich bazach danych, które serwer MySQL utrzymuje. Zawiera kilka tabel (tymczasowych), które są tylko do odczytu.
Każdy użytkownik MySQL ma prawo dostępu do tych tabel, ale tylko do wierszy związanych z obiektami, do których użytkownik posiada właściwe przywileje dostępu.
Struktura tabel INFORMATION_SCHEMA stosuje się do standardu ANSI/ISO SQL:2003 część 11 ''Schematy''.
mysql> SELECT table_schema, table_name, table_type FROM information_schema.tables;+--------------------+---------------------------------------+-------------+| table_schema | table_name | table_type |+--------------------+---------------------------------------+-------------+| information_schema | CHARACTER_SETS | SYSTEM VIEW || information_schema | COLLATIONS | SYSTEM VIEW || information_schema | COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEM VIEW || information_schema | COLUMNS | SYSTEM VIEW || information_schema | COLUMN_PRIVILEGES | SYSTEM VIEW || information_schema | ENGINES | SYSTEM VIEW || information_schema | EVENTS | SYSTEM VIEW || information_schema | FILES | SYSTEM VIEW || information_schema | GLOBAL_STATUS | SYSTEM VIEW || information_schema | GLOBAL_VARIABLES | SYSTEM VIEW || information_schema | KEY_COLUMN_USAGE | SYSTEM VIEW || information_schema | PARTITIONS | SYSTEM VIEW || information_schema | PLUGINS | SYSTEM VIEW || information_schema | PROCESSLIST | SYSTEM VIEW || information_schema | REFERENTIAL_CONSTRAINTS | SYSTEM VIEW || information_schema | ROUTINES | SYSTEM VIEW || information_schema | SCHEMATA | SYSTEM VIEW || information_schema | SCHEMA_PRIVILEGES | SYSTEM VIEW || information_schema | SESSION_STATUS | SYSTEM VIEW |...
43
| information_schema | SESSION_VARIABLES | SYSTEM VIEW || information_schema | STATISTICS | SYSTEM VIEW || information_schema | TABLES | SYSTEM VIEW || information_schema | TABLE_CONSTRAINTS | SYSTEM VIEW || information_schema | TABLE_PRIVILEGES | SYSTEM VIEW || information_schema | TRIGGERS | SYSTEM VIEW || information_schema | USER_PRIVILEGES | SYSTEM VIEW || information_schema | VIEWS | SYSTEM VIEW || biuro | _10_dyrektorzy | VIEW || biuro | _10_full | VIEW || biuro | _11_biuro_b003 | VIEW || biuro | biuro | BASE TABLE || biuro | biuro2 | BASE TABLE || biuro | klient | BASE TABLE || biuro | nieruchomosc | BASE TABLE || biuro | nieruchomosc2 | BASE TABLE || biuro | personel | BASE TABLE || biuro | rejestracja | BASE TABLE || biuro | test1 | BASE TABLE || biuro | test2 | BASE TABLE || biuro | test3 | BASE TABLE || biuro | test4 | BASE TABLE || biuro | wizyta | BASE TABLE || biuro | wlasciciel | BASE TABLE || biuro | wynajecie | BASE TABLE |...
44
| mysql | columns_priv | BASE TABLE || mysql | db | BASE TABLE || mysql | event | BASE TABLE || mysql | func | BASE TABLE || mysql | general_log | BASE TABLE || mysql | help_category | BASE TABLE || mysql | help_keyword | BASE TABLE || mysql | help_relation | BASE TABLE || mysql | help_topic | BASE TABLE || mysql | host | BASE TABLE || mysql | plugin | BASE TABLE || mysql | proc | BASE TABLE || mysql | procs_priv | BASE TABLE || mysql | slow_log | BASE TABLE || mysql | tables_priv | BASE TABLE || mysql | time_zone | BASE TABLE || mysql | time_zone_leap_second | BASE TABLE || mysql | time_zone_name | BASE TABLE || mysql | time_zone_transition | BASE TABLE || mysql | time_zone_transition_type | BASE TABLE || mysql | user | BASE TABLE || mysql | user_info | BASE TABLE |+--------------------+--------------------------------------+-------------+
45
Informacje z komentarzami dla tabel bazy biuro:mysql> SELECT table_schema, table_name, table_comment FROM information_schema.tables WHERE TABLE_SCHEMA='biuro';+--------------+----------------+---------------+| TABLE_SCHEMA | TABLE_NAME | TABLE_COMMENT |+--------------+----------------+---------------+| biuro | _10_dyrektorzy | VIEW || biuro | _10_full | VIEW || biuro | _11_biuro_b003 | VIEW || biuro | biuro | || biuro | biuro2 | || biuro | klient | || biuro | nieruchomosc | || biuro | nieruchomosc2 | || biuro | personel | || biuro | rejestracja | || biuro | test1 | || biuro | test2 | || biuro | test3 | || biuro | test4 | || biuro | v1 | VIEW || biuro | v2 | VIEW || biuro | v3 | VIEW || biuro | wizyta | || biuro | wlasciciel | || biuro | wynajecie | |+--------------+----------------+---------------+20 rows in set (0.03 sec)
46
Informacje z komentarzami dla tabel bazy mysql:
mysql> select TABLE_SCHEMA, TABLE_NAME, TABLE_COMMENT from information_schema.tables WHERE TABLE_SCHEMA='mysql';+-------------+---------------------------+------------------------------+| TABLE_SCHEMA| TABLE_NAME | TABLE_COMMENT |+-------------+---------------------------+------------------------------+| mysql | columns_priv | Column privileges || mysql | db | Database privileges || mysql | func | User defined functions || mysql | help_category | help categories || mysql | help_keyword | help keywords || mysql | help_relation | keyword-topic relation || mysql | help_topic | help topics || mysql | host | Host privileges; Merged with
database privileges || mysql | proc | Stored Procedures || mysql | procs_priv | Procedure privileges || mysql | tables_priv | Table privileges || mysql | time_zone | Time zones || mysql | time_zone_leap_second | Leap seconds information for
time zones || mysql | time_zone_name | Time zone names || mysql | time_zone_transition | Time zone transitions || mysql | time_zone_transition_type | Time zone transition types || mysql | user | Users and global privileges |+-------------+---------------------------+------------------------------+