„Adatbázisok szerver oldali programozása” változatai közötti eltérés

Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProg}} Tantárgy adatlap: * http://www.vdk.bme.hu/targykov/valaszthato/viau9159.htm Tanszéki oldal: * https://avalon.aut.bme…”
 
Nincs szerkesztési összefoglaló
1. sor: 1. sor:
{{GlobalTemplate|Valaszthato|AdatbServerProg}}
{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060317}}


<!--
* Set DENYTOPICVIEW = [[TWikiGuest]]
-->


Tantárgy adatlap:
<style>
* http://www.vdk.bme.hu/targykov/valaszthato/viau9159.htm
code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px;}
Tanszéki oldal:
li { line-height: 18px; }
* https://avalon.aut.bme.hu/~reni/aszp/ (jelszavas)
</style>
* 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)


==Órai jegyzet==
<br/> [[AdatbServerProgJegyzet20060314|&lt;&lt;]] Előadás, 2006.03.17. [[AdatbServerProgJegyzet20060321|&gt;&gt;]]


===Bevezetés===
__TOC__
* [[AdatbServerProgJegyzet20060217|Előadás, 2006.02.17.]] &mdash; 2 és n-rétegű architektúra, szerver oldali programozás, SQL szintaktika


===Oracle===
==Kivételek kezelése==
* [[AdatbServerProgJegyzet20060221|Labor, 2006.02.21.]] &mdash; PL/SQL Developer alapok, Forma1 adatbázis létrehozása és feltöltése
* [[AdatbServerProgJegyzet20060224|Előadás, 2006.02.24.]] &mdash; Oracle és Sql Server összehasonlítása, Oracle vezérlési szerkezetek
* Labor, 2006.03.07. &mdash; Az ipari nyílt nap miatt elmaradt.
* [[AdatbServerProgJegyzet20060303|Előadás, 2006.03.03.]] &mdash; adattípusok
* [[AdatbServerProgJegyzet20060307|Labor, 2006.03.07.]] &mdash; <pre>SELECT</pre>-ek írása a cukrász adatbázishoz
* [[AdatbServerProgJegyzet20060310|Előadás, 2006.03.10.]] &mdash; kurzorok
* [[AdatbServerProgJegyzet20060314|Labor, 2006.03.14.]] &mdash; elágazások, ciklusok, kurzorok használata
* [[AdatbServerProgJegyzet20060317|Előadás, 2006.03.17.]] &mdash; hibakezelés, tárolt eljárások és függvények
* [[AdatbServerProgJegyzet20060321|Labor, 2006.03.21.]] &mdash; tárolt eljárások és hibakezelés (Formula 1 DB)
* [[AdatbServerProgJegyzet20060324|Előadás, 2006.03.24.]] &mdash; triggerek
* [[AdatbServerProgJegyzet20060328|Labor, 2006.03.28.]] &mdash; tárolt alprogramok és triggerek
* [[AdatbServerProgJegyzet20060331|Előadás, 2006.03.31.]] &mdash; csomagok
* [[AdatbServerProgJegyzet20060404|Labor, 2006.04.04.]] &mdash; Forma1 csomag írása
* [[AdatbServerProgJegyzet20060407|Előadás, 2006.04.07.]] &mdash; tranzakciók
* [[AdatbServerProgJegyzet20060411|Labor, 2006.04.11.]] &mdash; tranzakciók
* [[AdatbServerProgJegyzet20060414|Előadás, 2006.04.14.]] &mdash; dinamikus SQL
* [[AdatbServerProgJegyzet20060418|Labor, 2006.04.18.]] &mdash; dinamikus SQL, infó kinyerése rendszer táblákból


===Microsoft SQL Server ===
===Kivétel típusok===
* [[AdatbServerProgJegyzet20060421|Előadás, 2006.04.21.]] &mdash; MS SQL bevezetés, =IDENTITY=, típusok, operátorok, vezérlési szerkezetek
* [[AdatbServerProgJegyzet20060425|Labor, 2006.04.25.]] &mdash; SQL Management Studio, változók, dátumkezelés, =UPDATE OUTPUT=
* [[AdatbServerProgJegyzet20060428|Előadás, 2006.04.28.]] &mdash; SQL-92 és T-SQL kurzor, kurzor ciklus, tárolt eljárások és függvények
* [[AdatbServerProgJegyzet20060502|Labor, 2006.05.02.]] &mdash; kurzorok, tárolt eljárások, függvények, =CASE=
* [[AdatbServerProgJegyzet20060505|Előadás, 2006.05.05.]] &mdash; DML és DDL triggerek, hibakezelés
* [[AdatbServerProgJegyzet20060509|Labor, 2006.05.09.]] &mdash; triggerek, hibakezelés, nézetek, példa kliens progi kiegészítése
* [[AdatbServerProgJegyzet20060512|Előadás, 2006.05.12.]] &mdash; dinamikus SQL, tranzakciók, XML (vetítős óra, XML nem vizsgaanyag)
* [[AdatbServerProgJegyzet20060516|Labor, 2006.05.16.]] &mdash; 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.


==Minta adatbázisok==
* Rendszer kivételek
** 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


* Cukrász séma: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/cukrasz_sema.pdf
====Névvel ellátott kivételek====
* 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


==Vizsga==
* Kivétel lekezelése: <code class="pre">DECLARE ...
* 50 perc elmélet
<br/>BEGIN ...
** csak papírt használhatunk
<br/>EXCEPTION
** a feladat kidolgozásánál megválaszthatjuk a nyelvet
<br/> WHEN kivételnév [OR kivételnév2 [...]] THEN utasítások;
** példa elméleti kérdésre:
<br/> WHEN OTHERS THEN utasítások;
*** soroljunk fel 3 beépített csomagot
<br/>END;</code>
*** tranzakciók tulajdonságai (ACID)
* Az =OTHERS= blokknak a =EXCEPTION= blokk végére kell kerülnie.
** példa feladatra:
* Gyakori, névvel ellátott kivételek:
*** írjunk tárolt eljárást kivételkezeléssel
** =NO_DATA_FOUND=
* 90 perc gyakorlat
** =TOO_MANY_ROWS=
** bármi használható (jegyzet, net, stb.)
** =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
** 4 feladat, 2 Oracle + 2 Microsoft SQL
** =VALUE_ERROR=: pl. =NULL= értéket akarunk beszúrni =NOT NULL= oszlopba
** az egyik Oracle feladat biztosan egy csomag írása
** =ZERO_DIVIDE=
** a megoldást emailben kell beküldeni
** =CURSOR_ALREADY_OPEN=: kétszer nyitunk meg egy kurzort
* Elővizsga a 2006. tavaszi félévben utolsó héten pénteken. <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.
** =INVALID_CURSOR=
** =CASE_NOT_FOUND=: a =CASE= utasítás szelektora egyik ágra sem illeszkedik
* A nevek a =STANDARD= csomagban vannak összegyűjtve. Nem kell deklarálni őket.
* Kivétel generálása: =RAISE NO_DATA_FOUND;=


* 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.
====Név nélküli rendszer kivételek====
* 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;=


-- [[PallosPeter|Peti]] - 2006.05.18.
====Felhasználói kivételek====
<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>


* {{InLineFileLink|Valaszthato|AdatbServerProg|000_elmeleti_kerdesek.rtf|000_elmeleti_kerdesek.rtf}}: Elméleti kérdések kidolgozása
====Alkalmazás hibák====
* 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&#44; 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]]