|
|
| (Egy közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva) |
| 1. sor: |
1. sor: |
| {{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060317}} | | {{GlobalTemplate|Valaszthato|AdatbServerProg}} |
|
| |
|
| <!--
| |
| * Set DENYTOPICVIEW = [[TWikiGuest]]
| |
| -->
| |
|
| |
|
| <style>
| | Tantárgy adatlap: |
| code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px;}
| | * http://www.vdk.bme.hu/targykov/valaszthato/viau9159.htm |
| li { line-height: 18px; }
| | Tanszéki oldal: |
| </style>
| | * https://avalon.aut.bme.hu/~reni/aszp/ (jelszavas) |
| | * https://avalon.aut.bme.hu/~ivancsy/aszp.html |
| | * http://www.aut.bme.hu/Portal/Targy.aspx?courseId=06d4f149-7397-4e93-903b-0d52483c49ed |
| | Oktatók: |
| | * Iváncsy Renáta (IB.153, 1668, reni@aut.bme.hu) |
| | * Dr. Iváncsy Szabolcs (csak a Neptun szerint tanít minket, a félév során kétszer láttam) |
|
| |
|
| <br/> [[AdatbServerProgJegyzet20060314|<<]] Előadás, 2006.03.17. [[AdatbServerProgJegyzet20060321|>>]]
| | ==Órai jegyzet== |
|
| |
|
| __TOC__
| | ===Bevezetés=== |
| | * [[AdatbServerProgJegyzet20060217|Előadás, 2006.02.17.]] — 2 és n-rétegű architektúra, szerver oldali programozás, SQL szintaktika |
|
| |
|
| ==Kivételek kezelése== | | ===Oracle=== |
| | * [[AdatbServerProgJegyzet20060221|Labor, 2006.02.21.]] — PL/SQL Developer alapok, Forma1 adatbázis létrehozása és feltöltése |
| | * [[AdatbServerProgJegyzet20060224|Előadás, 2006.02.24.]] — Oracle és Sql Server összehasonlítása, Oracle vezérlési szerkezetek |
| | * Labor, 2006.03.07. — Az ipari nyílt nap miatt elmaradt. |
| | * [[AdatbServerProgJegyzet20060303|Előadás, 2006.03.03.]] — adattípusok |
| | * [[AdatbServerProgJegyzet20060307|Labor, 2006.03.07.]] — <pre>SELECT</pre>-ek írása a cukrász adatbázishoz |
| | * [[AdatbServerProgJegyzet20060310|Előadás, 2006.03.10.]] — kurzorok |
| | * [[AdatbServerProgJegyzet20060314|Labor, 2006.03.14.]] — elágazások, ciklusok, kurzorok használata |
| | * [[AdatbServerProgJegyzet20060317|Előadás, 2006.03.17.]] — hibakezelés, tárolt eljárások és függvények |
| | * [[AdatbServerProgJegyzet20060321|Labor, 2006.03.21.]] — tárolt eljárások és hibakezelés (Formula 1 DB) |
| | * [[AdatbServerProgJegyzet20060324|Előadás, 2006.03.24.]] — triggerek |
| | * [[AdatbServerProgJegyzet20060328|Labor, 2006.03.28.]] — tárolt alprogramok és triggerek |
| | * [[AdatbServerProgJegyzet20060331|Előadás, 2006.03.31.]] — csomagok |
| | * [[AdatbServerProgJegyzet20060404|Labor, 2006.04.04.]] — Forma1 csomag írása |
| | * [[AdatbServerProgJegyzet20060407|Előadás, 2006.04.07.]] — tranzakciók |
| | * [[AdatbServerProgJegyzet20060411|Labor, 2006.04.11.]] — tranzakciók |
| | * [[AdatbServerProgJegyzet20060414|Előadás, 2006.04.14.]] — dinamikus SQL |
| | * [[AdatbServerProgJegyzet20060418|Labor, 2006.04.18.]] — dinamikus SQL, infó kinyerése rendszer táblákból |
|
| |
|
| ===Kivétel típusok=== | | ===Microsoft SQL Server === |
| | * [[AdatbServerProgJegyzet20060421|Előadás, 2006.04.21.]] — MS SQL bevezetés, =IDENTITY=, típusok, operátorok, vezérlési szerkezetek |
| | * [[AdatbServerProgJegyzet20060425|Labor, 2006.04.25.]] — SQL Management Studio, változók, dátumkezelés, =UPDATE OUTPUT= |
| | * [[AdatbServerProgJegyzet20060428|Előadás, 2006.04.28.]] — SQL-92 és T-SQL kurzor, kurzor ciklus, tárolt eljárások és függvények |
| | * [[AdatbServerProgJegyzet20060502|Labor, 2006.05.02.]] — kurzorok, tárolt eljárások, függvények, =CASE= |
| | * [[AdatbServerProgJegyzet20060505|Előadás, 2006.05.05.]] — DML és DDL triggerek, hibakezelés |
| | * [[AdatbServerProgJegyzet20060509|Labor, 2006.05.09.]] — triggerek, hibakezelés, nézetek, példa kliens progi kiegészítése |
| | * [[AdatbServerProgJegyzet20060512|Előadás, 2006.05.12.]] — dinamikus SQL, tranzakciók, XML (vetítős óra, XML nem vizsgaanyag) |
| | * [[AdatbServerProgJegyzet20060516|Labor, 2006.05.16.]] — egy 2003-as vizsgát végig oldottunk |
| | A jegyzetek Iváncsy Renáta kérésére csak bejelentkezés után elérhetők. |
|
| |
|
| * Rendszer kivételek
| | ==Minta adatbázisok== |
| ** Névvel ellátott kivételek (név, sorszám, üzenet)
| |
| ** Név nélküli kivételek (sorszám, üzenet)
| |
| * Felhasználói kivételek
| |
| * Alkalmazás hibák
| |
|
| |
|
| ====Névvel ellátott kivételek====
| | * Cukrász séma: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/cukrasz_sema.pdf |
| | * Tanár-diák séma: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/tanar_diak_sema.pdf |
| | * Forma-1 séma: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/forma1_sema.pdf |
| | * Oracle és MS SQL scriptek (<pre>CREATE TABLE</pre> és <pre>INSERT</pre>): https://avalon.aut.bme.hu/~reni/aszp/script.html |
| | * Csatlakozás a tanszéki adatbázis szerverhez |
| | ** Csanás: egyetemi VPN-nel tavaly (2005-ben) el lehetett érni |
| | ** Chris: Oracle? szerver címe: deathstar.aut.bme.hu |
|
| |
|
| * Kivétel lekezelése: <code class="pre">DECLARE ...
| | ==Vizsga== |
| <br/>BEGIN ...
| | * 50 perc elmélet |
| <br/>EXCEPTION
| | ** csak papírt használhatunk |
| <br/> WHEN kivételnév [OR kivételnév2 [...]] THEN utasítások;
| | ** a feladat kidolgozásánál megválaszthatjuk a nyelvet |
| <br/> WHEN OTHERS THEN utasítások;
| | ** példa elméleti kérdésre: |
| <br/>END;</code>
| | *** soroljunk fel 3 beépített csomagot |
| * Az =OTHERS= blokknak a =EXCEPTION= blokk végére kell kerülnie. | | *** tranzakciók tulajdonságai (ACID) |
| * Gyakori, névvel ellátott kivételek: | | ** példa feladatra: |
| ** =NO_DATA_FOUND= | | *** írjunk tárolt eljárást kivételkezeléssel |
| ** =TOO_MANY_ROWS= | | * 90 perc gyakorlat |
| ** =DUP_VAL_ON_INDEX=: olyan sort akarunk beszúrni, amivel megszegjük a kulcs vagy a =UNIQUE= oszlop egyediségére vonatkozó megkötést | | ** bármi használható (jegyzet, net, stb.) |
| ** =VALUE_ERROR=: pl. =NULL= értéket akarunk beszúrni =NOT NULL= oszlopba | | ** 4 feladat, 2 Oracle + 2 Microsoft SQL |
| ** =ZERO_DIVIDE= | | ** az egyik Oracle feladat biztosan egy csomag írása |
| ** =CURSOR_ALREADY_OPEN=: kétszer nyitunk meg egy kurzort | | ** a megoldást emailben kell beküldeni |
| ** =INVALID_CURSOR= | | * Elővizsga a 2006. tavaszi félévben utolsó héten pénteken. |
| ** =CASE_NOT_FOUND=: a =CASE= utasítás szelektora egyik ágra sem illeszkedik | | <br/> Mivel idén összesen 4 jelentkező volt, megállapodtunk a szóbeli vizsgában, ami szerintem lényegesen egyszerűbb volt, mint ha a gépek előtt kellett volna görnyedni másfél órán keresztül. Szóbelin 1 nagyobb témakört kaptunk (én pl. az SQL Server triggereket), és másba nem is kérdeztek bele. |
| * A nevek a =STANDARD= csomagban vannak összegyűjtve. Nem kell deklarálni őket. | |
| * Kivétel generálása: =RAISE NO_DATA_FOUND;=
| |
|
| |
|
| ====Név nélküli rendszer kivételek====
| | * 2008. őszi félév: Egy komplexebb tárolt eljárás megírása papíron, segédeszköz nélkül és egy elméleti kérdés kidolgozása, majd szóbeli vizsga az előzőek alapján. Szóval változott kicsit a számonkérés. -- [[AndrasGelanyi|giga]] - 2009.01.20. |
| * A =WHEN OTHERS= blokkban egyszerre elkaphatók | |
| * Elnevezhetők a =PRAGMA= utasítás segítségével: <code class="pre">DECLARE kivételnév EXCEPTION;
| |
| <br/>PRAGMA EXCEPTION_INIT(kivételnév, szám);</code>
| |
| * Az előbbi módon a rendszer kivételnevek is felüldefiniálhatók. Az eredeti kivételre a =STANDARD= előtaggal hivatkozhatunk. Pl. =WHEN STANDARD.NO_DATA_FOUND THEN ...=
| |
| * Kivétel generálása: =RAISE kivételnév;=
| |
|
| |
|
| ====Felhasználói kivételek====
| | -- [[PallosPeter|Peti]] - 2006.05.18. |
| <ul>
| |
| <li>Szintaktika:
| |
| <code class="pre">DECLARE
| |
| kivételnév EXCEPTION;
| |
| BEGIN
| |
| ...
| |
| RAISE kivételnév;
| |
| ...
| |
| EXCEPTION
| |
| WHEN kivételnév THEN ...
| |
| END;</code>
| |
| </ul>
| |
|
| |
|
| ====Alkalmazás hibák====
| | * {{InLineFileLink|Valaszthato|AdatbServerProg|000_elmeleti_kerdesek.rtf|000_elmeleti_kerdesek.rtf}}: Elméleti kérdések kidolgozása |
| * Hiba kiváltása: =RAISE_APPLICATION_ERROR(hibakód, üzenet[, {FALSE|TRUE}])= | |
| ** hibakód: -20999 és -20000 közötti szám
| |
| ** üzenet: =VARCHAR(2048)=
| |
| ** A 3. paraméter =TRUE= értéke esetén a hiba a stackbe kerül, különben felülírja az előző hibát. A paraméter alapértelmezett értéke =FALSE=
| |
| | |
| ===Kivételek terjedése===
| |
| * A =DECLARE= és =BEGIN= között keletkezett hibát csak kívül lehet elkapni.
| |
| * Ugyanez igaz az =EXCEPTION= és az =END= között keletkezett kivételre is.
| |
| * A =BEGIN= és az =EXCEPTION= közötti kivétel az =EXCEPTION= blokkban lekezelhető. Ha itt nem történik meg, akkor a külső blokk =EXCEPTION= részébe terjed tovább.
| |
| * A belső blokkban lokálisan deklarált hibát a külső blokknak csak a =WHEN OTHERS= részében lehet elkapni, mert kívül nem látható a neve.
| |
| | |
| ===Hibakód és hibaüzenet===
| |
| | |
| <ul>
| |
| <li> Az =SQLCODE= illetve az =SQLERRM= függvényekkel kérdezhető le.
| |
| <li> Ezek a függvények nek használhatók SQL utasítások belsejében, az értéküket először változóba kell kiolvasni.
| |
| <li> Példa a hibák naplózására:
| |
| <code class="pre">DECLARE
| |
| hibakod INT;
| |
| uzenet VARCHAR2(512);
| |
| BEGIN
| |
| ...
| |
| EXCEPTION
| |
| WHEN OTHERS THEN
| |
| szam := SQLCODE;
| |
| uzenet := SQLERRM;
| |
| INSERT INTO naplo VALUES (szam, uzenet, sysdate);
| |
| END;</code>
| |
| </ul>
| |
| | |
| ====Hibakódok====
| |
| * Belső kivétel: <0
| |
| * =NO_DATA_FOUND=: 100
| |
| * Felhasználói kivétel: 1
| |
| * Nincs hiba: 0
| |
| | |
| ====Hibaüzenetek====
| |
| * A rendszerüzenetek =VARCHAR2(512)= típusúak
| |
| * Felhasználói kivétel esetén a ='User Defined Exception'= üzenetet kapjuk
| |
| * Siker esetén ='ORA-0000'= az üzenet
| |
| | |
| ==Alprogramok==
| |
| | |
| ===Alprogramok típusai, terminológia===
| |
| | |
| * Lehetnek eljárások vagy függvények
| |
| * Lehetnek tároltak vagy lokálisak
| |
| * Részei: deklaráció, kód, kivételkezelés
| |
| * _Formális paraméter_: a paraméter neve
| |
| * _Aktuális paraméter_: a paraméter értéke
| |
| | |
| ===Eljárások és függvények===
| |
| | |
| <ul>
| |
| <li> Eljárás deklarációja:
| |
| <code class="pre">[CREATE [OR REPLACE]] PROCEDURE eljárásnév [(paraméterek)]
| |
| [AUTHID {DEFINER|CURRENT_USER}]
| |
| {IS|AS}
| |
| lokális deklaráció
| |
| BEGIN
| |
| ...
| |
| EXCEPTION
| |
| ...
| |
| END [eljárásnév];</code>
| |
| <li> Függvény deklarációja:
| |
| <code class="pre">[CREATE [OR REPLACE]] FUNCTION függvénynév [(paraméterek)]
| |
| RETURN típus
| |
| [AUTHID {DEFINER|CURRENT_USER}]
| |
| {IS|AS}
| |
| lokális deklaráció
| |
| BEGIN
| |
| ...
| |
| RETURN érték;
| |
| EXCEPTION
| |
| ...
| |
| END [függvénynév];</code>
| |
| <li>Paraméter deklaráció:
| |
| <br/> =név [IN|OUT [NOCOPY]||IN OUT [NOCOPY]] típus [{:=DEFAULT} kifejezés]=
| |
| </ul>
| |
| | |
| ====Paraméter módok====
| |
| | |
| * A típus nem tartalmazhat megkötést, mint pl. =VARCHAR2(50)=
| |
| * =IN=: alapértelmezett mód, eljáráson belül konstansként viselkedik, lehet default értéke
| |
| * =OUT=: változóként viselkedik, változóval kell meghívni. Hívás után <pre>NULL</pre>-ra inicializálódik, ezért nem lehet =NOT NULL= megkötést tenni a típusra, különben =VALUE_ERROR= hibát kapunk.
| |
| * =OUT NOCOPY=: referenciaként adódik át a változó. Vigyáznunk kell, ha kivétel történik, mert inkonzisztens állapotban maradhat a változó értéke
| |
| * =IN OUT=: értékadás bal és jobb oldalán is állhat
| |
| | |
| ====Eljárás hívása====
| |
| | |
| * =BEGIN= és =END= között =eljárásnév(paraméterek);=
| |
| * Command windowból =EXEC eljárásnév(paraméterek);=
| |
| * Paraméterek átadása
| |
| ** A paraméter lehet konstans, változó vagy kifejezés
| |
| ** Paraméterátadás pozíció alapján:
| |
| <br/> =eljárásnév(érték, ...);=
| |
| ** Paraméterátadás név alapján:
| |
| <br/> =eljárásnév(formális paraméter=>aktuális paraméter, ...);=
| |
| ** Kevert paraméterátadás: az első néhány paramétert pozíció alapján, a többit név alapján adjuk át.
| |
| * Függvényhívás történhet
| |
| ** Kifejezés részeként
| |
| ** =SELECT= belsejében, pl. =SELECT f(1) FROM DUAL;=. Ilyenkor a függvénynek SQL típussal kell visszatérnie, a boolean például tiltott.
| |
| | |
| ===Példák===
| |
| | |
| ====Tárolt eljárás hibakezeléssel====
| |
| | |
| <code class="pre">CREATE OR REPLACE PROCEDURE anyag_beszur
| |
| (azonosito INT, nev VARCHAR2, egyszegnev VARCHAR2)
| |
| IS
| |
| egysegid INT;
| |
| BEGIN
| |
| SELECT egyseg_id INTO egysegid FROM egyseg
| |
| WHERE UPPER(egyseg_nev) = UPPER(egysegnev);
| |
| INSERT INTO anyag(anyag_id, anyag_nev, anyag_egyseg)
| |
| VALUES(azonosito, ne, egysegid);
| |
| EXCEPTION
| |
| WHEN NO_DATA_FOUND THEN
| |
| RAISE_APPLICATION_ERROR(-20101, 'Nincs ilyen egység');
| |
| WHEN DUP_VAL_ON_INDEX THEN
| |
| BEGIN
| |
| SELECT anya_id INTO aid FROM anyag
| |
| WHERE UPPER(anyag_nev) = UPPER(nev);
| |
| RAISE_APPLICATION_ERROR(-20102, 'Az anyag létezik ' ||| aid || ' azonosítóval');
| |
| EXCEPTION
| |
| WHEN NO_DATA_FOUND THEN
| |
| SELECT MAX(anyag_id)+1 INTO aid FROM anyag;
| |
| RAISE_APPLICATION_ERROR(-20103, 'Dupla azonosító, ajánlott: ' | aid');
| |
| END;
| |
| END anyag_beszur;</code>
| |
| | |
| ====Tárolt eljárás név nélküli hiba kezelésével====
| |
| | |
| <code class="pre">CREATE OR REPLACE PROCEDURE recept_beszur
| |
| (aid INT, fid INT, mennyiseg FLOAT) -- aid=anyag id, fid=félkész id
| |
| IS
| |
| referencia EXCEPTION;
| |
| PRAGMA EXCEPTION_INIT(referencia, -2291);
| |
| BEGIN
| |
| INSERT INTO felkesz_anyag VALUES(aid, fid, mennyiseg);
| |
| EXCEPTION
| |
| WHEN referencia THEN
| |
| RAISE ... -- itt még lehetne ellenőrizni, hogy melyik oszlop okozza
| |
| WHEN DUP_VAL_ON_INDEX THEN
| |
| RAISE ...
| |
| END;</code>
| |
| | |
| ====Tárolt függvény hibakezeléssel====
| |
| | |
| <code class="pre">CREATE OR REPLACE FUNCTION pilota_pontszam(pid INT, fid INT)
| |
| RETURN INT
| |
| IS
| |
| result INT;
| |
| sorszam INT;
| |
| BEGIN
| |
| SELECT helyezes [[INTo]] sorszam FROM futam_pilota
| |
| WHERE futam_id=fid AND pilota_id=pid;
| |
| CASE sorszam
| |
| WHEN 1 THEN result:=10;
| |
| WHEN 2 THEN result:=8;
| |
| WHEN 3 THEN result:=6;
| |
| ...
| |
| WHEN 8 THEN result:=1;
| |
| ELSE result:=0;
| |
| END CASE;
| |
| RETURN result;
| |
| EXCEPTION
| |
| WHEN NO_DATA_FOUND THEN
| |
| RAISE ...
| |
| END;</code>
| |
| | |
| ====Tárolt eljárás hívása====
| |
| | |
| <code class="pre">SELECT nev, helyezes, pilota_pontszam(pilotaid, futamid) pont
| |
| FROM futam_pilota NATURAL JOIN pilota
| |
| WHERE futamid=51001
| |
| ORDER BY helyezes, pont DESC;</code>
| |
| | |
| A =WHERE= után nem lehet =pont= néven hivakozni a függvény eredményére, ki kell írni az egész függvényhívást.
| |
| | |
| -- [[PallosPeter|Peti]] - 2006.03.17.
| |
|
| |
|
| | %META:FORM{name="ValaszthatoForm"}% |
| | %META:FIELD{name="Trgy" title="Tárgy" value="Adatbázisok szerver oldali programozása"}% |
| | %META:FIELD{name="Trgykd" title="Tárgykód" value="VIAU9159"}% |
| | %META:FIELD{name="Tanszk" title="Tanszék" value="AUT"}% |
| | %META:FIELD{name="Elad" title="Előadó" value="Iváncsy Renáta, Dr. Iváncsy Szabolcs"}% |
| | %META:FIELD{name="Kreditszm" title="Kreditszám" value="5"}% |
| | %META:FIELD{name="raszm" title="Óraszám" value="4"}% |
| | %META:FIELD{name="Flv" title="Félév" value=""}% |
| | %META:FIELD{name="Terlet" title="Terület" value="Programozás"}% |
| | %META:FIELD{name="raijelenlt" title="Órai jelenlét" value="nem kötelező"}% |
| | %META:FIELD{name="Jegy" title="Jegy" value="vizsga "}% |
| | %META:FIELD{name="Elvrtmin.munka" title="Elvárt min. munka" value="bejárás"}% |
| | %META:FIELD{name="Minimumrajrjegy" title="Minimumra járó jegy" value=""}% |
| | %META:FIELD{name="Elvrtmax.munka" title="Elvárt max. munka" value="kis utánaolvasás - kis munka"}% |
| | %META:FIELD{name="Munkrajrjegy" title="Munkára járó jegy" value="5"}% |
|
| |
|
| [[Category:Valaszthato]] | | [[Category:Valaszthato]] |
| | [[Category:Archive]] |