Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 2. Előadás: Tárolt eljárások



Hasonló dokumentumok
Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 3. Előadás: Tárolt eljárások (folytatás) Nézetek

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Tranzakciókezelés PL/SQL-ben

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

Kliens oldali SQL-API

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

Java és web programozás

B I T M A N B I v: T M A N

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Szkriptnyelvek. 1. UNIX shell

Adatbázis Rendszerek II. 2. Gyakorló környezet

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Java és web programozás

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

Haladó DBMS ismeretek 1

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Database Systems II. ZH összefoglaló

AWK programozás, minták, vezérlési szerkezetek

B I T M A N B I v: T M A N

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Kalmár György Adatbázis alapú rendszerek

SQL. Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák

Adatbázis Rendszerek II. 4. Ea: MySQL Tárolt eljárások 110/1 B IT MAN

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

PL/SQL (folytatás) Kurzorok, függvények, eljárások

Készítette: Szabóné Nacsa Rozália

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

Bevezetés: az SQL-be

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Algoritmizálás és adatmodellezés tanítása 1. előadás

SQL DDL-2 (aktív elemek) triggerek

SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások

Adatbázis kezelés Delphiben. SQL lekérdezések

Adatbázisok elmélete 9. előadás

PL/SQL blokk. [címke] [DECLARE deklarációs utasítás(ok)] BEGIN végrehajtható utasítás(ok) [EXCEPTION kivételkezelő] END [név];

Adatbázisok elmélete 10. előadás

Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

SQL/PSM kurzorok rész

Adatbázisok. 2. gyakorlat SQL november november 12. Adatbázisok 1 / 31

Adatbázis-kezelés. Harmadik előadás

Adatbázis Rendszerek II. 8. Gyakorló környezet

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

AWK programozás, minták, vezérlési szerkezetek

Szkriptnyelvek II. Perl programok

Web-technológia PHP-vel

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

Programozás I. 5. Előadás: Függvények

Occam 1. Készítette: Szabó Éva

Adatbázisok elmélete 9. előadás

Java II. I A Java programozási nyelv alapelemei

A modell-ellenőrzés gyakorlata UPPAAL

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Pénzügyi algoritmusok

AWK programozás Bevezetés

Elemi alkalmazások fejlesztése IV.

SQL. 1.rész. 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1

Extrémen brutál, gyors talpaló PHP nyelvhez (database). v2.1

Készítette: Nagy Tibor István

A C# programozási nyelv alapjai

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE) október október 22. Adatbázisok 1 / 14

1. Jelölje meg az összes igaz állítást a következők közül!

Adatbáziskezelés php-ben MySQL adatbáziskezelı rendszert használva

B I T M A N B I v: T M A N

Az SQL adatbázisnyelv: DML

Adatbázis I. 11. előadás. Kulcsok az SQL ben. Hivatkozásépségi megszorítások és idegen kulcsok.

Adatbázisok webalkalmazásokban

BASH script programozás II. Vezérlési szerkezetek

Adatbázisban tárolt kollekciók

Az indexelés újdonságai Oracle Database 12c R1 és 12c R2

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 1. Előadás: Celko Joe tippjei Codd törvényei.

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

S z á m í t ó g é p e s a l a p i s m e r e t e k

3. Előadás. Az SQL adatbázisnyelv (Tartalom) Az SQL története. Az SQL felépítése. Adattípúsok. SQL utasítások

PHP-MySQL. Adatbázisok gyakorlat

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

Informatikai képzés Információs rendszerek dr. Hajas Csilla (ELTE IK)

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Adattípusok. Max. 2GByte

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Adatbázis rendszerek SQL nyomkövetés

Adattípusok. Max. 2GByte

Adatbázis használata PHP-ből

C programozási nyelv

Adatbázis tartalmának módosítása

Java II. I A Java programozási nyelv alapelemei

Adatbázis Rendszerek II. 6. PLSQL Triggerek 32/1B IT MAN

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Az SQL*Plus használata

Első lépések. File/New. A mentés helyét érdemes módosítani! Pl. Dokumentumok. Fájlnév: pl. Proba

Az SQL nyelv Structured Query Language (Struktúrált lekérdező nyelv)

Relációsémák létrehozása SQL nyelvben

Átírás:

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 2. Előadás: Tárolt eljárások 1

Tárolt eljárások MySQL-ben Tárolt eljárások definíciója Tárolt rutinok használata (eljárások és függvények) Tárolt rutinok szintaxisa Tárolt rutinok és MySQL privilégiumok Tárolt rutinok meta-adatai Tárolt eljárások, függvények, triggerek és LAST_INSERT_ID() 2

Tárolt eljárások definíciója Minden tárolt program tartalmaz egy törzs részt amelyik egy SQL utasítást tartalmaz. Ez az utasítás lehet egy összetett utasítás, amelyet több utasítás alkot, amelyeket pontosvessző (;) karakter választ el. Például, a következő tárolt eljárás egy BEGIN... END blokk között készült, amelyik tartalmaz egy SET utasítást és egy REPEAT ciklust, amelyik megint tartalmaz egy másik SET utasítást: 3

CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET @x = 0; REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; END Ugyanúgy, mint a triggerek esetében, ahhoz, hogy a pontosvesző (;) gondot okozhat, mert a mysql kliens utasítás határolójeleként ismeri fel. Ezért a határolójelet (delimiter) át kell neveznünk, hogy a mysql átadja a tárolt programdefiníciót a szervernek. Hogy újradefiniáljuk használjuk a delimiter parancsot. 4

delimiter // CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET @x = 0; REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; END delimiter ; mysql> CALL dorepeat(1000); mysql> SELECT @x; @x 1001 5

Függvény, amelyik egy belső függvényt hív meg CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!'); SELECT hello('world'); hello('world') Hello, world! 6

Tárolt rutinok szintaxisa Eljárás CREATE PROCEDURE Függvény CREATE FUNCTION Eljárás meghívása CALL segítségével Függvény meghívató egy utasítás belsejéből ugyanúgy, mint más függvény (felhasználva a függvény nevét) és skalár értéket kapunk Rutinok megszűntetése DROP PROCEDURE és DROP FUNCTION Módosítása ATER PROCEDURE és ALTER FUNCTION 7

Tárolt eljárás vagy függvény egy adatbázishoz van kapcsolva 1. Amikor egy rutin meghívásra kerül, egy implicit USE db_name végződik el (és visszaforog mikor a rutin befejeződik). USE utasítás a tárolt rutinok belsejében nem megengedett 2. Minősíthetjük a rutin neveket az adatbázis nevek használatával. Ezt használhatjuk, hogy vonatkoztassunk egy olyan rutinra, mely nem ehhez az adatbázisoz tartozik. Például, hogy meghívjunk egy tárolt p eljárást vagy f függvényt, amelyik a test adatbázisoz tartoznak, haszálhatjuk a CALL test.p() vagy test.f()-t. 3. Amikor az adatbázis törlődik, minden vele kapcsolatos rutin törlődik úgyszintén. 8

Tárolt függvények NEM lehetnek rekurzívak Tárolt eljárás lehet rekurzív, de alapértelmezetten ki van kapcsolva. Hogy jóváhagyjuk a rekurziót, állítsuk be a max_sp_recursion_depth szerver rendszerváltozót egy zérónál nagyobb értékre. Tárolt eljárás rekurzivitása megnöveli a szál veremméretét. Ha megnöveljük az értékét a max_sp_recursion_depth-nek, lehetséges, hogy szükséges megnövelni a szálak veremméretét, megnövelve a thread_stack értékét a szerver indításakor. 9

Többszörös SELECT az eljárás belsejében MySQL támogatja azt a nagyon hasznos kiterjesztést, amelyik megengedi, a normál SELECT utasítás használatát (kurzorok és lokális változók nékül) egy tárolt eljárás besejében. Az eredmény halmaza az ilyen lekérdezésnek egyszerűen el van küldve a kliensnek. Többszörös SELECT utasítás többszörös eredmény halmazt generál, tehát a kliensnek használnia kell azt a MySQL kliens könyvtárat, amelyik többszörös eredmény halmazt tud kezelni. Ez azt jelenti, hogy a MySQL verzió legalább 4.1.-es. A kliensnek ugyanakkor kell specifikálja a CLIENT_MULTI_RESULTS opciót miközben kapcsolatot teremt. A C programoknál, ezt el lehet érni a mysql_real_connect() C API függvénnyel. 10

Tárolt rutinok és MySQL privilégiumok A CREATE ROUTINE privilégium szükséges hogy tárolt rutinokat készítsünk Az ATER ROUTINE privilégium szükséges ahhoz, hogy módosítsunk vagy töröljünk tárolt eljárásokat. Ez a privilégium automatikusan meg van adva a rutin készítőjének ha szükséges és eldobva a készítőtől, mikor dobva van. Az EXECUTE privilégium szükséges hogy futtatni tudjunk tárolt rutinokat. Ez a privilégium automatikusan adott a rutin készítőjének ha szükséges. (és eldobódik mikor a rutin törlődik). Ugyanakkor, az alapértelmezett SQL SECURITY karakterisztikája egy rutinnak a DEFINER, amelyik megengedi azon felhasználóknak, akik elérhetik azt az adatbázist amelyhez kapcsolódik a rutin, hogy futtathassák. 11

Tárolt rutinok meta-adatai Lekérdezzük a ROUTINES táblát az INFORMATION_SCHEMA adatbázisból Használjuk a SHOW CREATE PROCEDURE és SHOW CREATE FUNCTION utasításokat hogy lássuk a rutin definciókat. Használjuk a SHOW PROCEDURE STATUS és a SHOW FUNCTION STATUS utasításokat, hogy lássuk a rutin karaterisztikát. 12

Tárolt eljárások, függvények, triggerek és LAST_INSERT_ID() LAST_INSERT_ID() (argumentum nélkül) visszaadja az első automatikusan generált értékét egy AUTO_INCREMENT oszlopnak, mint egy eredményét a legutolsó elvégzett INSERT utasításnak. Egy tárolt rutin törzsében (eljárás vagy fügvény) vagy egy triggerben, az LAST_INSERT_ID() értéke ugyanúgy változik, mint azon utasításoknál, melyek a törzsön kívül hajtóak végre. Ha egy tárolt eljárás végrehajt olyan utasításokat, amelyek megváltoztatják a LAST_INSERT_ID() értékét, a megváltozott értéket látják az elkövetkező utasítások, melyek következnek az eljárás meghívása után. A tárolt függvények és triggerek esetében ez az érték visszatöltődik amikor a függvény vagy a trigger befejezi működését, a következő utasítások nem látják már az újat. 13

BEGIN... END összetett szintaxis [begin_label:] BEGIN [statement_list] END [end_label] [statement_list] egy vagy több utasítás, elválasztva a (;)-vel [end_label] nem létezhet a [begin_label:] nélkül. Ha létezik [begin_label:] és [end_label], ugyanazok kell legyenek A cimkék maximum 16 karakteresek kell legyenek Cimkék használata engedélyezve van a LOOP, REPEAT és a WHILE utasításokban is 14

DECLARE szintaxisa Arra használjuk, hogy különböző adatot definiáljunk egy lokális programhoz: Lokális változók. Feltételek és kezelők (handlers) Kurzorok. DECLARE használata csak a BEGIN...END összetett utasítás belsejében megengedett és az elején kell legyen, más utasítások előtt. A nyilatkozatok be kell tartsanak bizonyos sorrendet. A kurzorokat a kezelők előtt kell deklarálni és a változókat és feltételeket a kurzorok és handlerek előtt. 15

Lokális változók deklarációja DECLARE var_name [, var_name]... type [DEFAULT value] Hogy alapértelmezett értéket adjunk a változóknak, használjuk a DEFAULT záradékot. Az érték lehet egy kifejezés, nem szükségszerűen konstans érték. Ha em használjuk a DEFAULT záradékot, a kezdő érték NULL. Helyi változók ugyanúgy vannak kezelve, mint tárolt rutinok paraméterei, figyelembe véve az adattípust és a túlcsordulást. Lokális változók nem érzékenyek a NAGYBETŰ/kisbetűre. A lokális változó hatóköre a BEGIN...END blokk, ahol deklarálva volt. A változókat, a deklarált blokk beágyazott blokkjában is használhatjuk, kivéve, ha ugyanazon a néven új változót deklaráluk a beágyazott blokkban. 16

Lokális változók beállítása (SET) SET var_name = expr [, var_name = expr]... A SET záradék a tárolt eljárásokban az általános SET záradék kiterjesztése. Minden var_name egy lokális változóra hivakozik egy tárolt programon belül, egy rendszer változó vagy egy felhasználó által definiált változó. A SET záradék a tárolt programokban a létező SET szintaxis részeként van implementálva. Ez megengedi egy kiterjesztett szintaxisát a SET a=x, b=y,... ahol különböző változó tipusok (lokálisan deklarált változók, globális és session rendszer változók, felhasználó-definiált változók) keveredhetnek. Ez megengedi a lokális változók kombinációit és néhány opciót, amelyik csak a rendszerváltozókra értelmezett; ebben az esetben az opciók felismerve lesznek, viszont mellőzve. 17

SELECT...INTO szintaxisa SELECT col_name [, col_name]... INTO var_name [, var_name]... table_expr Ez a szintaxis megengedi hogy a kiválasztott oszopokat direkt módon tárolhassuk változókban. Ha a lekérdezés nem ad vissza egy sort sem, egy figyelmeztető 1329 kóddal jelzi a hibát és a változó értékek nem változnak. Ha a lekérdezés több sort eredményez, egy más hibát jelez a rendszer. Ha lehetséges, hogy a lekérdezés több sort adjon vissza, hasznájuk a Limit 1 direktívát. Felhasználó nevek nem érzékenyek a betűagyságra. 18

A lokális változók hatásköre A lokális változó hatásköre azon BEGIN...END között van, ahol az deklaráltuk. Hivatkozni lehet ezekre beágyazott blokkokból is, kivéve, ha a blokkokban egy ugyanolyan nevű változót használunk. Lokális változók a tárolt eljárás végrehajtása során léteznek, előkészített utasítások nem használhatják, mivel ezek globálisak a kurrens sessionban és meghaladhatják a hatáskörüket. Például a SELECT... INTO local_var nem használható, mint előkészített utasítás. Lokális változóknak a nevei nem egyezhetnek meg az oszlopnevekkel. Ha egy SQL utasítás, mint a SELECT...INTO hivatkozik egy oszlopnévre, és egy ugyanolyan nevű lokális vátozóra, a MySQL a változó értékekén veszi figyelembe. 19

DECLARE a változókra DECLARE condition_name CONDITION FOR condition_value condition_value: SQLSTATE [VALUE] sqlstate_value mysql_error_code A DECLARE...CONDITION utasítás egy nevezett hibát definiál. Részletezi azon feltételeket, amelyek különleges bánásmódot kívánnak és megnevezi ezen feltételket. A nevet hasznáhatjuk egy DECLARE...CONDITION alszekvenciában. A condition_value lehet egy SQLSTATE érték (5 literál karater szting) vagy egy MySQL error kód. Ne használjuk a 00000 értéket vagy a 0 kódot, mert az pont az ellenkezője. 20

DECLARE a handlerekre DECLARE handler_type HANDLER FOR condition_value [, condition_value]... statement handler_type: CONTINUE EXIT UNDO condition_value: SQLSTATE [VALUE] sqlstate_value condition_name SQLWARNING NOT FOUND SQLEXCEPTION mysql_error_code 21

A DECLARE... HANDLER utasítás olyan handlereket specifikál, amelyik egyenként egy vagy több feltételt kezelnek. Ha egy ezen feltétlekből felbukkan, a hozzá tartozó statement végrehajtódik. Ez lehet egyszerű (pl. SET var_name = value) vagy összetett utasítás, amely BEGIN és END -et használ. Egy CONTINUE handlernél, a kurrens program futása folytatódik a handler utasítás befejezése után. Egy EXIT handler esetén befejeződik a futtatása a BEGIN...END összetett utasításnak, amelyben deklaráltuk a handlert. (Ez igaz akkor is, ha a feltételek egy belső blokkban léptek fel.) Az UNDO handler tipus nem támogatott ebben a verzióban. 22

Ha egy olyan feltétel lép fel, amire nem volt handler deklaráció, az alapértelmezett akció az EXIT. Egy condition_value a DECLARE... HANDLER valamelyik lehet a következőkből: Egy SQLSTATE érték (egy 5-karakteres sztring literál) vagy egy MySQL error kód (egy szám). Nem használható az SQLSTATE '00000' érték vagy a MySQL error kód 0, mivel ezek inkább a sikert jelképezik, mintsem egy hiba feltételt. Egy listát az SQLSTATE értékekről és a MySQL error kódokról megtalálható a Server Error Codes and Messages fejezetben. SQLWARNING egy rövidítése az egy olyan SQLSTATE osztálynak, amely '01 -el kezdődik. 23

NOT FOUND rövidítése azon SQLSTATE osztály értékeinek, amelyek a '02' kóddal kezdődnek. Ez csak abban az esetben releváns, ha kurzoraink vannak és akkor használjuk, mikor egy kurzor eléri az adathalmaz végét. Ha már nincs több elérhető sor, a No Data feltétel teljesül, amelynek az SQLSTATE értéke 02000. Hogy észleljük ezt a feltételt, be lehet állítani egy handlert (vagy egy NOT FOUND feltételnek). Egy példát láthatunk a Cursors fejezeben. Ez a feltétel megjelenik egy SELECT... INTO var_list utasításban amelyik nem ad vissza egy sort sem. SQLEXCEPTION egy rövdítése azon SQLSTATE osztály értékeinek, amelyek nem kezdődnek '00', '01', vagy '02' vel. 24

CREATE TABLE test.t (s1 INT, PRIMARY KEY (s1)); delimiter // CREATE PROCEDURE handlerdemo () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; INSERT INTO test.t VALUES (1); SET @x = 2; INSERT INTO test.t VALUES (1); SET @x = 3; END; // delimiter; CALL handlerdemo(); SELECT @x; 25

CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 3; retry: REPEAT BEGIN DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN ITERATE retry; # illegal END; END; IF i < 0 THEN LEAVE retry; # legal END IF; SET i = i - 1; UNTIL FALSE END REPEAT; END; 26

delimiter // CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 3; DECLARE done INT DEFAULT FALSE; retry: REPEAT BEGIN DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN SET done=true; END; END; IF NOT done AND i<0 THEN LEAVE retry; END IF; SET i=i-1; UNTIL FALSE END REPEAT; END; // delimiter; 27

Bibliográfia http://dev.mysql.com/doc/refman/5.1/en/sto red-programs-views.html 28