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

Hasonló dokumentumok
Kalmár György Adatbázis alapú rendszerek

PL/SQL 1. rész. Procedural Language extension to SQL

Haladó DBMS ismeretek 1

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

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

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

Tranzakciókezelés PL/SQL-ben

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

PL/SQL feladatok 8. gyakorlat

Együttes hozzárendelés

Adatbázis Rendszerek II. 4. PLSQL Kurzorok, hibakezelés 53/1B IT MAN

Összefoglaló. <variable_name> [IN OUT IN OUT] <data_type> [:=<default_value>] ... <label_name>: <statements>... GOTO <label_name>;...

A trigger egy aktualizálási művelet esetén végrehajtandó programrészletet definiál. Alakja:

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];

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

Adatbázis használat I. 2. gyakorlat

Adatbázisok-I. előadás dr. Hajas Csilla (ELTE IK)

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

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

Adatbázis alapú rendszerek (2015 tavaszi félév) Előadás

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

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

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A 1-1

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

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

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

Adatbázisban tárolt kollekciók

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

8-9.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)

Database Systems II. ZH összefoglaló

LBRA6i integrált rendszer

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

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

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

Adatbázis használat I. 5. gyakorlat

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

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

Adatbázis alapú rendszerek (2016 tavaszi félév) Előadás

Triggerek. Olyan névvel ellátott adatbázisobjektumok, amelyek eseményorientált feldolgozást tesznek lehetővé

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének 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

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

Adatbázisok-1 előadás Előadó: dr. Hajas Csilla

Informatika terméktervezőknek

Java és web programozás

Programozási nyelvek (ADA)

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

Tankönyvben: SQL/PSM Gyakorlaton: Oracle PL/SQL

ADATBÁZIS HASZNÁLAT I. 4. gyakorlat

ADATBÁZISOK gyakorlat: SQL 2. rész SELECT

ADATBÁZIS ALAPÚ RENDSZEREK

Bevezetés: az SQL-be

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

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

SQL/PSM kurzorok rész

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

Kivételkezelés 2. SQLCODE lehetséges értékei:

Adatbázis Rendszerek II. 3. PLSQL alapok 92/1B IT MAN

Debreceni Egyetem Informatikai Kar TANULÓI NYILVÁNTARTÓ SZOFTVER FIREBIRD ADATBÁZIS ALKALMAZÁSÁVAL

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.

SQL DDL-2 (aktív elemek) triggerek

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

Kliens oldali SQL-API

Adatbázis használat I. 1. gyakorlat

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

AB1 ZH mintafeladatok. 6. Minősítse az állításokat! I-igaz, H-hamis

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

Adatbázisok* tulajdonságai

Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

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

SELECT DISTINCT deptno FROM emp; (distinct) SELECT STATEMENT HASH UNIQUE TABLE ACCESS FULL EMP

Adatbázis használat I. 2. gyakorlat

Az Adatbázis alapú rendszerek kurzus követelményei és tematikája

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

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

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

Gyakorlás: Hozzunk létre egy Alkalmazottak táblát AZO szám, Részleg szöveg, Munkakör szöveg és BelépésDátuma dátum típussal.

Adatbázis rendszerek SQL nyomkövetés

Adatbáziskezelő-szerver. Relációs adatbázis-kezelők SQL. Házi feladat. Relációs adatszerkezet

SQL DDL-1: táblák és megszorítások

Adatbázisok webalkalmazásokban

SQL PÉLDATÁR. készült a PTE TTK Iskolai informatika III. kurzus teljesítésére

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

Az SQL adatbázisnyelv: DML

8. gyakorlat Pointerek, dinamikus memóriakezelés

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Java és web programozás

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

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

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

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

2006. május 1. TARTALOM

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

N Y I L A T K O Z A T

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Adatbázisok tavaszi félév Vizsgatételsor

2012. április 27. TARTALOM

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

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

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

Átírás:

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

Kurzorok Adattábla soronkénti feldolgozására szolgál A memóriában egy munkaterületen tárolódik a kurzorhoz tartozó tábla A kurzor az eredményhalmazban mindig egy sorra mutat Explicit kurzor: a kurzorhoz tartozó tábla SELECT utasítással definiált Implicit kurzor: minden INSERT, DELETE, UPDATE és explicit kurzorral nem rendelkező SELECT utasításhoz automatikusan jön létre

Kurzorfüggvények SQL%FOUND: a legutóbbi SQL utasítás legalább egy sort feldolgozott SQL%NOTFOUND: a legutóbbi SQL utasítás nem dolgozott fel sort SQL%ROWCOUNT: a kurzorral összesen feldolgozott sorok száma SQL%ISOPEN: igaz, ha a kurzor meg van nyitva Explicit kurzor esetén kurzornev%függvénynév alakúak Pl. kurzornév%isopen Implicit kurzor esetén SQL előtaggal hivatkozhatunk, Pl. SQL%FOUND.

Implicit kurzor példa DECLARE emp_row emp%rowtype; SELECT * INTO emp_row FROM emp WHERE empno = 7902; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT); END;

Explicit kurzor használata Deklaráció: CURSOR kurzornév IS lekérdezés Megnyitás: OPEN kurzornév (megnyitáskor hajtódik végre a lekérdezés, a létrejövő eredménytábla nem frissítődik!!!) Léptetés: FETCH kurzornév INTO változók (az aktuális sor adatai a változókba kerülnek és a kurzor eggyel előre lép, ellenőrizni kell, hogy a kurzorhoz tartozó eredménytáblának van-e sora!!!) Lezárás: CLOSE kurzornév Lezárt kurzor deklarációja továbbra is érvényben marad, később újra megnyitható

Explicit kurzor példa DECLARE v_veznev emp.ename%type; v_fiz emp.sal%type; CURSOR nev_es_fiz IS SELECT ename, sal FROM emp ORDER BY ename; OPEN nev_es_fiz; LOOP FETCH nev_es_fiz INTO v_veznev, v_fiz; EXIT WHEN nev_es_fiz%notfound; DBMS_OUTPUT.PUT_LINE(' Név: ' v_veznev ' Fizetése: ' v_fiz); END LOOP; CLOSE nev_es_fiz; END;

Explicit kurzor FOR ciklussal Az alábbi FOR utasítás implicit módon hajtja végre az OPEN, FETCH, EXIT WHEN, CLOSE parancsokat: FOR rekordnév IN kurzornév LOOP utasítások END LOOP; Megjegyzés: rekordnevet nem szükséges külön deklarálni, érvényességi köre csak a FOR-ciklusra terjed ki.

Példa DECLARE CURSOR nev_es_fiz IS SELECT ename, sal FROM emp ORDER BY ename; FOR m_rek IN nev_es_fiz LOOP DBMS_OUTPUT.PUT_LINE(' Név: ' m_rek.ename ' Fizetése: ' m_rek.sal); END LOOP; END;

Paraméterezett kurzorok A kurzor definíciója paramétereket tartalmazhat, ezek aktuális értékeit megnyitáskor adjuk át a kurzornak. Ha többször nyitjuk meg, mindig más-más paraméterrel futtathatjuk. CURSOR kurzornév (paraméternév adattípus,..., paraméternév adattípus) IS alkérdés;

Tábla módosítása kurzorral UPDATE táblanév SET oszlop = kifejezés,..., oszlop = kifejezés [ WHERE feltétel ]; Kérdés: A kurzor által mutatott sor módosításához az UPDATE utasításban milyen WHERE feltételt kell megadni? Lehetőségek: ROWID használata FOR UPDATE és CURRENT OF használata.

Tábla módosítása kurzorral, ROWID ROWID = sorazonosító: rekord fizikai címe (melyik fájl hányadik lemezblokkján hányadik rekord). ACCEPT partner_azon PROMPT 'Kérem adja meg a partner azonosítót: ' DECLARE row_id ROWID; id emp.empno%type; SELECT ROWID INTO row_id FROM emp WHERE empno = '&partner_azon'; UPDATE emp SET sal = sal + 100 WHERE ROWID = row_id; DBMS_OUTPUT.PUT_LINE(row_id); END;

FOR UPDATE és CURRENT OF használata FOR UPDATE [OF oszlopok] [NOWAIT]: zárolás. A kurzor megnyitásakor az összes sort zárolja. A zárolás COMMIT-ig vagy ROLLBACK-ig tart. NOWAIT: ha egy másik tranzakció már zárolta a sorokat, akkor a program nem várakozik, hanem hibajelzéssel tovább fut. NVL(x, y) függvény: NULL érték helyettesítése. Ha x értéke NULL, akkor y-t, egyébként x értékét adja vissza. WHERE CURRENT OF: kurzor sorának módosítása

Tábla módosítása kurzorral, FOR UPDATE, set serveroutput on DECLARE CURRENT OF CURSOR nev_es_fizetes IS SELECT ename, sal FROM emp ORDER BY ename FOR UPDATE OF sal; for egydolgozo in nev_es_fizetes loop update emp set sal=sal*1.1 where current of nev_es_fizetes; DBMS_OUTPUT.PUT_LINE(egydolgozo.ename ' ' egydolgozo.sal); end loop; END;

Alprogramok Névvel ellátott és paraméterezhető blokk Deklarációjuk a főprogram DECLARE szegmens végén Eljárások: PROCEDURE név [(paraméterek)] IS lokális deklarációk utasítások END [név]; Függvények: FUNCTION név [(paraméterek)] RETURN adattípus IS lokális deklarációk utasítások END [név];

Eljárás PROCEDURE név [(paraméterek)] IS lokális deklarációk végrehajtható utasítások [EXCEPTION kivételkezelés] END [név]; Az eljárás RETURN utasítás(oka)t tartalmazhat, amelyek azonnali visszatérést eredményeznek.

Eljárás paraméterek szintaxisa paraméternév [{IN OUT IN OUT}] adattípus IN: bemenő paraméter, ha értéket adunk neki, fordítási hiba keletkezik. IN az alapértelmezés. OUT: kimenő paraméter. Csak értéket kaphat, értékét felhasználni nem lehet (tehát például értékadó utasítás jobb oldalán nem szerepelhet). IN OUT: be-kimenő paraméter, szabadon felhasználható. Híváskor IN esetén változó vagy konstans, OUT és IN- OUT esetén csak változó adható meg. Az adattípusokra NOT NULL és egyéb megkötés nem adható meg.

Eljáráshoz példa DECLARE v_megnev emp.ename%type; PROCEDURE nyomtat(szoveg IN VARCHAR2) IS DBMS_OUTPUT.PUT_LINE(szoveg); END; SELECT ename INTO v_megnev FROM emp WHERE empno = 7902; nyomtat(v_megnev); END;

Függvény FUNCTION név [(paraméterek)] RETURN adattípus IS lokális deklarációk végrehajtható utasítások [EXCEPTION kivételkezelés] END [név]; A függvény RETURN(kifejezés) utasítással tér vissza.

Függvény példa DECLARE v_partnerid emp.empno%type; v_ber emp.sal%type; FUNCTION min_ber (ber IN NUMBER) RETURN BOOLEAN IS tmp_ber emp.sal%type; SELECT MIN(ber) INTO tmp_ber FROM emp; RETURN (tmp_ber = ber); END min_ber; SELECT MIN(empno) INTO v_partnerid FROM emp; LOOP SELECT sal INTO v_ber FROM emp WHERE empno = v_partnerid; v_partnerid := v_partnerid + 1; EXIT WHEN min_ber(v_ber); END LOOP; DBMS_OUTPUT.PUT_LINE('A minimal ber: ' v_ber); END;

Adatbázis-objektumként tárolt alprogram lehetőség van az adatbázisban eltárolni alprogramokat ezek később tetszőleges, az adatbázison futtatott PL/SQL blokkból, SQL lekérdezésből, az EXEC utasítással, vagy SQL*Plus környezetben az EXECUTE paranccsal hívhatók deklaráció elejére CREATE, IS helyett AS CREATE PROCEDURE név (paraméterek) AS... CREATE FUNCTION név (paraméterek) RETURN típus AS... alapértelmezés IN típusú paraméterekhez: paraméternév típus DEFAULT érték, paramétert csak a lista végérõl lehet elhagyni PROCEDURE nyomtat(szoveg IN VARCHAR2 DEFAULT 'empty') FUNCTION min_ber (ber IN NUMBER DEFAULT 0) RETURN BOOLEAN

Feladatok 1. Írjunk egy függvényt, ami egy paraméterben átadott küszöbértéktől többet kereső alkalmazottak (emp tábla) átlagbérét adja vissza! A függvényt felhasználva írassuk is ki az eredményt, a paramétert a felhasználótól kérjük be! 2. Kurzor használatával emeljük meg a CLERK foglalkozásúak fizetését 20%-kal!

Feladatok 3. Kurzor segítségével járjuk be az EMP táblát, és ha valakinek a fizetése 2000 fölött van, dobjunk egy magasfizetes nevű saját kivételt. Deklaráljuk a kivételt, és írjuk meg hozzá a kivételkezelőt is, ami kiírja, hogy kinek túl magas a fietése. Az egész EMP táblát be kell járni! 4. Írjunk olyan tárolt eljárást, ami kurzor segítségével bejárja az EMP táblát, és fizetésemelést ad a dolgozóknak a következő szabály szerint: ha valaki legalább 30 éve dolgozik a cégnél, adjunk 20% emelést, ha 20-30 évvel ezelőtt került a céghez, 10% emelést, ha pedig kevesebb, mint 20 éve, akkor 5% emelést. Segítség: A to_char a 'yyyy' formátum stringgel kiveszi az éveket a dátum mezőből A to_number pedig ezt a stingként tarolt számot szám típusúvá alakítja,

SSADM leadása Március 17. Coospace Becsomagolva zip-be Doksi (pdf), ábra forrásfájlok Adatbázist (táblákat) létrehozó script(ek) Alapkövetelmények (min. pontért): Szöveges feladatleírás, követelmény katalógus Adatfolyam diagram(ok) Egyedmodell(ek) Funkció meghatározás vagy egyed-esemény mátrix vagy szerepfunkció mátrix Relációs adatelemzés (normalizálás, adattáblák leírása) Következő gyakorlatra (márc. 21.) ki kell nyomtatni és beadni

ZH Következő héten (márc. 21) ZH: 4-5-6 gyakorlat anyagából ami kell: alapvető SQL parancsok (adatbázis 1.) érték beolvasása / kiíratása plsql blokkok (declare,begin,exception,end) alapvető algoritmus eszközök (IF, LOOP, WHILE, CASE, FOR) gyűjtőtáblák kivétel kezelés (rendszerbeli, saját), saját kivétel dobása alprogramok (függvény, eljárás) készítése, meghívása kurzorok + Kinyomtatott SSADM doksi leadása gyakorlaton! (ZH után)

1. Feladat megoldása SET SERVEROUTPUT ON; ACCEPT kuszob PROMPT 'Adj meg egy kuszoberteket:' DECLARE atl_fiz emp.sal%type; FUNCTION fizetes(kuszob in NUMBER) RETURN NUMBER IS fiz emp.sal%type; SELECT AVG(sal) INTO fiz FROM emp WHERE sal>kuszob; RETURN fiz; END fizetes; atl_fiz:=fizetes(&kuszob); DBMS_OUTPUT.PUT_LINE('Atlagfizetes a kuszobertek felett: ' atl_fiz); END;

2. Feladat megoldása DECLARE emel emp.sal%type; CURSOR fizetesemeles IS SELECT sal FROM emp WHERE ename LIKE 'CLARK' FOR UPDATE OF sal NOWAIT; OPEN fizetesemeles; FETCH fizetesemeles INTO emel; UPDATE emp SET sal=sal*1.20 WHERE CURRENT OF fizetesemeles; CLOSE fizetesemeles; END;

3. Feladat megoldása SET SERVEROUTPUT ON DECLARE magasfizetes EXCEPTION; CURSOR fizetes IS SELECT sal FROM emp; FOR fizetesek IN fizetes LOOP IF fizetesek.sal>1000 THEN RAISE magasfizetes; END IF; END LOOP; EXCEPTION WHEN magasfizetes THEN dbms_output.put_line('valakinek magas a fizetese!'); END;

4. Feladat megoldása CREATE PROCEDURE fiz_emel AS evek number; emeles emp.sal%type := 0; cursor dolgkurzor is select hiredate, sal from emp for update of sal; begin for dolg_rek in dolgkurzor loop evek := 2012 - to_number(to_char(dolg_rek.hiredate, 'yyyy')); if (evek >= 30) then emeles := dolg_rek.sal * 0.2; elsif (evek>=20) then emeles := dolg_rek.sal * 0.1; elsif (evek>=10) then emeles := dolg_rek.sal * 0.05; end if; update emp set sal=sal+emeles where current of dolgkurzor; end loop; END fiz_emel;