<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=2001%3A738%3A2001%3A2078%3A0%3A208%3A37%3A0</id>
	<title>VIK Wiki - Felhasználó közreműködései [hu]</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=2001%3A738%3A2001%3A2078%3A0%3A208%3A37%3A0"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/2001:738:2001:2078:0:208:37:0"/>
	<updated>2026-04-14T23:12:40Z</updated>
	<subtitle>Felhasználó közreműködései</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060414&amp;diff=163861</id>
		<title>AdatbServerProgJegyzet20060414</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060414&amp;diff=163861"/>
		<updated>2013-03-31T19:04:18Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.04.14.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.04.14.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.14.&amp;diff=163860</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.04.14.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.14.&amp;diff=163860"/>
		<updated>2013-03-31T19:04:16Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060414}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display:block; me…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060414}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060407|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.04.14. [[AdatbServerProgJegyzet20060421|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Dinamikus SQL==&lt;br /&gt;
&lt;br /&gt;
Az &#039;&#039;&#039;&#039;&#039;EXECUTE IMMEDIATE&#039;&#039;&#039;&#039;&#039; segítségével stringet lefuttathatunk SQL utasításként.&lt;br /&gt;
&lt;br /&gt;
Tipikus hasznalata:&lt;br /&gt;
* DDL, DCL utasitások tárolt eljárásban&lt;br /&gt;
* lekérdezés dinamikus összeállítása&lt;br /&gt;
&lt;br /&gt;
===Előnyei:===&lt;br /&gt;
* DDL, DCL utasítások&lt;br /&gt;
* &#039;&#039;&#039;WHERE&#039;&#039;&#039; feltétel dinamikusan összeállítható&lt;br /&gt;
* egész utasítás dinamikusan összeállítható&lt;br /&gt;
&lt;br /&gt;
===Hátrányai:===&lt;br /&gt;
* nincs előoptimalizálva&lt;br /&gt;
* végrehajtási terv futtatáskor készül el&lt;br /&gt;
* csak futtatáskor van szintaktikai ellenőrzés&lt;br /&gt;
* csak futtatáskor van jogoultság ellenőrzés&lt;br /&gt;
&lt;br /&gt;
===Szintaxis:===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXECUTE IMMEDIATE dinamikus_string&lt;br /&gt;
	[INTO változó1, változó2, ...]&lt;br /&gt;
	[USING [{IN | OUT | IN OUT}] kötés1,&lt;br /&gt;
			 [{IN | OUT | IN OUT}] kötés2, ...]&lt;br /&gt;
	[{RETURN | RETURNING} INTO kötés1, kötés2, ...] &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* A dinamikus sztring tartalmazza a lefuttatandó SQL utasítást.&lt;br /&gt;
* Az opcionális INTO utáni változókba kerülnek be az adatok, ha az SQL utasítás visszatér valamilyen	egysoros eredménnyel.&lt;br /&gt;
* Az opcionális USING kulcsszó után bemenő paramétereket lehet megadni, amiket a lekerdezesen belül ott lehet hasznalni, ahol egy SQL utasitasban kifejezést lehet hasznalni. A kimenő paraméterek visszatérési értéket kaphatnak.&lt;br /&gt;
&lt;br /&gt;
Dinamikus SQL string lehet&lt;br /&gt;
* egy utasítás (; nélkül)&lt;br /&gt;
* PL/SQL blokk (;-vel)&lt;br /&gt;
&lt;br /&gt;
====Pl.:====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1.)&lt;br /&gt;
DECLARE&lt;br /&gt;
	sql_stmt VARCHAR2(500);&lt;br /&gt;
	nev, anyag, anyag_nev %TYPE;&lt;br /&gt;
	anyagid INT;&lt;br /&gt;
	mennyiseg INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
	sql_stmt := &#039;SELECT anyag_nev &lt;br /&gt;
					FROM anyag&lt;br /&gt;
					WHERE anyag_id = :1&#039;;&lt;br /&gt;
	EXECUTE IMMEDIATE sql_stmt &lt;br /&gt;
		INTO nev &lt;br /&gt;
		USING 3;&lt;br /&gt;
&lt;br /&gt;
	sql_stmt := &#039;UPDATE anyag &lt;br /&gt;
					SET anyag_raktardb = anyag_maxraktar-anygag_minraktar&lt;br /&gt;
					WHERE anyag_id = :x&lt;br /&gt;
					RETURNING anyag_raktardb INTO :2&#039;;&lt;br /&gt;
	EXECUTE IMMEDIATE sql_stmt&lt;br /&gt;
		USING 2&lt;br /&gt;
		RETURNING INTO mennyiseg;&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
2.)&lt;br /&gt;
DECLARE&lt;br /&gt;
	sql_stmt VARCHAR2(500);&lt;br /&gt;
	nev&lt;br /&gt;
	egysegnev&lt;br /&gt;
	ar&lt;br /&gt;
	TYPE anyag_antype IS REF CURSOR;&lt;br /&gt;
	anyag_an anyag_antype;&lt;br /&gt;
BEGIN&lt;br /&gt;
	sql_stmt := &#039;SELECT anyag_nev, anyag_egysegar, egyseg_nev &lt;br /&gt;
					 FROM anyag, egyseg&lt;br /&gt;
					 WHERE anyag_egyseg = egyseg_id AND angyag_id BETWEEN :1 AND :2&#039;;&lt;br /&gt;
	OPEN anyag_an FOR sql_stmt USING 2, 15;&lt;br /&gt;
	LOOP&lt;br /&gt;
		FETCH anyag_an INTO nev, ar, egysegnev;&lt;br /&gt;
		EXIT WHEN anyag_qan%NOTFOUND;&lt;br /&gt;
		DBMS_OUTPUT(...);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
	CLOSE anyag_an;&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
3.)&lt;br /&gt;
CREATE PROCEDURE delete_r (table_name VARCHAR2, condition VARCHAR2 DEFAULT NULL)&lt;br /&gt;
IS&lt;br /&gt;
	where_feltetel VARCHAR2(100) := &#039;WHERE &#039; || condition;&lt;br /&gt;
BEGIN&lt;br /&gt;
	IF condition IS NULL THEN where_feltetel := NULL;&lt;br /&gt;
	END IF;&lt;br /&gt;
	EXECUTE IMMEDIATE &#039;DELETE FROM &amp;quot;&#039; || table_name || &#039;&amp;quot; &#039; || where_feltetel;&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eljárás futtatása==&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
	delete_news(&#039;anyag&#039;, &#039;anyagnev LIKE&#039;&#039;%O%&#039;&#039;&#039;);&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vagy&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Command window-ban:&lt;br /&gt;
	 EXEC delete_news();&lt;br /&gt;
&lt;br /&gt;
==Data dictionary (csak olvasható nézertek)==&lt;br /&gt;
&lt;br /&gt;
* séma objektumok definiciója&lt;br /&gt;
* séma objektumok helyfoglalási adatai&lt;br /&gt;
* oszlopok &#039;&#039;default&#039;&#039; értéka&lt;br /&gt;
* &#039;&#039;constraint&#039;&#039; információk&lt;br /&gt;
* felhasználók nevei, jogosultságai&lt;br /&gt;
* általános DB információk&lt;br /&gt;
&lt;br /&gt;
===USER_TABLES, ALL_TABLES nézetek:===&lt;br /&gt;
* owner, table_name, temporary, ...&lt;br /&gt;
* csak a relációs táblákat tartalmazza&lt;br /&gt;
===USER_ALL_TABLES, ALL_ALL_TABLES===&lt;br /&gt;
* az összes objektumot tartalmazza&lt;br /&gt;
* + tabla_type attributum&lt;br /&gt;
===ALL_TAB_COLUMNS, USER_TAB_COLUMNS===&lt;br /&gt;
* table_name, column_name, data_type, data_length, data_precision, nullable, ...&lt;br /&gt;
* elsőhöz meg a owner is van&lt;br /&gt;
===ALL_TAB_COMMENTS, USER_TAB_COMMENTS===&lt;br /&gt;
* table_name, table_type, comments&lt;br /&gt;
* elsőhöz owner&lt;br /&gt;
* comment felvétele: &amp;lt;pre&amp;gt;COMMENT ON anyag IS &#039;...&#039;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
===ALL_COL_COMMENTS, USER_COL_COMMENTS===&lt;br /&gt;
* &amp;lt;pre&amp;gt; COMMENT ON COLUMN anyag.anyag_id IS &#039;...&#039;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
===ALL_CONSTRAINTS, USER_CONSTRAINTS===&lt;br /&gt;
* (owner), constraint_name, constraint_type (C check, P primary, U, R, V with check option, O read-only nézet), r_owner, r_constraint_name&lt;br /&gt;
(with check option: csak olyan sorokat enged beszúrni a nézetbe, amire teljesül a nézet definiáló SELECT WHERE feltétele)&lt;br /&gt;
===USER_TRIGGERS, ALL_TRIGGERS===&lt;br /&gt;
===USER_ERRORS, ALL_ERRORS===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- [[StMa|Matyi]] - 2006.06.09.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060516&amp;diff=163859</id>
		<title>AdatbServerProgJegyzet20060516</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060516&amp;diff=163859"/>
		<updated>2013-03-31T19:04:15Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.05.16.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.05.16.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.05.16.&amp;diff=163858</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.05.16.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.05.16.&amp;diff=163858"/>
		<updated>2013-03-31T19:04:12Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060516}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060516}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060512|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.05.16.&lt;br /&gt;
&lt;br /&gt;
1. Mire jó a =%TYPE= és a =%ROWTYPE=?&lt;br /&gt;
* =%TYPE=: oszlop típusa&lt;br /&gt;
* =%ROWTYPE=: sor típus&lt;br /&gt;
&lt;br /&gt;
Előny: nem kell emlékezni a típusra (típus hosszra), típus egyszerűen megváltoztatható&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	a anyag_nev%TYPE&lt;br /&gt;
	b anyag_nev%ROWTYPE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Nested table vs index by tabl&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
| || &#039;&#039;&#039;nested&#039;&#039;&#039; || &#039;&#039;&#039;index by&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;méret&#039;&#039;&#039; || korlátlan, de EXTEND-del kell bővíteni || korlátlan &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;index sűrű vagy ritka?&#039;&#039;&#039; || sűrű, de lehet ritka is || ritka &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;init nélkül&#039;&#039;&#039; || NULL || üres &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
3. Kurzornak hogy tudunk paramétert átadni? Hogyan kell deklarálni és használni?&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE CURSOR c1(param típus) IS SELECT ... WHERE param=oszlop&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c1(érték)&lt;br /&gt;
	...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Oracle kivételek csoportosítása&lt;br /&gt;
* rendszer&lt;br /&gt;
** névvel ellátott&lt;br /&gt;
** név nélküli&lt;br /&gt;
* user&lt;br /&gt;
** felhasználói&lt;br /&gt;
* RAISE_APPLICATION_ERROR&lt;br /&gt;
&lt;br /&gt;
5. &lt;br /&gt;
Hatáskör def: ahol tudunk a változóra hivatkozni&lt;br /&gt;
Láthatóság: ahol az egyszerű nevével tudunk rá hivatkozni (az a blokk, ahol deklaráltuk)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;&amp;amp;lt;&amp;amp;lt;címke&amp;amp;gt;&amp;amp;gt;&lt;br /&gt;
DECLARE a INT&lt;br /&gt;
BEGIN&lt;br /&gt;
	DECLARE a VARCHAR(2);&lt;br /&gt;
	BEGIN&lt;br /&gt;
		címke.a&lt;br /&gt;
		a&lt;br /&gt;
	END&lt;br /&gt;
END&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Típus precedencia, mi a szerepe?&lt;br /&gt;
Típusok sorba vannak rendezve, az operátorok a magasabb precedenciájú típussal térnek vissza&lt;br /&gt;
&lt;br /&gt;
7. &lt;br /&gt;
CLOSE:&lt;br /&gt;
DEALLOCATE:&lt;br /&gt;
&lt;br /&gt;
8. inserted, delete átmeneti táblákkal&lt;br /&gt;
&lt;br /&gt;
9. Hogyan adhat vissza információt egy tárolt eljárás SQL szerveren?&lt;br /&gt;
* státusz INT&lt;br /&gt;
* eredményhalmaz&lt;br /&gt;
* kimeneti paraméterek&lt;br /&gt;
* globális kurzor&lt;br /&gt;
Tárolt eljárás futtatása: EXEC [@status=]eljárásnév param1, param2, ...&lt;br /&gt;
&lt;br /&gt;
10&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;kurzor&#039;&#039;&#039; || &#039;&#039;&#039;kurzorváltozó&#039;&#039;&#039; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
kurzor:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	CURSOR c[(param)] IS SELECT...&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c(5);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kurzor változó:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	TYPE c_t IS REF CURSOR;&lt;br /&gt;
	c c_t;&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c1 FOR SELECT ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Közös kód:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;	LOOP&lt;br /&gt;
		FETCH c INTO valt&lt;br /&gt;
		EXIT WHEN c%NOTFOUND&lt;br /&gt;
	END LOOP&lt;br /&gt;
	CLOSE c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kurzor: FOR ciklus csak erre használható&lt;br /&gt;
kurzor változó: másik lekérdezésre is leírható&lt;br /&gt;
&lt;br /&gt;
11. Tranzakciós módok SQL Serveren&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
| || &#039;&#039;&#039;magyarázat&#039;&#039;&#039; || &#039;&#039;&#039;Hogyan váltunk oda?&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;auto commit&#039;&#039;&#039; || Minden utasítás külön tranzakció  || default vagy SET IMPLICIT_TRANSACTIONS OFF &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;explicit&#039;&#039;&#039; || explicit kezdet és vég || BEGIN TRAN ... COMMIT/ROLLBACK &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;implicit&#039;&#039;&#039; || adatmódosító utasítás új tranzakciót nyit, COMMIT/ROLLBACK zárja le || SET IMPLICIT_TRANSACTIONS ON &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
12. Naplózzuk, ha egy diáknak módosul az osztályzata&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TABLE naplo (&lt;br /&gt;
	naploid INT PRIMARY KEY,&lt;br /&gt;
	diakid CHAR(5),&lt;br /&gt;
	examid INT,&lt;br /&gt;
	datum DATE,&lt;br /&gt;
	targynev VARCHAR(50),&lt;br /&gt;
	targykod CHAR(8),&lt;br /&gt;
	regi INT,&lt;br /&gt;
	uj INT&lt;br /&gt;
);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TRIGGER naplozo&lt;br /&gt;
	AFTER UPDATE ON student_exam&lt;br /&gt;
	FOR EACH ROW&lt;br /&gt;
	WHEN (old.sx_grade != new.sx_grade)&lt;br /&gt;
DECLARE&lt;br /&gt;
	tnev VARCHAR(50);&lt;br /&gt;
	tkod CHAR(8);&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT sub_name, sub_id INTO tnev, tkod&lt;br /&gt;
	FROM subject, course, exam&lt;br /&gt;
	WHERE sub_id = cou_subjectid&lt;br /&gt;
		AND ex_courseid = cou_id&lt;br /&gt;
		AND ex_id = :new.sx_examid;&lt;br /&gt;
	INSERT INTO naplo VALUES(&lt;br /&gt;
		nep_seq.NEXTVAL,&lt;br /&gt;
		:new.sx_studentid,&lt;br /&gt;
		:new.sx_examid,&lt;br /&gt;
		sysdate,&lt;br /&gt;
		tnev,&lt;br /&gt;
		tkod,&lt;br /&gt;
		:old.sx_grade,&lt;br /&gt;
		:new.sx_grade);&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
13.&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;create or replace trigger terem_trigger&lt;br /&gt;
  before insert on teacher_room&lt;br /&gt;
  for each row&lt;br /&gt;
declare&lt;br /&gt;
  def int;&lt;br /&gt;
  teadept char(4);&lt;br /&gt;
  roomdept char(4);&lt;br /&gt;
begin&lt;br /&gt;
  if (:new.tr_default = 1) then&lt;br /&gt;
	 select count(tr_default) into def from teacher_room&lt;br /&gt;
	 where tr_teacherid = :new.tr_teacherid and tr_default=1;&lt;br /&gt;
	 if (def=0) then&lt;br /&gt;
		select tea_dept into teadept from teacher where tea_id=:new.tr_teacherid;&lt;br /&gt;
		select room_dept into roomdept from room where room_id=:new.tr_roomid;&lt;br /&gt;
		if (teadept != roomdept) then&lt;br /&gt;
		  raise_application_error(-20102, &#039;Rossz épületben van&#039;);&lt;br /&gt;
		end if;&lt;br /&gt;
	 else&lt;br /&gt;
		raise_application_error(-20101, &#039;Már van alapértelmezett terem&#039;);&lt;br /&gt;
	 end if;&lt;br /&gt;
  else&lt;br /&gt;
	 select count(*) into def from teacher_room&lt;br /&gt;
	 where tr_teacherid=:new.tr_teacherid and tr_default=0;&lt;br /&gt;
	 if (def&amp;gt;3) then&lt;br /&gt;
		raise_application_error(-20103, &#039;Túl sok terem&#039;);&lt;br /&gt;
	 end if;&lt;br /&gt;
  end if;&lt;br /&gt;
end terem_trigger;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
14.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;create or replace procedure anyag_listazas(anev varchar2, fszam out int, tszam out int) is&lt;br /&gt;
  cursor c1 is select felkesz_nev from felkesz, felkesz_anyag, anyag &lt;br /&gt;
	 where anyag_nev=anev and anyag_id=fa_anyagid and felkesz_id=fa_felkeszid;&lt;br /&gt;
  cursor c2 is select termek_nev from termek, termek_anyag, anyag &lt;br /&gt;
	 where anyag_nev=anev and anyag_id=ta_anyagid and termek_id=ta_termekid;&lt;br /&gt;
begin&lt;br /&gt;
  -- ugyanez a termékre is&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
  fszam:=0;&lt;br /&gt;
  dbms_output.put_line(&#039;A &#039; ||| anev || &#039; a következ&amp;amp;otilde; félkészekben szerepel&#039;);&lt;br /&gt;
  for c1_rec in c1 loop&lt;br /&gt;
	 dbms_output.put_line(&#039;	 &#039; | c1_rec.felkesz_nev);&lt;br /&gt;
	 fszam := c1%rowcount;&lt;br /&gt;
  end loop;&lt;br /&gt;
  if (fszam=0) then&lt;br /&gt;
	 dbms_output.put_line(&#039;	 -----&#039;);&lt;br /&gt;
  end if;&lt;br /&gt;
end anyag_listazas;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
16.&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;create procedure listazas&lt;br /&gt;
as&lt;br /&gt;
  declare c1 cursor for select sub_id, sub_name from subject&lt;br /&gt;
  declare @subid char(8), @subname char(50)&lt;br /&gt;
  open c1&lt;br /&gt;
  fetch c1 into @subid, @subname&lt;br /&gt;
  while @@fetch_status=0&lt;br /&gt;
  begin&lt;br /&gt;
	 print @subid + &#039; &#039; + @subname&lt;br /&gt;
	 declare c2 cursor for&lt;br /&gt;
		select distinct cou_semestername from course where cou_subjectid=@subid&lt;br /&gt;
	 declare @sem char(5)&lt;br /&gt;
	 open c2&lt;br /&gt;
	 fetch c2 into @sem&lt;br /&gt;
	 while @@fetch_status=0&lt;br /&gt;
	 begin&lt;br /&gt;
		print &#039;	  &#039; + @sem&lt;br /&gt;
		fetch c2 into @sem&lt;br /&gt;
	 end&lt;br /&gt;
	 deallocate c2&lt;br /&gt;
	 fetch c1 into @subid, @subname&lt;br /&gt;
  end&lt;br /&gt;
  deallocate c1&lt;br /&gt;
go&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.05.16.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060509&amp;diff=163857</id>
		<title>AdatbServerProgJegyzet20060509</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060509&amp;diff=163857"/>
		<updated>2013-03-31T19:04:10Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.05.09.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.05.09.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.05.09.&amp;diff=163856</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.05.09.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.05.09.&amp;diff=163856"/>
		<updated>2013-03-31T19:04:08Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060509}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060509}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060505|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.05.09. [[AdatbServerProgJegyzet20060512|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==T-SQL Triggerek, Kivételek==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj triggert, ami csak akkor enged felvenni egy kurzust egy hallgatónak, ha a limitnél&lt;br /&gt;
kevesebben jelentkeztek eddig rá! Tegyük fel, hogy csak kliens oldalról&lt;br /&gt;
engedélyezünk kurzus felvételt, így egyszerre biztosan egy sort szeretnénk beszúrni.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TRIGGER courselimit ON student_course INSTEAD OF INSERT&lt;br /&gt;
AS&lt;br /&gt;
	DECLARE @limit INT, @studentcount INT&lt;br /&gt;
	SELECT @limit=cou_limit FROM course, inserted&lt;br /&gt;
		WHERE cou_id=inserted.sc_courseid&lt;br /&gt;
	SELECT @studentcount=COUNT(*) FROM student_course, inserted&lt;br /&gt;
		WHERE student_course.sc_courseid=inserted.sc_courseid&lt;br /&gt;
	IF (@studentcount&amp;lt;@limit)&lt;br /&gt;
		INSERT INTO student_course SELECT * FROM inserted&lt;br /&gt;
	ELSE&lt;br /&gt;
		RAISERROR(&#039;kurzus betelt&#039;, 10, 1)&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tesztelés:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;UPDATE course SET cou_limit=10 WHERE cou_id=6&lt;br /&gt;
INSERT INTO student_course (sc_studentid, sc_courseid, sc_date)&lt;br /&gt;
	VALUES (&#039;SDFQWE&#039;, 6, getdate())&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Oldd meg az előző feladatot úgy, hogy feltesszük, hogy egyszerre több sort is be&lt;br /&gt;
tudunk szúrni a táblába!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TRIGGER courselimit ON student_course INSTEAD OF INSERT&lt;br /&gt;
AS&lt;br /&gt;
	SET NOCOUNT ON&lt;br /&gt;
	DECLARE @limit INT, @studentcount INT&lt;br /&gt;
	DECLARE @studentid CHAR(6), @courseid INT, @date DATETIME&lt;br /&gt;
	DECLARE cc CURSOR FOR&lt;br /&gt;
		SELECT * FROM inserted&lt;br /&gt;
	OPEN cc&lt;br /&gt;
	FETCH cc INTO @studentid, @courseid, @date&lt;br /&gt;
	WHILE @@FETCH_STATUS=0&lt;br /&gt;
	BEGIN&lt;br /&gt;
		SELECT @limit=cou_limit FROM course WHERE cou_id=@courseid&lt;br /&gt;
		SELECT @studentcount=COUNT(*) FROM student_course&lt;br /&gt;
			WHERE sc_courseid=@courseid&lt;br /&gt;
		IF @studentcount&amp;lt;@limit&lt;br /&gt;
		BEGIN&lt;br /&gt;
			INSERT INTO student_course VALUES (@studentid, @courseid, @date)&lt;br /&gt;
			print @studentid + &#039; jelentkezett a &#039; + convert(VARCHAR, @courseid) + &#039; kurzusra&#039;&lt;br /&gt;
		END ELSE&lt;br /&gt;
			print @studentid + &#039; nem fért bele a &#039; + convert(VARCHAR, @courseid) + &#039; kurzusba&#039;&lt;br /&gt;
		FETCH cc INTO @studentid, @courseid, @date&lt;br /&gt;
	END&lt;br /&gt;
	CLOSE cp&lt;br /&gt;
	DEALLOCATE cp&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tesztelés:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;UPDATE course SET cou_limit=10 WHERE cou_id=6&lt;br /&gt;
DELETE FROM student_course WHERE sc_courseid=6&lt;br /&gt;
INSERT INTO student_course SELECT stud_id, 6, getdate() FROM student&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj tárolt eljárást, amivel egy diák egy kurzusra tud jelentkezni. Az eljárás bemenő&lt;br /&gt;
paramétere a diák neptun kódja, a szemeszter kód és a tárgy kódja legyen. Az&lt;br /&gt;
eljáráson belül kapd el a hibákat, és írasd ki, hogy mi volt a hiba! Próbáld ki az&lt;br /&gt;
eljárást különböző hibákat generálva!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE PROCEDURE targyjelentkezes&lt;br /&gt;
	@student CHAR(6),&lt;br /&gt;
	@subject CHAR(8),&lt;br /&gt;
	@semester CHAR(5),&lt;br /&gt;
	@coursenumber INT&lt;br /&gt;
AS&lt;br /&gt;
	SET NOCOUNT ON&lt;br /&gt;
	BEGIN TRY&lt;br /&gt;
		INSERT INTO student_course &lt;br /&gt;
			SELECT @student, cou_id, getdate() FROM course &lt;br /&gt;
				WHERE @subject=cou_subjectid&lt;br /&gt;
				AND @semester=cou_semestername&lt;br /&gt;
				AND @coursenumber=cou_coursenumber&lt;br /&gt;
		IF @@rowcount=0&lt;br /&gt;
			RAISERROR(&#039;nincs ilyen kurzus&#039;, 10, 1)&lt;br /&gt;
	END TRY&lt;br /&gt;
	BEGIN CATCH&lt;br /&gt;
		IF @@ERROR=0&lt;br /&gt;
			print &#039;ok&#039;&lt;br /&gt;
		ELSE IF ERROR_NUMBER()=2627&lt;br /&gt;
			print &#039;többszörös jelentkezés&#039;&lt;br /&gt;
		ELSE BEGIN&lt;br /&gt;
			print &#039;egyéb hiba&#039;&lt;br /&gt;
			print ERROR_NUMBER()&lt;br /&gt;
			print ERROR_MESSAGE()&lt;br /&gt;
		END&lt;br /&gt;
	END CATCH&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tesztelés:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;EXEC targyjelentkezes &#039;XSFXCF&#039;, &#039;VIFO1016&#039;, &#039;20012&#039;, 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Készíts egy nézetet, ami a következ- nev2 oszlopokat tartalmazza: név, mennyiseg,&lt;br /&gt;
egység, ár! Az egység a nézetben ne kóddal jelenjen meg, hanem megnevezéssel! Az&lt;br /&gt;
ár származtatott értékként kerüljön kiszámításra a nézeten belül. Írj triggert, aminek&lt;br /&gt;
segítségével új félkész terméket lehet felvenni az adatbázisba a létrehozott nézeten&lt;br /&gt;
keresztül! Amennyiben a beadott egység még nem szerepel az egység táblában, úgy&lt;br /&gt;
az kerüljön felvételre. A beadott ár értéket ignoráld, mivel az ár egy származtatott&lt;br /&gt;
érték!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; A VIAU9159 nev2 C# project MainClien.exe futtatható kódja egy korlátozott&lt;br /&gt;
funkcionalitásokkal bíró kliens felületet nyújt a tanár-diák adatbázishoz. A feladat a&lt;br /&gt;
kliens által meghívott tárolt eljárások megírása, aminek következtében a programot&lt;br /&gt;
lehet használni.&lt;br /&gt;
&lt;br /&gt;
A program m2ködése:&lt;br /&gt;
&lt;br /&gt;
A program segítségével a különböz- diákokhoz tárgyakat lehet felvenni, illetve&lt;br /&gt;
leadni.&lt;br /&gt;
A belépéskor a felhasználói név és a jelszó megadása után megjelenik egy felület, ami&lt;br /&gt;
különböz- listákat tartalmaz.&lt;br /&gt;
A bal oldali lista a diákok listája. Ennek feltöltésére a program a getStudents&lt;br /&gt;
tárolt eljárást hívja meg. A tárolt eljárás visszatérése egy adathalmaz, aminek az els-&lt;br /&gt;
oszlopában a diák azonosítója áll, a másodikban pedig az, amit meg szeretnénk&lt;br /&gt;
jeleníteni a listában.&lt;br /&gt;
&lt;br /&gt;
A félév kódja legördül- menü feltöltéséhez a getSemesters tárolt eljárást kell&lt;br /&gt;
meghívni. Ennek is a visszatér- adathalmazának els- oszlopa tartalmazza a&lt;br /&gt;
szemeszter kódját, a második oszlop pedig a megjelenítend- szöveget. Itt érdemes&lt;br /&gt;
használni az el-z- gyakorlatok egyikén megírt szemeszter név konvertáló függvényt.&lt;br /&gt;
Ha kiválasztunk egy szemesztert, az adott szemeszterhez az alsó listában felsorolásra&lt;br /&gt;
kerülnek az adott szemeszter kurzusai. Ezt a getCoursesOfSemester&lt;br /&gt;
@semester char(5) tárolt eljárás hívásával lehet megtenni. Az eljárás, mint az&lt;br /&gt;
eddigiek két oszloppal tér vissza. Az els-ben a kurzus azonosítója áll, a másodikban a&lt;br /&gt;
megjelenítend- szöveg. Itt érdemes a tárgy kódját, a tárgy nevét, a kurzus típusát&lt;br /&gt;
(el-adás, gyakorlat vagy labor a CASE függvény használatával), tárgyért felel-s tanár&lt;br /&gt;
nevét kiíratni.&lt;br /&gt;
&lt;br /&gt;
A legfels- listában a kiválasztott diák által az adott félévben felvett kurzusok&lt;br /&gt;
szerepelnek. Ezt a getStudentsCourses @studid char(6), @semester&lt;br /&gt;
char(5) tárolt eljárás hívásával lehet megoldani. Az eljárás azonos módon kell,&lt;br /&gt;
hogy visszaadja az adatokat, mint a kurzust listázó eljárás.&lt;br /&gt;
A jelentkezik gomb megnyomásakor a kiválasztott hallgatóhoz felvételre kerül a&lt;br /&gt;
kiválasztott kurzus. Ezt az addCourseToStudent @studid char(6),&lt;br /&gt;
@couid int eljárás hívásával lehet megtenni. Az eljárásnak le kell ellen-riznie,&lt;br /&gt;
hogy még befér-e a hallgató az adott kurzusra. Ha igen, fel kell venni, ha nem, akkor&lt;br /&gt;
egy hibát kell generálni a kliens felé. Ügyelj a tranzakció kezelésre is!&lt;br /&gt;
A lead gombbal a kiválasztott hallgató kiválasztott kurzusát lehet törölni a listából.&lt;br /&gt;
Ezt a deleteCourseFromStudent @studid char(6), @couid int&lt;br /&gt;
tárolt eljárással lehet megtenni.&lt;br /&gt;
&lt;br /&gt;
Írd meg a szövegben megjelölt tárolt eljárásokat! Ügyelj a tranzakció kezelésre és a&lt;br /&gt;
hiba kezelésre! Hibát a RAISERROR függvénnyel lehet dobni a kliens felé (a&lt;br /&gt;
részleteket nézd meg a helpben!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Módosítsd úgy a szemeszter kurzusainak listáját listázó tárolt eljárást, hogy&lt;br /&gt;
tartalmazza a kurzus létszámkorlátját, és a jelentkezettek számát is!&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.05.09.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060502&amp;diff=163855</id>
		<title>AdatbServerProgJegyzet20060502</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060502&amp;diff=163855"/>
		<updated>2013-03-31T19:04:07Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.05.02.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.05.02.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.05.02.&amp;diff=163854</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.05.02.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.05.02.&amp;diff=163854"/>
		<updated>2013-03-31T19:04:01Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060502}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060502}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060428|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.05.02. [[AdatbServerProgJegyzet20060505|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==T-SQL Kurzorok, Tárolt eljárások, Függvények==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Írj tárolt eljárást, ami lekérdezi a FUTAM_PILOTA tábla adatait!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE PROCEDURE list_futam_pilota&lt;br /&gt;
AS&lt;br /&gt;
	SELECT * FROM futam_pilota&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj tárolt eljárást, aminek bemeneti paramétere egy helyszín pálya neve és a szezon,&lt;br /&gt;
eredménye pedig az adott futam eredménye (pilóta neve, helyezése, ideje, teljesített&lt;br /&gt;
körök száma)! Az eljárás kimeneti paramétere legyen az eredményhalmaz sorainak a&lt;br /&gt;
száma! Írj batch szkriptet, ami meghívja az eljárást, a kimeneti paraméter értékét&lt;br /&gt;
pedig kiírja a kimenetre!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE PROCEDURE eredmenylista&lt;br /&gt;
	@palyanev VARCHAR(50),&lt;br /&gt;
	@szezon INT,&lt;br /&gt;
	@sorokszama INT OUTPUT&lt;br /&gt;
AS&lt;br /&gt;
	SELECT nev, helyezes, ido, teljesitettkorokszama&lt;br /&gt;
	FROM pilota, futam_pilota, futam, helyszin&lt;br /&gt;
	WHERE palya = @palyanev&lt;br /&gt;
		AND ev = @szezon&lt;br /&gt;
		AND futam_pilota.futamid = futam.futamid&lt;br /&gt;
		AND futam_pilota.pilotaid = pilota.pilotaid&lt;br /&gt;
		AND futam.helyszinid = helyszin.helyszinid&lt;br /&gt;
	ORDER BY ISNULL(helyezes, 9999)&lt;br /&gt;
	SET @sorokszama = @@ROWCOUNT&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE @sorokszama INT&lt;br /&gt;
EXEC eredmenylista &#039;Melbourne&#039;, 2005, @sorokszama OUTPUT&lt;br /&gt;
print @sorokszama&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj tárolt eljárást, ami a kimenetre listázza (print utasítás) a bemeneti paraméterben&lt;br /&gt;
megkapott évben csapatonként a pilóták adatait. Az eljárás státusz információban&lt;br /&gt;
jelölje, hogy a bemeneti paraméter alapján sikerült-e eredményt szolgáltatnia, azaz&lt;br /&gt;
volt-e legalább egy csapat az adott szezonban! Az eljárást próbáld is ki!&lt;br /&gt;
&lt;br /&gt;
Az eredmény így nézzen ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;Renault (Flavio Briatore)&lt;br /&gt;
	Fernando Alonso (Elsoszamu pilota)&lt;br /&gt;
	Giancarlo Fisichella (Masodszamu pilota)&lt;br /&gt;
	Franck Montagny (Teszt pilota)&lt;br /&gt;
McLaren Mercedes (Ron Dennis)&lt;br /&gt;
	Kimi Raikkönen (Elsoszamu pilota)&lt;br /&gt;
	Juan-Pablo Montoya (Masodszamu pilota)&lt;br /&gt;
	Alexander Wurz (Teszt pilota)&lt;br /&gt;
	Pedro de la Rosa (Teszt pilota)&lt;br /&gt;
...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE PROCEDURE csapattaglista&lt;br /&gt;
	@csapatszezonid INT&lt;br /&gt;
AS&lt;br /&gt;
	DECLARE cp CURSOR FOR &lt;br /&gt;
		SELECT nev, &lt;br /&gt;
			CASE pilotatipus WHEN &#039;1&#039; THEN &#039;Elsőszámú pilóta&#039;&lt;br /&gt;
				WHEN &#039;2&#039; THEN &#039;Másodszámú pilóta&#039;&lt;br /&gt;
				WHEN &#039;T&#039; THEN &#039;Teszt pilóta&#039;&lt;br /&gt;
			END&lt;br /&gt;
		FROM pilota, csapat_pilota&lt;br /&gt;
		WHERE csapatszezonid = @csapatszezonid&lt;br /&gt;
			AND csapat_pilota.pilotaid = pilota.pilotaid&lt;br /&gt;
		ORDER BY pilotatipus, nev&lt;br /&gt;
	DECLARE @nev NVARCHAR(50), @pilotatipus VARCHAR(30)&lt;br /&gt;
	OPEN cp&lt;br /&gt;
	FETCH cp INTO @nev, @pilotatipus&lt;br /&gt;
	WHILE @@FETCH_STATUS=0&lt;br /&gt;
	BEGIN&lt;br /&gt;
		print &#039;	&#039; + @nev + &#039; (&#039; + @pilotatipus + &#039;)&#039;&lt;br /&gt;
		FETCH cp INTO @nev, @pilotatipus&lt;br /&gt;
	END&lt;br /&gt;
	CLOSE cp&lt;br /&gt;
	DEALLOCATE cp&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE PROCEDURE csapatlista&lt;br /&gt;
	@szezon INT&lt;br /&gt;
AS&lt;br /&gt;
	DECLARE cc CURSOR FOR &lt;br /&gt;
		SELECT csapatszezonid, nev, fonoknev&lt;br /&gt;
		FROM csapat, csapat_szezon&lt;br /&gt;
		WHERE ev = @szezon &lt;br /&gt;
			AND csapat_szezon.csapatid = csapat.csapatid&lt;br /&gt;
	DECLARE @csapatszezonid INT, @nev NVARCHAR(50), @fonoknev NVARCHAR(50)&lt;br /&gt;
	OPEN cc&lt;br /&gt;
	FETCH cc INTO @csapatszezonid, @nev, @fonoknev&lt;br /&gt;
	WHILE @@FETCH_STATUS=0&lt;br /&gt;
	BEGIN&lt;br /&gt;
		print @nev + &#039; (&#039; + @fonoknev + &#039;)&#039;&lt;br /&gt;
		EXEC csapattaglista @csapatszezonid&lt;br /&gt;
		FETCH cc INTO @csapatszezonid, @nev, @fonoknev&lt;br /&gt;
	END&lt;br /&gt;
	CLOSE cc&lt;br /&gt;
	DEALLOCATE cc&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;EXEC csapatlista 2005&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj függvényt, ami kiszámítja a bementként megkapott pilóta szintén bemenetként&lt;br /&gt;
kapott évben elért eddigi pontszámát! Írj lekérdezést, ami minden pilóta neve mellé&lt;br /&gt;
kiírja a pontszámát!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE FUNCTION pilotapontszam(&lt;br /&gt;
	@pilota NVARCHAR(50),&lt;br /&gt;
	@szezon INT&lt;br /&gt;
) RETURNS INT&lt;br /&gt;
AS BEGIN&lt;br /&gt;
	DECLARE @pontszam INT&lt;br /&gt;
	SELECT&lt;br /&gt;
		@pontszam = SUM(CASE helyezes&lt;br /&gt;
			WHEN 1 THEN 10&lt;br /&gt;
			WHEN 2 THEN 8&lt;br /&gt;
			WHEN 3 THEN 6&lt;br /&gt;
			WHEN 4 THEN 5&lt;br /&gt;
			WHEN 5 THEN 4&lt;br /&gt;
			WHEN 6 THEN 3&lt;br /&gt;
			WHEN 7 THEN 2&lt;br /&gt;
			WHEN 8 THEN 1&lt;br /&gt;
			ELSE 0&lt;br /&gt;
		END)&lt;br /&gt;
	FROM futam, futam_pilota, pilota&lt;br /&gt;
	WHERE ev = @szezon&lt;br /&gt;
		AND nev = @pilota&lt;br /&gt;
		AND futam_pilota.futamid = futam.futamid&lt;br /&gt;
		AND futam_pilota.pilotaid = pilota.pilotaid&lt;br /&gt;
	RETURN @pontszam&lt;br /&gt;
END&lt;br /&gt;
GO&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;print dbo.pilotapontszam(&#039;Jarno Trulli&#039;, 2005)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj egy tábla visszatérésű függvényt, aminek bemenete egy évszám, a tábla pedig&lt;br /&gt;
tartalmazza az adott évben szerződésben álló pilóták addig elért pontjainak az&lt;br /&gt;
összegét! A függvényt próbáld is ki!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.05.02.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060421&amp;diff=163853</id>
		<title>AdatbServerProgJegyzet20060421</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060421&amp;diff=163853"/>
		<updated>2013-03-31T19:03:59Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.04.21.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.04.21.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.21.&amp;diff=163852</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.04.21.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.21.&amp;diff=163852"/>
		<updated>2013-03-31T19:03:55Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060421}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060421}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	code.precompact { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px; line-height:13px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060418|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.04.21. [[AdatbServerProgJegyzet20060425|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Microsoft SQL Server bevezetés==&lt;br /&gt;
&lt;br /&gt;
===Rendszer objektumok és kapcsolataik===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;precompact&amp;quot;&amp;gt;+------=	  * +-----------+ *	  +-------------+=&lt;br /&gt;
&amp;amp;#124; példány |-------|| adatbázis ||-------|| felhasználó &lt;br /&gt;
|}&lt;br /&gt;
+------=		 +-----------+		 +-------------+&amp;lt;/code&amp;gt;=&lt;br /&gt;
&lt;br /&gt;
===Rendszer adatbázisok===&lt;br /&gt;
&lt;br /&gt;
* Master: rendszer szintű információk&lt;br /&gt;
** SQL init adatok&lt;br /&gt;
** többi adatbázis helye&lt;br /&gt;
* TempDB: átmeneti táblák és tárolt eljárások&lt;br /&gt;
* Model: ez alapján jön létre egy új adatbázis&lt;br /&gt;
* MSDB: SQL Server Agent használja&lt;br /&gt;
** figyelmeztetések&lt;br /&gt;
** munkák ütemezése&lt;br /&gt;
&lt;br /&gt;
adat file: *.mdf, *.ndf&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
log file: *.ldf&lt;br /&gt;
&lt;br /&gt;
A rendszer szintű információkat az =sp_= kezdetű tárolt eljárásokkal lehet lekérdezni és müdosítani.&lt;br /&gt;
&lt;br /&gt;
==Identity==&lt;br /&gt;
&lt;br /&gt;
Kulcsgeneráló objektum. 1 táblának legfeljebb 1 identity oszlopa lehet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TABLE anyag (&lt;br /&gt;
	anyag_id INT IDENTITY PRIMARY KEY,&lt;br /&gt;
	anyag_nev VARCHAR(50) NOT NULL,&lt;br /&gt;
	lejar DATETIME&lt;br /&gt;
)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Megadható a kulcs kezdőértéke és növekménye is: =IDENTITY(start, incr)=. Default érték: 1-től indul és egyesével nő.&lt;br /&gt;
&lt;br /&gt;
* Beszúrás generált kulccsal: =INSERT INTO anyag VALUES (&#039;cukor&#039;, NULL)=&lt;br /&gt;
* Beszúrás felhasználó által definiált kulccsal: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;SET IDENTITY_INSERT anyag ON&lt;br /&gt;
&amp;lt;br/&amp;gt;INSERT INTO anyag(anyag_id, anyag_nev) VALUES(2, &#039;liszt&#039;)&lt;br /&gt;
&amp;lt;br/&amp;gt;SET IDENTITY_INSERT anyag OFF&amp;lt;/code&amp;gt; Az =INSERT= utasításon belül ilyenkor kötelező felsorolni az oszlopokat.&lt;br /&gt;
* Session utoljára generált kulcsának lekérdezése (globális változó, nem táblafüggő): =SELECT @@IDENTITY=&lt;br /&gt;
* Adott táblába utoljára beszúrt kulcs: =IDENT_CURRENT(táblanév)=&lt;br /&gt;
* Identity kezdeti beállításainak lekérdezése: =IDENT_SEED(táblanév)=, =IDENT_INCR(táblanév)=&lt;br /&gt;
&lt;br /&gt;
==SQL Server programozása==&lt;br /&gt;
&lt;br /&gt;
A szerver Transact-SQL (T-SQL) nyelven programozható.&lt;br /&gt;
A végrehajtás batchenként történik, a batcheket =GO= utasítás zárja le. Az utasítások végére nem kell pontosvessző.&lt;br /&gt;
&lt;br /&gt;
===Komment===&lt;br /&gt;
&lt;br /&gt;
* egysoros: =--=&lt;br /&gt;
* többsoros: =/* */=, egymásba ágyazható (az Oracle-ben nem)&lt;br /&gt;
&lt;br /&gt;
===Azonosítók===&lt;br /&gt;
&lt;br /&gt;
* Szabályos: ([A-Z0-9_]|@{1,2}#{1,2})[A-Z0-9_$]*&lt;br /&gt;
** =@=: lokális változó vagy paraméter&lt;br /&gt;
** =@@=: rendszerváltozó vagy -függvény&lt;br /&gt;
** =#=: átmeneti tábla vagy eljárás&lt;br /&gt;
** =##=: globális átmeneti tábla vagy eljárás&lt;br /&gt;
* Delimited: [ ] vagy &amp;quot; &amp;quot; jelek közé kell írni, speciális karaktereket is tartalmazhat&lt;br /&gt;
* Deklaráció: =DECLARE @változónév típus, @változónév típus, ...=&lt;br /&gt;
&amp;lt;br/&amp;gt; Alapértéket nem lehet megadni, a változók &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-ra inicializálódnak. Változó bárhol deklarálható, nem csak blokk elején.&lt;br /&gt;
* Értékadás:&lt;br /&gt;
** =SET @a = 5=&lt;br /&gt;
** =SET @a = (SELECT ...)=. A =SELECT= 0 vagy 1 soros és 1 oszlopos eredménnyel kell, hogy visszatérjen, különben hiba történik. Ha 0 sorral tér vissza, a változó =NULL= értéket kap.&lt;br /&gt;
** =SELECT @a=oszlop1, @b=oszlop2, ... FROM ...= &lt;br /&gt;
&amp;lt;br/&amp;gt; Ha a =SELECT= 0 sorral tér vissza, &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-t vesz föl minden változó, több soros eredmény esetén az utolsó sor mezői kerülnek a változókba. A legutolsó SQL utasítás által érintett sorok számát a =@@ROWCOUNT= változó adja vissza.&lt;br /&gt;
&lt;br /&gt;
===Adattípusok===&lt;br /&gt;
&lt;br /&gt;
* Egészek&lt;br /&gt;
** =BIGINT=: 64 bit, előjeles&lt;br /&gt;
** =INT=: 32 bit, előjeles&lt;br /&gt;
** =SMALLINT=: 16 bit, előjeles&lt;br /&gt;
** =TINYINT=: 8 bit, előjel nélküli&lt;br /&gt;
** =BIT=: 0 vagy 1 értékű&lt;br /&gt;
* Fixpontos&lt;br /&gt;
** =DECIMAL=, =NUMERIC=: legfeljebb 38 jegyű&lt;br /&gt;
** =MONEY=, =SMALLMONEY=&lt;br /&gt;
* Lebegőpontos&lt;br /&gt;
** =FLOAT=: 8 byte-os lebegőpontos, 15 számjegy pontosságú&lt;br /&gt;
** =REAL=: 4 byte-os lebegőpontos, 7 számjegy pontosságú&lt;br /&gt;
* Dátum&lt;br /&gt;
** =DATETIME=: 1753. január 1. és 9999. december 31. közötti időpontot tárol&lt;br /&gt;
** =SMALLDATETIME=: 1900. január 1. és 2079. január 6. közötti időpontot tárol&lt;br /&gt;
** Elfogadott dátum formátumok: =&#039;mm/dd/yyyy&#039;=, =&#039;mm-dd-yyyy&#039;=, =&#039;yyyy-mm-dd&#039;=, stb.&lt;br /&gt;
** a =SET DATEFORMAT= utasítással egyéb formátumokban is beolvasható a dátum&lt;br /&gt;
* String&lt;br /&gt;
** =CHAR=, =VARCHAR=: &amp;lt;=8000 byte-os fix/változó hosszúságú string&lt;br /&gt;
** =NCHAR=, =NVARCHAR=: &amp;lt;=8000 byte-os (4000 karakteres) fix/változó hosszúságú unicode string&lt;br /&gt;
** =TEXT=, =NTEXT=: &amp;lt;=2 GB hosszú string, a string műveletek nem alkalmazhatók rá&lt;br /&gt;
** =VARCHAR(MAX)=, =NVARCHAR(MAX)=: &amp;lt;=2 GB hosszú string, string függvények alkalmazhatók rá, az SQL Server 2005-ben jelentek meg.&lt;br /&gt;
** =BINARY=, =VARBINARY=: &amp;lt;=8000 byte-os fix/változó hosszúságú bináris string&lt;br /&gt;
** =IMAGE=: &amp;lt;=2 GB-os bináris string&lt;br /&gt;
* Egyéb&lt;br /&gt;
** =BOOLEAN=: implicit típus, csak kifejezésben lehet használni, nem lehet oszlopnak vagy változónak értékül adni&lt;br /&gt;
** =CURSOR=&lt;br /&gt;
** =SQL_VARIANT=: típus nélküli változó&lt;br /&gt;
** =TABLE=: eredményhalmazt tárol későbbi feldolgozásig&lt;br /&gt;
** =TIMESTAMP=&lt;br /&gt;
** =UNIQUEIDENTIFIER=: globálisan egyedi azonosító&lt;br /&gt;
** =XML=&lt;br /&gt;
&lt;br /&gt;
====Típus precedencia====&lt;br /&gt;
&lt;br /&gt;
Ha egy operátor 2 oldalán különböző típusok állnak, az eredmény a magasabb precedenciájú típus lesz.&lt;br /&gt;
&lt;br /&gt;
=SQL_VARIANT= &amp;gt; =DATETIME= &amp;gt; =SMALLDATETIME= &amp;gt; =FLOAT= &amp;gt; =REAL= &amp;gt; =DECIMAL= &amp;gt; =MONEY= &amp;gt; =SMALLMONEY= &amp;gt; =BIGINT= &amp;gt; =INT= &amp;gt; =SMALLINT= &amp;gt; ... &amp;gt; =NVARCHAR= &amp;gt; =VARCHAR= &amp;gt; =CHAR=&lt;br /&gt;
&lt;br /&gt;
A fenti precedencia sor következménye pl. az, hogy stringet és számot csak típuskonverzió után lehet összefűzni. Castolni a =CONVERT(típusnév[(paraméterek)], érték)= függvénnyel lehet. Pl. =CONVERT(numeric(10,2), 1.23456)=&lt;br /&gt;
&lt;br /&gt;
===Operátorok===&lt;br /&gt;
egy operandusú műveletek: =+=, =-=, =~=&lt;br /&gt;
====operátor precedencia:====&lt;br /&gt;
	1 =+ - ~= előjel&lt;br /&gt;
	2 =* / %=&lt;br /&gt;
	3 =+ -= additív és összefűző&lt;br /&gt;
	4 =&amp;lt; &amp;gt; ...=&lt;br /&gt;
	5 =^ &amp;amp; |=&lt;br /&gt;
	6 =NOT=&lt;br /&gt;
	7 =AND=&lt;br /&gt;
	8 =ALL ANY=&lt;br /&gt;
	9 =SET=&lt;br /&gt;
&lt;br /&gt;
===Batch===&lt;br /&gt;
====Def.:====&lt;br /&gt;
amit egyszerre küldünk a szervernek, utasítások sorozata&lt;br /&gt;
====Kliens:====&lt;br /&gt;
* Query Analyzer (2000)&lt;br /&gt;
* Management Studio (2005)&lt;br /&gt;
====Blokk:====&lt;br /&gt;
batch vagy =BEGIN ... END=&lt;br /&gt;
&lt;br /&gt;
===Vezérlési szerkezetek===&lt;br /&gt;
&lt;br /&gt;
====Feltételes utasítások====&lt;br /&gt;
=IF bool_kif utasítás ELSE utasítás=&lt;br /&gt;
* több utasítás esetén =BEGIN END= közé kell tenni&lt;br /&gt;
=IF (bool értékű SQL utasítás) utasítás ELSE utasítás=&lt;br /&gt;
&lt;br /&gt;
=====Pl.:=====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IF (EXISTS (SELECT * FROM anyag))&lt;br /&gt;
  print(&#039;nem üres&#039;)&lt;br /&gt;
ELSE&lt;br /&gt;
  print(&#039;üres&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* =THEN= és =ELSE= ágban ugyan arra a táblára kell vonatkoznia a =CREATE TABLE= ill. a =SELECT= utasításoknak&lt;br /&gt;
&lt;br /&gt;
====Ciklus====&lt;br /&gt;
=WHILE bool_kifejezés utasítás=&lt;br /&gt;
* kilépes: =BREAK=&lt;br /&gt;
* folytatás: =CONTINUE=&lt;br /&gt;
====Ugrás====&lt;br /&gt;
=GOTO címke=&lt;br /&gt;
* címke def.: =cimke:=&lt;br /&gt;
* =RETURN=&lt;br /&gt;
====Várakozás====&lt;br /&gt;
=WAIT FOR {DELAY idő | TIME időpont}=&lt;br /&gt;
====Case függvény====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CASE bemeneti kif.&lt;br /&gt;
	WHEN kif. THEN kif.&lt;br /&gt;
	...&lt;br /&gt;
	[ELSE kif.]&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Pl.:=====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT CASE egyseg_nev&lt;br /&gt;
			 WHEN &#039;l&#039; THEN &#039;liter&#039;&lt;br /&gt;
			 WHEN &#039;dl&#039; THEN &#039;deci&#039;&lt;br /&gt;
			 ELSE egyseg_nev&lt;br /&gt;
		 END egysnev&lt;br /&gt;
FROM anyag&lt;br /&gt;
ORDER BY egysnev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ha nem, tud illeszteni és nincs ELSE-ág akkor =NULL= lesz az eredmény&lt;br /&gt;
====Searched case:====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CASE &lt;br /&gt;
	WHEN bool_kif THEN kif.&lt;br /&gt;
	...&lt;br /&gt;
	[ELSE kif.]&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.04.25.&lt;br /&gt;
-- [[StMa|Matyi]] - 2006.07.03.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060428&amp;diff=163851</id>
		<title>AdatbServerProgJegyzet20060428</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060428&amp;diff=163851"/>
		<updated>2013-03-31T19:03:52Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.04.28.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.04.28.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.28.&amp;diff=163850</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.04.28.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.28.&amp;diff=163850"/>
		<updated>2013-03-31T19:03:49Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060428}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display:block; me…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060428}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060425|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.04.28. [[AdatbServerProgJegyzet20060502|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==MSSQL kurzorok==&lt;br /&gt;
&lt;br /&gt;
=DECLARE @valt INT=&lt;br /&gt;
=SELECT @valt=anyag_id FROM anyag=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* 0 sor -&amp;amp;gt; NULL&lt;br /&gt;
* több sor -&amp;amp;gt; utoló sor eredménye&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ha minden sorra szükségünk van akkor kurzort kell hasznalni&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	1 deklarálás - lekérdezés megadásaű&lt;br /&gt;
	2 megnyitás - lekérdezés lefut&lt;br /&gt;
	3 navigálás - mindkét irányban, adatmódosító utasítások is engedélyezett (Oracle-vel ellentétben)&lt;br /&gt;
	4 bezárás&lt;br /&gt;
	5 elengedés&lt;br /&gt;
&lt;br /&gt;
===SQL92 deklaráció:===&lt;br /&gt;
&lt;br /&gt;
=DECLARE nev [INSENSITIVE][SCROLL] CURSOR FOR lekerdezes [FOR {READ ONLY | UPDATE [OF osznev]}]=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* *INSENSITIVE*: kommitált törlések és módosítások látkatóak&lt;br /&gt;
* *SCROLL*: mindkét irányban lehet FETCH-elni&lt;br /&gt;
* *READONLY*: kurzoron keresztül em módosíthatunk, de látja a közben kommitált változásokat&lt;br /&gt;
* *UPDATE*: módosítás engedályezett&lt;br /&gt;
* *UPDATE OF ...*: csak a megadott oszlopokat lehet módosítani&lt;br /&gt;
&lt;br /&gt;
===Transact SQL deklaráció:===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DECLARE nev CURSOR [{LOCAL | GLOBAL}]&lt;br /&gt;
[{FORWARD ONLY | SCROLL}]&lt;br /&gt;
[{STATIC | KEYSET | DYNAMIC | FAST_FORWARD}]&lt;br /&gt;
[{READONLY | SCROLL_LOCKS | OPTIMISTIC}]&lt;br /&gt;
[TYPE_WARNING]&lt;br /&gt;
FOR lekerdezes&lt;br /&gt;
[FOR UPDATE [OF ...]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* *LOCAL*: csak tárolt eljáráson / batchen / triggeren belül él&lt;br /&gt;
* *GLOBAL*: sessionön belül&lt;br /&gt;
* *FORWARD ONLY*: csak előre léphetünk (default ha FAST_FORWARD)&lt;br /&gt;
* *SCROLL*: (default, ha STATIC|KEYSETDYNAMIC)&lt;br /&gt;
* *STATIC*: nem módosítható&lt;br /&gt;
* *KEYSET*: csak nem kulcsok módosíthatók&lt;br /&gt;
* *DYNAMIC*: bármi módosítható&lt;br /&gt;
* *FAST_FORWARD*: read only + forward&lt;br /&gt;
* *SCROLL_LOCK*: zárolja a sorokat, fast_forward mellett tiltott (minden featch-nél zárol nem pedig  lekérdezésnél)&lt;br /&gt;
* &#039;&#039;&#039;OPTIMISTIC&#039;&#039;&#039; csak akkor módosít egy sort, ha más addig nem módosította már kívülről&lt;br /&gt;
* *TYPE_WARNING*: warning-ot ad implicit konverzió esetén&lt;br /&gt;
&lt;br /&gt;
=OPEN [GLOBAL] nev= -&amp;amp;gt; lekérdezés lefut&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
* @@CURSOR_ROWS: érintett sorok száma&lt;br /&gt;
=FETCH [{NEXT | PRIOR || FIRST || LAST || ABSOLUTE ért.  REALTIVE ért.}]=&lt;br /&gt;
=[FROM] [GLOBAL] nev [INTO @valt., ...]=&lt;br /&gt;
&lt;br /&gt;
* *ABSOLUTE*:&lt;br /&gt;
** n&amp;amp;gt;0 n. sor&lt;br /&gt;
** n&amp;amp;lt;0 végétől az n. sor&lt;br /&gt;
** n = 0 aktuális sor&lt;br /&gt;
* *RELATIVE*: aktuális sor + n&lt;br /&gt;
&lt;br /&gt;
=CLOSE [GLOBAL] nev=&lt;br /&gt;
* eredményhalmazt és zárakat elengedjük&lt;br /&gt;
* adatstruktúra megmarad, újra megnyitható&lt;br /&gt;
* csak nyitott kurzorra nyitható&lt;br /&gt;
&lt;br /&gt;
=DEALLOCATE [GLOBAL] nev=&lt;br /&gt;
* megszűnik egy referencia az adatstruktúráról&lt;br /&gt;
* ha az összes referencia megszünt a struktura is felszabadúl&lt;br /&gt;
&lt;br /&gt;
====Kurzorváltozó====&lt;br /&gt;
 &#039;&#039;&#039;korzorváltozó&#039;&#039;&#039; = referencia egy létező kurzorra &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
=DECLARE @nev CURSOR=&lt;br /&gt;
&lt;br /&gt;
===Ciklosszervezés===&lt;br /&gt;
&#039;&#039;&#039;@@FETCH_STATUS&#039;&#039;&#039;&lt;br /&gt;
* 0: sikeres&lt;br /&gt;
* -1: nem sikerült&lt;br /&gt;
* -2: hiányzott a sor azért nem sikerült&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DECLARE c1 CURSOR FOR SELECT anyag_id, anyag_nev FROM anyag&lt;br /&gt;
DECLARE @id INT, @nec VARCHAR(50)&lt;br /&gt;
	//EZEK NEM ÍRHATÓ EGY DECLARE RÉSZBE&lt;br /&gt;
OPEN c1&lt;br /&gt;
FETCH c1 INTO @id, @nev&lt;br /&gt;
WHILE @@FETCH_STATUS = 0&lt;br /&gt;
BEGIN&lt;br /&gt;
	PRINT CONVERT(VARCHAR, @id)+&#039;:&#039;+@nev&lt;br /&gt;
	FETCH c1 INTO @id, @nev&lt;br /&gt;
END&lt;br /&gt;
CLOSE c1&lt;br /&gt;
DEALLOCATE c1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Módosítás===&lt;br /&gt;
* UPDATE, DELETE engedélyezett, INSERT nem&lt;br /&gt;
* WHERE CURRENT OF -t kell hasznalni&lt;br /&gt;
* Ha a lekérdezés során a sorok sorrendjet megvaltoztatjuk (ORDER, GROUP, stb.) akkor nem hasznalhatunk módosítást&lt;br /&gt;
&lt;br /&gt;
==Tárolt eljárások==&lt;br /&gt;
* lehet IN, OUT paraméter (INOUT nem)&lt;br /&gt;
* DDL, és DCL utasításokat is tartalmazhat&lt;br /&gt;
* egymásba ágyazható&lt;br /&gt;
* státusz információval visszatérhet a hívó felé&lt;br /&gt;
&lt;br /&gt;
	1 rendszer tárolt eljárásai sp_-vel kezdődnek&lt;br /&gt;
	2 lokális: felhasználói adatbázisban vannak&lt;br /&gt;
	3 átmeneti:&lt;br /&gt;
** lokális: #-kal kezdődnek&lt;br /&gt;
** globális: ##-kal kezdődik&lt;br /&gt;
	4 külső tárolt eljárások&lt;br /&gt;
** Dll-ként vannak implementálva és xp_-al kezdődik&lt;br /&gt;
** SQL Server 2005-ben CLR tárolt eljárások is írhatók&lt;br /&gt;
&lt;br /&gt;
===Kedvenc vzsgakérdés===&lt;br /&gt;
&#039;&#039;&#039;Tárolt eljárás négyféle módon térhet vissza információval:&#039;&#039;&#039;&lt;br /&gt;
* kimeneti paraméter (skalar-, kurzor változó)&lt;br /&gt;
* visszatérési érték (mindig INT)&lt;br /&gt;
* eredményhalmaz&lt;br /&gt;
* globális kurzor&lt;br /&gt;
===létrehozása===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE PROC[EDURE] nev [;number]&lt;br /&gt;
	[@param típus [VARYING][=default érték]]&lt;br /&gt;
[WITH {ENCRYPTION | RECOMPLIE | EXECUTE AS {CALLER | SELF | OWNER | &#039;user name&#039;}}]&lt;br /&gt;
AS&lt;br /&gt;
	utasítások&lt;br /&gt;
GO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* BEGIN ... END is hasznalható de csak a GO-nal lesz vége&lt;br /&gt;
* default érték: híváskor az utolsó paraméterek elhagyhatók, a közbülsők DEFAULT kulcsszóval helyettesíthetők, ha van default értékük&lt;br /&gt;
&lt;br /&gt;
===Hívás:===&lt;br /&gt;
=EXEC[UTE] {[@vissza=]nev[;szam]}=&lt;br /&gt;
=[[@param=] {ért. | @valt[OUTPUT]  [DEFAULT]}]=&lt;br /&gt;
===Módosítás===&lt;br /&gt;
=ALTER PROC ...=&lt;br /&gt;
===Törlés===&lt;br /&gt;
=DROP PROC ...=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;nincs CREATE OR REPLACE&#039;&#039;&#039;&lt;br /&gt;
===Pl.:===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CREATE PROCEDURE anyag_lista&lt;br /&gt;
	@tol INT,&lt;br /&gt;
	@ig INT&lt;br /&gt;
AS&lt;br /&gt;
	SELECT anyag_nev FROM anyag WHERE anyag_id BETWEEN @tol AND @ig&lt;br /&gt;
GO&lt;br /&gt;
&lt;br /&gt;
EXEC anyag_lista 3,5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Függvények==&lt;br /&gt;
* beépített függvények (rowset, aggregate (oszlop fv.), skalár (pl.: =getdate()= ) )&lt;br /&gt;
* felhasználói függvények&lt;br /&gt;
** skalár&lt;br /&gt;
** in-line table valued -&amp;gt; 1 select&lt;br /&gt;
** multistatement table valued -&amp;gt; több utasítás, kimenet egy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ROWSET : ott használjuk, ahol az SQL utasításban táblát használnánk (pl.: =FROM= után)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Skalár függvények===&lt;br /&gt;
* @@FETCH, STATUS, getdate(), datepart()&lt;br /&gt;
* &#039;&#039;&#039;matematikai&#039;&#039;&#039; : abs, sin&lt;br /&gt;
* &#039;&#039;&#039;metaadat&#039;&#039;&#039; : col_name, col_length&lt;br /&gt;
* &#039;&#039;&#039;strinr&#039;&#039;&#039; : lawer, substring&lt;br /&gt;
* &#039;&#039;&#039;rendszer&#039;&#039;&#039; : convert, isnull, current_user&lt;br /&gt;
* &#039;&#039;&#039;rendszer statisztikák&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;szöveg és képmanipuláló fv.-ek&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;biztonsági&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Skalár felhasználói fv.===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE FUNCTION név (@p típus [=def.érték], ...)&lt;br /&gt;
RETURNS skalár típus&lt;br /&gt;
AS&lt;br /&gt;
BEGIN&lt;br /&gt;
	függvénytörzs&lt;br /&gt;
	RETURN érték&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* paraméterszám &amp;lt; 1024&lt;br /&gt;
* híváskor minden paramétert meg kell adni, vagy DEFAULT kulcsszót használni, nem hagyható el a végéről&lt;br /&gt;
&lt;br /&gt;
====Pl:====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE FUNCTION felkesz_ar (@bid INT) RETURNS float&lt;br /&gt;
AS&lt;br /&gt;
BEGIN&lt;br /&gt;
	DECLARE @ar float&lt;br /&gt;
	SELECT @ar = sum(...) FROM anyag, felkesz, ...&lt;br /&gt;
	RETURN @ar&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Hívás:&#039;&#039;&#039;&lt;br /&gt;
* =SELECT ap60.felkesz_ar(5)=&lt;br /&gt;
* =SELECT ap60.felkesz_ar(felkesz_id) FROM felkesz=&lt;br /&gt;
&lt;br /&gt;
===Inline table valued===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE FUNCTION név (@p típus(adat)) RETURNS TABLE AS&lt;br /&gt;
	RETURN lekérdezés&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;hívás:&#039;&#039;&#039; =SELECT * FROM ap60.név(paraméter)=&lt;br /&gt;
&lt;br /&gt;
===Tábla visszatérésű több soros===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE FUNCTION név (@p típus(adat)) RETURNS TABLE @valt TABLE (oszlop típus, ...)&lt;br /&gt;
AS&lt;br /&gt;
BEGIN&lt;br /&gt;
	függvény törzs  // (pl.: INSERT INTO @valt ...)&lt;br /&gt;
	RETURN&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Módosítása===&lt;br /&gt;
=ALTER FUNCTION név=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;A három típus nem átjárható&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Törlés===&lt;br /&gt;
=DROP FUNCTION név=&lt;br /&gt;
&lt;br /&gt;
===Függvényen belül nem használható:===&lt;br /&gt;
* =PRINT=&lt;br /&gt;
* =INSERT= csak visszatérési táblára&lt;br /&gt;
&lt;br /&gt;
===Függvényen belül használható:===&lt;br /&gt;
* értékadó utasítás&lt;br /&gt;
* programvezérlő ut.&lt;br /&gt;
* lokális vált., kurzor&lt;br /&gt;
* változóba pakoló =SELECT=&lt;br /&gt;
* lokális táblára =INSERT=, =UPDATE=, =DELETE=&lt;br /&gt;
&lt;br /&gt;
-- [[StMa|Matyi]] - 2006.08.12.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060425&amp;diff=163849</id>
		<title>AdatbServerProgJegyzet20060425</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060425&amp;diff=163849"/>
		<updated>2013-03-31T19:03:46Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.04.25.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.04.25.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.04.25.&amp;diff=163848</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.04.25.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.04.25.&amp;diff=163848"/>
		<updated>2013-03-31T19:03:45Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060425}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060425}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060421|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.04.25. [[AdatbServerProgJegyzet20060428|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Programvezérlő utasítások==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Indíts egy Microsoft Server Management Studiot! A New Query ikonra kattintva&lt;br /&gt;
nyiss meg egy ablakot, ahol a T-SQL utasításokat fogod tudni majd futtatni! Futtasd&lt;br /&gt;
le a minta adatbázisokat létrehozó scripteket!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Deklarálj egy változót egy pilóta nevének tárolására. Kérdezd le a pilóták nevét ebbe&lt;br /&gt;
a változóba a két tanult módon (&amp;lt;pre&amp;gt;SELECT @val = oszlop FROM ...&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;SET @val =&lt;br /&gt;
(SELECT oszlop FROM ...)&amp;lt;/pre&amp;gt;). Vizsgáld meg, hogy mi történik az egyik, és mi a&lt;br /&gt;
másik esetben!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE @pilotanev nvarchar(100)&lt;br /&gt;
SELECT @pilotanev = nev FROM pilota&lt;br /&gt;
PRINT @pilotanev&lt;br /&gt;
SET @pilotanev = (SELECT nev FROM pilota &lt;br /&gt;
	WHERE pilotaid = (SELECT MIN(pilotaid) FROM pilota))&lt;br /&gt;
PRINT @pilotanev&lt;br /&gt;
SET @pilotanev = (SELECT nev FROM pilota)&lt;br /&gt;
PRINT @pilotanev&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Módosítsd úgy az előbbi scriptedet, hogy a lekérdezés a legutolsó futam nyertes&lt;br /&gt;
pilótájának a nevét adja vissza!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE @pilotanev nvarchar(100)&lt;br /&gt;
SELECT @pilotanev = nev FROM pilota, futam_pilota, futam&lt;br /&gt;
	WHERE futam.futamid = futam_pilota.futamid&lt;br /&gt;
	AND pilota.pilotaid = futam_pilota.pilotaid&lt;br /&gt;
	AND ev = (SELECT MAX(ev) FROM futam)&lt;br /&gt;
	AND helyezes = 1&lt;br /&gt;
PRINT @pilotanev&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Módosítsd az előző lekérdezést úgy, hogy a pilóta neve mellett a futam dátumát is ki&lt;br /&gt;
tud íratni a képernyőre, és írd is ki egy sorba a pilóta nevét és a futam dátumát! Elég&lt;br /&gt;
az egyik típusú értékadást használni (amelyiket ebben az esetben még lehet).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE @pilotanev nvarchar(100)&lt;br /&gt;
DECLARE @futamdatum datetime&lt;br /&gt;
SELECT @pilotanev = nev, @futamdatum = datum FROM pilota, futam_pilota, futam&lt;br /&gt;
	WHERE futam.futamid = futam_pilota.futamid&lt;br /&gt;
	AND pilota.pilotaid = futam_pilota.pilotaid&lt;br /&gt;
	AND datum = (SELECT MAX(datum) FROM futam, futam_pilota &lt;br /&gt;
		WHERE futam.futamid = futam_pilota.futamid)&lt;br /&gt;
	AND helyezes = 1&lt;br /&gt;
PRINT @pilotanev + &#039; &#039; + convert(varchar, @futamdatum)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Használj dátummanipuláló függvényeket, amiknek a segítségével az előző&lt;br /&gt;
lekérdezésben megkapott dátumot a neked tetsző formában tudod kiíratni (csak év,&lt;br /&gt;
hónap, nap kiíratása kell). Használhatod a DATEPART függvényt, vagy az&lt;br /&gt;
egyszerűbben használható YEAR, MONTH és DAY függvényeket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE @pilotanev nvarchar(100)&lt;br /&gt;
DECLARE @futamdatum datetime&lt;br /&gt;
SELECT @pilotanev = nev, @futamdatum = datum FROM pilota, futam_pilota, futam&lt;br /&gt;
	WHERE futam.futamid = futam_pilota.futamid&lt;br /&gt;
	AND pilota.pilotaid = futam_pilota.pilotaid&lt;br /&gt;
	AND datum = (SELECT MAX(datum) FROM futam, futam_pilota &lt;br /&gt;
		WHERE futam.futamid = futam_pilota.futamid)&lt;br /&gt;
	AND helyezes = 1&lt;br /&gt;
PRINT @pilotanev + &lt;br /&gt;
	&#039; &#039; + convert(varchar, YEAR(@futamdatum)) + &lt;br /&gt;
	&#039;-&#039; + convert(varchar, MONTH(@futamdatum)) + &lt;br /&gt;
	&#039;-&#039; + convert(varchar, DAY(@futamdatum))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Az SQL Server 2005-ben már lehetőség van a módosító utasítások eredményének&lt;br /&gt;
kinyerésére az OUTPUT kifejezés segítségével. Az éppen beszúrt vagy éppen törölt&lt;br /&gt;
értékekre az INSERTED és a DELETED átmeneti táblákra való hivatkozással&lt;br /&gt;
kaphatjuk meg, az eredményt pedig vagy eredményhalmazként kaphatjuk meg, vagy&lt;br /&gt;
átmeneti tábla illetve tábla típus deklarálásával (a részleteket nézd meg a Books&lt;br /&gt;
Online-ban). Ezek alapján módosítsd az anyag táblát, és emeld meg minden 100 Ft-nál&lt;br /&gt;
olcsóbb anyag árát 10%-kal, a módosított anyagok nevét, régi és új árát pedig&lt;br /&gt;
eredményhalmazként nyerd ki!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;UPDATE anyag SET anyag_egysegar = anyag_egysegar*1.1&lt;br /&gt;
	OUTPUT deleted.anyag_nev nev, deleted.anyag_egysegar regiar, inserted.anyag_egysegar ujar&lt;br /&gt;
	WHERE anyag_egysegar&amp;amp;lt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Felhasználva az előző feladatban nyert ismereteidet, hozz létre egy tábla típusú&lt;br /&gt;
változót, majd csökkentsd az anyagok árát 10%-kal. Az eredményt az átmeneti&lt;br /&gt;
táblába tedd, amiből pedig egy lekérdezéssel nyerd ki azon módosított anyagok&lt;br /&gt;
adatait, amiknek az új ára kisebb, mint 30 Ft!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE @tempanyag TABLE(nev VARCHAR(100), regiar REAL, ujar REAL)&lt;br /&gt;
UPDATE anyag SET anyag_egysegar = anyag_egysegar*0.9&lt;br /&gt;
	OUTPUT deleted.anyag_nev, deleted.anyag_egysegar, inserted.anyag_egysegar&lt;br /&gt;
	INTO @tempanyag&lt;br /&gt;
	WHERE anyag_egysegar&amp;amp;lt;100 &lt;br /&gt;
SELECT * FROM @tempanyag WHERE ujar&amp;amp;lt;30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts egy napló táblát az anyag árainak változásának nyomon követésére. A napló&lt;br /&gt;
tartalmazzon egy egyedi azonosítót, egy dátumot, amikor az árváltozás bekövetkezett,&lt;br /&gt;
az anyag nevét, a régi és az új árát. Módosítsd az előző batch scriptedet úgy, hogy az&lt;br /&gt;
átmeneti táblából a 30 Ft-nál olcsóbb termékek adatai a napló táblába kerüljenek. Az&lt;br /&gt;
ár értékeket csak két tizedes jegyig tároljad! Kérdezd le az utoljára beszúrt adat&lt;br /&gt;
azonosítóját, és azt írasd ki a kimenetre!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TABLE anyagar_naplo (&lt;br /&gt;
	id INT PRIMARY KEY IDENTITY,&lt;br /&gt;
	nev VARCHAR(100),&lt;br /&gt;
	regiar REAL,&lt;br /&gt;
	ujar REAL,&lt;br /&gt;
	datum DATETIME&lt;br /&gt;
)&lt;br /&gt;
GO&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
DECLARE @tempanyag TABLE(nev VARCHAR(100), regiar REAL, ujar REAL)&lt;br /&gt;
UPDATE anyag SET anyag_egysegar = anyag_egysegar*0.9&lt;br /&gt;
	OUTPUT deleted.anyag_nev, deleted.anyag_egysegar, inserted.anyag_egysegar&lt;br /&gt;
	INTO @tempanyag&lt;br /&gt;
	WHERE anyag_egysegar&amp;amp;lt;100&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
INSERT INTO anyagar_naplo &lt;br /&gt;
	SELECT nev, convert(numeric(10,2), regiar), convert(numeric(10,2), ujar), getdate() &lt;br /&gt;
	FROM @tempanyag &lt;br /&gt;
	WHERE ujar&amp;amp;lt;30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy lekérdezést, ami kilistázza az XSFXCF neptun kódú diák összes osztályzatát&lt;br /&gt;
mind számmal, mind pedig szöveges formátumban. Az osztályzatok előtt szerepeljen,&lt;br /&gt;
hogy melyik félévben melyik tárgyból kapta az adott osztályzatot. A félév kódot is&lt;br /&gt;
konvertáld át szöveges formátummá. A szemeszterkód egy ötjegyű szám, aminek első&lt;br /&gt;
négy jegye az évet jelenti, míg az ötödik számjegye az év félévét jelenti. Például a&lt;br /&gt;
2002 év őszi félévét a 20022 jelöli, míg a 2003 tavaszi félévet a 20031 kód jelöli.&lt;br /&gt;
Megjelenítéskor az első esetben &amp;amp;#8222;2002/2003 I. felev&amp;amp;#8221; a második esetben pedig&lt;br /&gt;
&amp;amp;#8222;2002/2003 II. felev&amp;amp;#8221; szöveget szeretnénk látni. A megoldásban használni kell a&lt;br /&gt;
Adatbázisok szerver oldali programozása SQL Server T-SQL Programvezérlő utasítások&lt;br /&gt;
convert() konverziós függvényt, ami az explicit adattípus konverziót teszi lehetővé,&lt;br /&gt;
illetve a substring() függvényt. A függvények működését a help-ben nézd meg!&lt;br /&gt;
Az eredmény így nézzen ki:&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.04.25.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060505&amp;diff=163847</id>
		<title>AdatbServerProgJegyzet20060505</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060505&amp;diff=163847"/>
		<updated>2013-03-31T19:03:44Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.05.05.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.05.05.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.05.05.&amp;diff=163846</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.05.05.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.05.05.&amp;diff=163846"/>
		<updated>2013-03-31T19:03:43Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060505}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display:block; me…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060505}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060502|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.05.05. [[AdatbServerProgJegyzet20060509|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==T-SQL Triggerek==&lt;br /&gt;
&lt;br /&gt;
===Esemény lehet:===&lt;br /&gt;
* INSERT&lt;br /&gt;
* UPDATE&lt;br /&gt;
* DELETE&lt;br /&gt;
* SQL Server 2005-ben DDL utasítások is&lt;br /&gt;
===Milyen objektumra definiálható DML trigger?===&lt;br /&gt;
* tábla&lt;br /&gt;
* nézet&lt;br /&gt;
===Mikor fut le?===&lt;br /&gt;
* esemény után (csak táblára) kulcsszó: =AFTER= ~ =FOR=&lt;br /&gt;
* helyette (táblára és nézetre is) kulcsszó: =INSTEAD OF=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kedvenc vizsgakérdés: Triggerek csoportosítása.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Pl.:===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TRIGGER nev ON {tábla|nezet}&lt;br /&gt;
WITH ENCRYPTIONS {FTER|FOR|INSTEAD OF} {DELETE|INSERT|UPDATE}&lt;br /&gt;
AS SQLutasítások&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;régi adatok: deleted.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;új adatok: inserted.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ezek átmeneti táblák, táblaként kell kezelni&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SQL Serveren csak utasítás trigger van, sor trigger nincs.&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Sor szintű vizsgálatot csak kurzorral lehet csinálni.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Módosúlt oszlopok lekérdezése:&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=IF update(oszlopnév) ...=&lt;br /&gt;
&lt;br /&gt;
* =INSERT= : minden oszlopra true-t ad vissza&lt;br /&gt;
* =DELETE= : nem használható&lt;br /&gt;
* =UPDATE= : TRUE ha modosúlt&lt;br /&gt;
&lt;br /&gt;
=IF COLUMNS_UPDATED(bitmaszk) ...=	- n. oszlop 1 &amp;lt;&amp;lt; (n-1)&lt;br /&gt;
&lt;br /&gt;
===Megkötések:===&lt;br /&gt;
* batchen belül egyedüli utasításnak kell lennie, addig tart, ameddig a batch&lt;br /&gt;
* 1 trigger 1 táblára definiálható&lt;br /&gt;
* 1 táblára több trigger is lehet, ezeknek a lefutási sorrendje véletlen&lt;br /&gt;
&lt;br /&gt;
===Módosítás:===&lt;br /&gt;
 =ALTER TRIGGER=&lt;br /&gt;
&lt;br /&gt;
===Törlés:===&lt;br /&gt;
=DROP TRIGGER=, tábla törlése esetén magától törlődik&lt;br /&gt;
&lt;br /&gt;
===Pl.:===&lt;br /&gt;
&lt;br /&gt;
=ALTER TABLE felkesz ADD felkesz_ar FLOAT=&lt;br /&gt;
&lt;br /&gt;
-feltesszük hogy már ki van töltve-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TRIGGER felkesz_ar_update ON felkesz_angyag&lt;br /&gt;
AFTER INSERT, DELETE, UPDATE&lt;br /&gt;
AS&lt;br /&gt;
DECLARE @db1 INT, @db2 INT&lt;br /&gt;
SELECT @db1 = COUNT(*) FROM deleted&lt;br /&gt;
SELECT @db2 = COUNT(*) FROM inserted&lt;br /&gt;
IF @db1 &amp;gt; 0 AND @db2 &amp;gt; 0							  //update volt&lt;br /&gt;
BEGIN &lt;br /&gt;
	UPDATE felkesz SET felkesz_ar = felkesz_ar - deleted.fa_mennyiseg * anyag_egysegar + inserted.fa_mennyiseg * anyag_egysegar&lt;br /&gt;
	FROM anyag, deleted, inserted&lt;br /&gt;
	WHERE anyag_id =inserted.fa_anyagid AND felkesz:id = deleted.fa_felkeszid&lt;br /&gt;
END&lt;br /&gt;
IF @db2 = 0												//delete volt&lt;br /&gt;
BEGIN&lt;br /&gt;
...&lt;br /&gt;
END&lt;br /&gt;
IF @db1 = 0												//insert volt&lt;br /&gt;
BEGIN&lt;br /&gt;
...&lt;br /&gt;
END&lt;br /&gt;
GO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ha fa_anyagid vagy fa_felkeszid is módosulhat, külön le kell kezelni.&lt;br /&gt;
&lt;br /&gt;
===DDL trigger (2005)===&lt;br /&gt;
&lt;br /&gt;
=CREATE, DROP, ALTER, GRANT, DENY, REVOKE= utasításokra írható.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TRIGGER nev ON {ALL SERVER|DATABASE}&lt;br /&gt;
[WITH {ENCRYPTION|EXECUTE AS {CALLER|SELF|username}}]&lt;br /&gt;
{FOR|AFTER} {esemény típus| esemény csoport} [,...]&lt;br /&gt;
AS&lt;br /&gt;
	SQL utasítások&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;esemény lehet pl.:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
adatbázis hatókörű:&lt;br /&gt;
* =ALTER_FUNCTION=&lt;br /&gt;
* =CREATE_TABLE=&lt;br /&gt;
* =CREATE_USER=&lt;br /&gt;
* =DROP_TRIGGER=&lt;br /&gt;
szerver hatókörű:&lt;br /&gt;
* =CREATE_DATABASE=&lt;br /&gt;
* =DROP_LOGIN=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;esemény csopotok pl.:&#039;&#039;&#039;&lt;br /&gt;
* =DDL_TABLE_EVENTS=&lt;br /&gt;
* =DDL_FUNCTION_EVENTS=&lt;br /&gt;
&lt;br /&gt;
==Hibakezelés:==&lt;br /&gt;
&lt;br /&gt;
===Hiba szerkezete:===&lt;br /&gt;
* szám&lt;br /&gt;
* üzenet&lt;br /&gt;
* fontosság&lt;br /&gt;
* állapotkód&lt;br /&gt;
* eljárásnév, ahol generálódott&lt;br /&gt;
* sor száma&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Szerver hibák:&#039;&#039;&#039; master.dbo.sysmessages&lt;br /&gt;
&lt;br /&gt;
Felhasználói hibák: sysmessages&lt;br /&gt;
* &#039;&#039;&#039;bővítés&#039;&#039;&#039; : sp_addmessage &lt;br /&gt;
* &#039;&#039;&#039;törlés&#039;&#039;&#039; : sp_dropmessage&lt;br /&gt;
&lt;br /&gt;
=@@ERROR= = 0 , ha sikeres volt az utolsó utasítás, egyebkent &#039;&#039;&#039;hibakód&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Hiba dobása:===&lt;br /&gt;
=RAISERROR ({sg_id|msg_str}, severity, state, [arg1,...]) [WITH option1, ...]=&lt;br /&gt;
&lt;br /&gt;
===SQL Server 2005 exception kezelés===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BEGIN TRY&lt;br /&gt;
	SQL utasítások&lt;br /&gt;
END TRY&lt;br /&gt;
BEGIN CATCH&lt;br /&gt;
	SQL utasítások&lt;br /&gt;
END CATCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Olyan hibákat kap el, aminek a fontossága &amp;gt; 10, és nem bontja a kapcsolatot&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Megkötések:===&lt;br /&gt;
* nem tarthat több batch-en/blokk-on keresztül&lt;br /&gt;
* felhasználói függvényben nem használható&lt;br /&gt;
&lt;br /&gt;
===Hiba paramétereit lekérő függvények:===&lt;br /&gt;
* =ERROR_NUMBER()=&lt;br /&gt;
* =ERROR_SEVERITY()=&lt;br /&gt;
* =ERROR_STATE()=&lt;br /&gt;
* =ERROR_PROCEDURE()=&lt;br /&gt;
* =ERROR_LINE()=&lt;br /&gt;
* =ERROR_MESSAGE()=&lt;br /&gt;
&lt;br /&gt;
-- [[StMa|Matyi]] - 2006.09.23.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060418&amp;diff=163845</id>
		<title>AdatbServerProgJegyzet20060418</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060418&amp;diff=163845"/>
		<updated>2013-03-31T19:03:42Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.04.18.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.04.18.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.04.18.&amp;diff=163844</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.04.18.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.04.18.&amp;diff=163844"/>
		<updated>2013-03-31T19:03:41Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060418}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060418}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060414|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.04.18. [[AdatbServerProgJegyzet20060421|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Dinamikus SQL==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Hozz létre egy csomagot, amiben a gyakorlat során elkészítendő feladatokat fogod&lt;br /&gt;
megvalósítani!&lt;br /&gt;
&amp;lt;li&amp;gt; Írj egy tárolt eljárást, ami egy tábla sorait törli ki. Az eljárás bemenete a tábla neve és&lt;br /&gt;
a törlend( sorokat definiáló feltétel legyen. Amennyiben nincs megadva feltétel, az&lt;br /&gt;
eljárás a bemenetként kapott tábla összes sorát törölje. Az eljárást próbáld is ki!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE dynasql IS&lt;br /&gt;
	PROCEDURE deletefrom(tablename VARCHAR2, condition VARCHAR2);&lt;br /&gt;
END dynasql;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE BODY dynasql IS&lt;br /&gt;
	PROCEDURE deletefrom(tablename VARCHAR2, condition VARCHAR2) IS&lt;br /&gt;
		query VARCHAR2(500);&lt;br /&gt;
	BEGIN&lt;br /&gt;
		query := &#039;DELETE FROM &#039; ||| tablename |||| &#039; WHERE &#039; || NVL(condition, &#039;0=0&#039;);&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(query);&lt;br /&gt;
		EXECUTE IMMEDIATE query;&lt;br /&gt;
	END;&lt;br /&gt;
END dynasql;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=EXEC dynasql.deletefrom(&#039;exam&#039;, &#039;ex_id=6&#039;);=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Hozz létre egy típust, amiben tetszőleges számú tábla nevét tudod majd tárolni!&lt;br /&gt;
&amp;lt;li&amp;gt; Írj egy tárolt eljárást, aminek bemenő paramétere táblák neveinek tömbje, feladata&lt;br /&gt;
pedig, hogy kitörölje a bemenetként megkapott táblákat. A sikeres vagy sikertelen&lt;br /&gt;
törlésekről a kimenetre írj üzenetet. Dobj hibát, amennyiben nem lehet az összes&lt;br /&gt;
táblát kitörölni, mert esetleg a listából hiányzik egy olyan tábla, ami hivatkozik egy&lt;br /&gt;
listabeli táblára.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE dynasql IS&lt;br /&gt;
	TYPE tablalista IS TABLE OF VARCHAR2(30);&lt;br /&gt;
	PROCEDURE droptables(tables tablalista);&lt;br /&gt;
END dynasql;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE BODY dynasql IS&lt;br /&gt;
	tablanemletezik EXCEPTION;&lt;br /&gt;
	tablanemtorolheto EXCEPTION;&lt;br /&gt;
&amp;amp;nbsp;	&lt;br /&gt;
	PRAGMA EXCEPTION_INIT(tablanemletezik, -00942);&lt;br /&gt;
	PRAGMA EXCEPTION_INIT(tablanemtorolheto, -02449);&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	PROCEDURE droptables(tables tablalista) IS&lt;br /&gt;
		query VARCHAR2(500);&lt;br /&gt;
		torolve INT := 0;&lt;br /&gt;
	BEGIN&lt;br /&gt;
		FOR i IN tables.FIRST..tables.LAST LOOP&lt;br /&gt;
			FOR i IN tables.FIRST..tables.LAST LOOP&lt;br /&gt;
				BEGIN&lt;br /&gt;
					query := &#039;DROP TABLE &#039; | tables(i);&lt;br /&gt;
					EXECUTE IMMEDIATE query;&lt;br /&gt;
					torolve := torolve+1;&lt;br /&gt;
					DBMS_OUTPUT.PUT_LINE(&#039;Törölve&amp;amp;#58; &#039; | tables(i));&lt;br /&gt;
				EXCEPTION&lt;br /&gt;
					WHEN tablanemletezik THEN&lt;br /&gt;
						DBMS_OUTPUT.PUT_LINE(&#039;Nem létezik: &#039; | tables(i));&lt;br /&gt;
					WHEN tablanemtorolheto THEN&lt;br /&gt;
						DBMS_OUTPUT.PUT_LINE(&#039;Nem törölhető: &#039; | tables(i));&lt;br /&gt;
				END;&lt;br /&gt;
			END LOOP;&lt;br /&gt;
		END LOOP;&lt;br /&gt;
		IF torolve&amp;lt;tables.COUNT THEN&lt;br /&gt;
			RAISE_APPLICATION_ERROR(-20100, &#039;Nem sikerült minden táblát törölni&#039;);&lt;br /&gt;
		END IF;&lt;br /&gt;
	END;&lt;br /&gt;
END dynasql;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	t dynasql.tablalista;&lt;br /&gt;
BEGIN&lt;br /&gt;
	t:=dynasql.tablalista(&#039;felkesz&#039;, &#039;anyag&#039;, &#039;felkesz_anyag&#039;);&lt;br /&gt;
	dynasql.droptables(t);&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.04.18.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060407&amp;diff=163843</id>
		<title>AdatbServerProgJegyzet20060407</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060407&amp;diff=163843"/>
		<updated>2013-03-31T19:03:40Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.04.07.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.04.07.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.07.&amp;diff=163842</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.04.07.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.04.07.&amp;diff=163842"/>
		<updated>2013-03-31T19:03:39Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060407}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060407}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060404|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.04.07. [[AdatbServerProgJegyzet20060411|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Tranzakciók==&lt;br /&gt;
&lt;br /&gt;
===Definíció===&lt;br /&gt;
Tranzakciónak hívjuk a munka 1 logikai egységét. 1 tranzakció 1 vagy több SQL utasításból állhat.&lt;br /&gt;
&lt;br /&gt;
Tranzakció tulajdonságai (ACID) &amp;amp;mdash; gyakori vizsgakérdés:&lt;br /&gt;
* atomicity: vagy minden utasítása végrehajtódik, vagy egyik sem&lt;br /&gt;
* consistency: a tranzakció konzisztens állapotból konzisztens állapotba visz&lt;br /&gt;
* isolation: a tranzakció elvárt eredménye megegyezik azzal, mintha a tranzakció egyedül futna&lt;br /&gt;
* durability: véglegesítés után nem veszhet el az információ&lt;br /&gt;
&lt;br /&gt;
===Tranzakció határai===&lt;br /&gt;
* kezdete: 1 futtatható SQL utasítás&lt;br /&gt;
* vége:&lt;br /&gt;
** explicit =COMMIT= vagy =ROLLBACK=&lt;br /&gt;
** implicit: DDL utasítás (=CREATE=, =DROP=, =RENAME=, =ALTER=) kiadásával vagy a kapcsolat bezárásával automatikusan commitol. A DDL utasítás mindenképp külön tranzakcióban fut.&lt;br /&gt;
** implicit =ROLLBACK=: ha az adatbázis kapcsolat hiba köveztében szakad meg&lt;br /&gt;
&lt;br /&gt;
====COMMIT====&lt;br /&gt;
* véglegesítés&lt;br /&gt;
* a változtatások a többiek számára is láthatóvá válnak&lt;br /&gt;
* zárak felszabadítása&lt;br /&gt;
* az adat lemezre kerül&lt;br /&gt;
* naplózás&lt;br /&gt;
&lt;br /&gt;
====ROLLBACK====&lt;br /&gt;
* visszafejti az utasításokat a tranzakció kezdetéig&lt;br /&gt;
* Oracle megoldása a visszafejtésre: &#039;&#039;redo log&#039;&#039;, azaz minden utasítás végrehajtásakor letárolja az utasítás inverzét is&lt;br /&gt;
* a tranzakcióban definiálhatók biztonsági pontok (=SAVEPOINT=): a tranzakció nem csak a legelejére görgethető vissza, hanem egy biztonsági pontig is&lt;br /&gt;
** =SAVEPOINT= definiálása: =SAVEPOINT s.p. neve;=&lt;br /&gt;
** visszagörgetés: =ROLLBACK TO s.p. neve;=&lt;br /&gt;
** ha azonos néven definiálunk 2 savepointot, az utolsó felülírja a többit&lt;br /&gt;
** rekurzív függvényben a &amp;lt;pre&amp;gt;SAVEPOINT&amp;lt;/pre&amp;gt;-ok a stacken tárolódnak, de csak a legbelső érhető el&lt;br /&gt;
** az utasítás szintű visszafejtést az Oracle implicit &amp;lt;pre&amp;gt;SAVEPOINT&amp;lt;/pre&amp;gt;-ok segítségével végzi&lt;br /&gt;
&lt;br /&gt;
===Konkurens tranzakciók===&lt;br /&gt;
&lt;br /&gt;
Konkurens tranzakciók esetén a következő problémák merülhetnek fel:&lt;br /&gt;
* _dirty read_: a tranzakció olyan adatot olvas, amit egy másik nem kommittáltan írt&lt;br /&gt;
* _nem megismételhető olvasás_: az adathalmazt újra beolvasva azt látjuk, hogy egy már kommittált tranzakció módosította vagy törölt belőle&lt;br /&gt;
* _fantom olvasás_: olvasás közben egy másik tranzakció új sorokat szúr be&lt;br /&gt;
&lt;br /&gt;
A problémák megoldására az SQL&#039;92 szabvány 4 izolációs szintet különít el. A táblázat mezői azt jelentik, hogy adott izolációs szinten adott hiba előfordulhat-e.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|						  || &#039;&#039;&#039;Dirty read&#039;&#039;&#039; || &#039;&#039;&#039;Non-repeatable read&#039;&#039;&#039; || &#039;&#039;&#039;Phantom read&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Read uncommitted&#039;&#039;&#039; || igen			|| igen						|| igen			  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Read committed&#039;&#039;&#039;	|| nem			 || igen						|| igen			  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Repeatable read&#039;&#039;&#039;  || nem			 || nem						 || igen			  &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Serializable&#039;&#039;&#039;	  || nem			 || nem						 || nem				&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Az Oracle 3 izolációs szintet vezetett be:&lt;br /&gt;
* read committed: alapbeállítás&lt;br /&gt;
** a tranzakciók olyan adatokat látnak, amiket a &#039;&#039;&#039;lekérdezés&#039;&#039;&#039; előtt kommittáltak&lt;br /&gt;
** akkor érdemes használni, ha kevés ütközésre számítunk&lt;br /&gt;
* serializable&lt;br /&gt;
** a tranzakciók olyan módosításokat adatokat látnak, amiket a &#039;&#039;&#039;tranzakció&#039;&#039;&#039; kezdete előtt kommittáltak&lt;br /&gt;
** nagy adatbázis, várhatóan kevés ütközés (2 tranzakció azonos sort próbál módosítani), rövid, kevés sort érintő módosító tranzakciók esetén érdemes használni&lt;br /&gt;
* read only&lt;br /&gt;
** a tranzakciók olyan módosításokat adatokat látnak, amiket a &#039;&#039;&#039;tranzakció&#039;&#039;&#039; kezdete előtt kommittáltak&lt;br /&gt;
** a tranzakció csak olvashat&lt;br /&gt;
&lt;br /&gt;
====Példa====&lt;br /&gt;
&lt;br /&gt;
===Zárak kezelése===&lt;br /&gt;
&lt;br /&gt;
====Sor szintű zárak====&lt;br /&gt;
&lt;br /&gt;
====Sor szintű zárak kurzorral====&lt;br /&gt;
&lt;br /&gt;
====Tábla szintű zárolás====&lt;br /&gt;
&lt;br /&gt;
===Autonóm tranzakció===&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.04.10.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060404&amp;diff=163841</id>
		<title>AdatbServerProgJegyzet20060404</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060404&amp;diff=163841"/>
		<updated>2013-03-31T19:03:38Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerveroldali programozása Labor, 2006.04.04.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerveroldali_programozása_Labor,_2006.04.04.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerveroldali_programoz%C3%A1sa_Labor,_2006.04.04.&amp;diff=163840</id>
		<title>Adatbázisok szerveroldali programozása Labor, 2006.04.04.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerveroldali_programoz%C3%A1sa_Labor,_2006.04.04.&amp;diff=163840"/>
		<updated>2013-03-31T19:03:37Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060404}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060404}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060331|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.04.04. [[AdatbServerProgJegyzet20060407|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==PL/SQL Csomagok==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Készíts el egy csomagot a Forma-1-es adatbázis különböző műveleteinek egységbe&lt;br /&gt;
zárására! Készíts eljárásokat, amiknek segítségével új csapatot, új szezont és új pilótát lehet felvenni. Definiálj globális kivételeket a különböző, az eljárások során fellépő kivételekhez (Hibás bemeneti paraméter, már létező csapat/szezon/pilóta stb.)!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Csomag deklaráció&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE forma1_insert is&lt;br /&gt;
	csapatletezik EXCEPTION;&lt;br /&gt;
	csapatnevhianyzik EXCEPTION;&lt;br /&gt;
	PROCEDURE ujcsapat(csnev VARCHAR2, csszekhely VARCHAR2);&lt;br /&gt;
END forma1_insert;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Csomag törzs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE BODY forma1_insert IS&lt;br /&gt;
	PROCEDURE ujcsapat(csnev VARCHAR2, csszekhely VARCHAR2) IS&lt;br /&gt;
		id INT;&lt;br /&gt;
		db INT;&lt;br /&gt;
	BEGIN&lt;br /&gt;
		IF csnev IS NULL THEN&lt;br /&gt;
			RAISE csapatnevhianyzik;&lt;br /&gt;
		END IF;&lt;br /&gt;
		SELECT count(csapatid) INTO db FROM csapat WHERE nev=csnev OR szekhely=csszekhely;&lt;br /&gt;
		IF db&amp;gt;0 THEN&lt;br /&gt;
			RAISE csapatletezik;&lt;br /&gt;
		END IF;&lt;br /&gt;
		SELECT NVL(MAX(csapatid),0)+1 INTO id FROM csapat;&lt;br /&gt;
		INSERT INTO csapat VALUES(id, csnev, csszekhely);&lt;br /&gt;
	END;&lt;br /&gt;
END forma1_insert;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj egy blokkot, ami kipróbálja a csomag egyes eljárásait! A blokkon belül kapd el az&lt;br /&gt;
esetlegesen fellépő csomagbeli kivételeket, és értesítsd az eseményről a kliens oldalt&lt;br /&gt;
(alkalmazás hiba dobása megfelelő hibaüzenettel).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
	forma1_insert.ujcsapat(&#039;1&#039;, &#039;x&#039;);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN forma1_insert.csapatletezik THEN&lt;br /&gt;
		DBMS_OUTPUT.put_line(&#039;Csapatnév már létezik&#039;);&lt;br /&gt;
	WHEN forma1_insert.csapatnevhianyzik THEN&lt;br /&gt;
		DBMS_OUTPUT.put_line(&#039;Csapatnév nincs megadva&#039;);&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Egészítsd ki a forma1-es csomagot az alábbi funkciókkal. Egy eljárást kell&lt;br /&gt;
elkészítened, aminek bemenő paramétereként egy csapat összetételét kell megadni&lt;br /&gt;
(szezon, csapatnév, pilóták neve típussal) az eljáráson belül pedig az adott szezonba&lt;br /&gt;
az adott csapathoz a megadott pilóták kerülnek felvételre. Amennyiben a csapat az&lt;br /&gt;
adott szezonban még nem létezik, akkor az eljárás felvesz egy új bejegyzést a&lt;br /&gt;
CSAPAT_SZEZON táblába, de egy hibaüzenettel jelzi, hogy hiányos adatokkal&lt;br /&gt;
dolgozott. Hozz létre egy rekord típust, ami az eljárás bemenete lesz, és hozd létre az&lt;br /&gt;
eljárást is!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE forma1_insert IS&lt;br /&gt;
	csapatletezik EXCEPTION;&lt;br /&gt;
	csapatnevhianyzik EXCEPTION;&lt;br /&gt;
	csapatnemletezik EXCEPTION;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	TYPE pilotalista IS TABLE OF csapat.nev%TYPE;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	PROCEDURE ujcsapat(csnev VARCHAR2, csszekhely VARCHAR2);&lt;br /&gt;
	PROCEDURE csapatot_feltolt(szezon INT, csnev VARCHAR2,&lt;br /&gt;
		pilota1 VARCHAR2, pilota2 VARCHAR2, pilotat pilotalista);&lt;br /&gt;
END forma1_insert;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PACKAGE BODY forma1_insert is&lt;br /&gt;
	FUNCTION get_csapatid(csapatnev VARCHAR2) RETURN INT IS&lt;br /&gt;
		result INT;&lt;br /&gt;
	BEGIN&lt;br /&gt;
		SELECT csapatid INTO result FROM csapat WHERE nev=csapatnev;&lt;br /&gt;
		RETURN result;&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
		WHEN NO_DATA_FOUND THEN&lt;br /&gt;
		  RETURN NULL;&lt;br /&gt;
	END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	-- megkeres vagy beszúr egy pilótát, és visszaadja az id-jét&lt;br /&gt;
	FUNCTION get_pilotaid(pnev VARCHAR2) RETURN INT IS&lt;br /&gt;
		result INT;&lt;br /&gt;
	BEGIN&lt;br /&gt;
		SELECT pilotaid INTO result FROM pilota WHERE nev=pnev;&lt;br /&gt;
		RETURN result;&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
		WHEN NO_DATA_FOUND THEN&lt;br /&gt;
			SELECT NVL(MAX(pilotaid),0)+1 INTO result FROM pilota;&lt;br /&gt;
			INSERT INTO pilota(pilotaid, nev) VALUES(result, pnev);&lt;br /&gt;
			RETURN result;&lt;br /&gt;
	END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	PROCEDURE csapatot_feltolt(szezon INT, csnev VARCHAR2,&lt;br /&gt;
		pilota1 VARCHAR2, pilota2 VARCHAR2, pilotat pilotalista)&lt;br /&gt;
	IS&lt;br /&gt;
		csid INT;&lt;br /&gt;
		csszid INT;&lt;br /&gt;
		pid INT;&lt;br /&gt;
		i INT;&lt;br /&gt;
	BEGIN&lt;br /&gt;
		csid := get_csapatid(csnev);&lt;br /&gt;
		SELECT NVL(MAX(csapatszezonid),0)+1 INTO csszid FROM csapat_szezon;&lt;br /&gt;
		INSERT INTO csapat_szezon(csapatszezonid, csapatid, ev)&lt;br /&gt;
			VALUES(csid, csszid, szezon);&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
		pid := get_pilotaid(pilota1);&lt;br /&gt;
		INSERT INTO csapat_pilota VALUES(csszid, pid, &#039;1&#039;);&lt;br /&gt;
		pid := get_pilotaid(pilota2);&lt;br /&gt;
		INSERT INTO csapat_pilota VALUES(csszid, pid, &#039;2&#039;);&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
		i := pilotat.FIRST;&lt;br /&gt;
		WHILE i IS NOT NULL LOOP&lt;br /&gt;
			pid := get_pilotaid(pilotat(i));&lt;br /&gt;
			INSERT INTO csapat_pilota VALUES(csszid, pid, &#039;2&#039;);&lt;br /&gt;
			i := pilotat.NEXT(i);&lt;br /&gt;
		END LOOP;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
		IF csid IS NULL THEN&lt;br /&gt;
			RAISE csapatnemletezik;&lt;br /&gt;
		END IF;&lt;br /&gt;
	END;&lt;br /&gt;
END forma1_insert;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Készíts egy blokkot, ami létrehoz egy csapat összeállítást, ás az előző feladatban&lt;br /&gt;
létrehozott eljárást hívja meg. Amennyiben az eljárás hiányos adat hibával tér vissza,&lt;br /&gt;
a csapat szezonális adatait is vidd be a blokkon belül!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Egészítsd ki a forma1-es csomagot egy eljárással, aminek két bemenő paramétere egy&lt;br /&gt;
csapat neve és egy szezon, egy kimenő paramétere pedig egy REF CURSOR típusú&lt;br /&gt;
változó, amibe az adott csapat adott évben futott versenyzőinek eredményét&lt;br /&gt;
tartalmazza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Készíts blokkot, ami meghívja az előző feladatban megírt eljárást, és a kimenetre&lt;br /&gt;
(DBMS_OUTPUT.PUT_LINE) kiírja az eredméyt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Készíts el egy csomagot a cukrász adatbázisbeli műveletek egységbe zárása céljából!&lt;br /&gt;
A csomag tartalmazzon két eljárást. Az egyik eljárás tegye lehetővé különböző&lt;br /&gt;
alapanyagok, félkészek vagy termékek felvételét az adatbázisba. Az eljárás&lt;br /&gt;
paraméterei közt szerepeljen az adat típusa, és ezek alapján az eljárás szúrja be a&lt;br /&gt;
megfelelő táblába az adatokat. Az azonosítót szekvenciával generáljad! A második&lt;br /&gt;
eljárás tegye lehetővé félkész termékek receptjét összeállítani, magyarul a két&lt;br /&gt;
bemeneti paramétere egy anyag és egy félkész neve legyen, valamint az anyag&lt;br /&gt;
mennyisége. Próbáld ki a csomagot egy teszt blokk segítségével. Ellenőrizd, hogy jól&lt;br /&gt;
működnek-e az eljárások.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Egészítsd ki a cukrász csomagot a következők szerint. A csomag tartalmazzon egy&lt;br /&gt;
eljárást, aminek egy kimenő paramétere van, ami a még nem teljesített rendeléseket&lt;br /&gt;
tartalmazza. (Feltételezzük, hogy van egy rendelés tábla, ha nincs, hozd azt létre!) A&lt;br /&gt;
kimenet egy rekordokból álló tömb legyen, amely tartalmazza a rendelés azonosítóját,&lt;br /&gt;
az áru nevét, típusát, mennyiségét, a rendelés dátumát valamint a forintban és euróban&lt;br /&gt;
vett árát. Az euró árfolyamát a csomagon belül egy változóban tároljuk, és az első&lt;br /&gt;
használatkor kerül meghatározásra.&lt;br /&gt;
* Tervezd meg a csomag részeit (globális és lokális függvények, eljárások, globális és lokális típusok, inicializáló paraméter.) Alapértelmezésben az euró árfolyamát konstans értékre állítsuk be!&lt;br /&gt;
* Valósítsd meg az egyes eljárásokat és függvényeket, és egy teszt blokk segítségével próbáld is ki a csomagot!&lt;br /&gt;
* Készíts egy függvényt, ami véletlen módon határozza meg az euró árfolyamát, ahol az euró alap árfolyama legyen 240,15 Ft, és a véletlen ingadozás legyen 0-20 között.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Az előadáson ismertetett jogosultság ellenőrző rendszert valósítsd meg. A feladat a&lt;br /&gt;
következő volt:&lt;br /&gt;
&lt;br /&gt;
A tanár-diák adatbázisban a diákok nyilvántartására nem célszerű létrehozni annyi&lt;br /&gt;
Oracle felhasználót, amennyi diák van. Helyette a STUDENT táblában tároljuk el az&lt;br /&gt;
egyes diákok azonosítóit és jelszavait, és mindenki egységesen ugyanazzal az Oracle&lt;br /&gt;
felhasználóval léphet be. Létre kell ezért hozni egy mechanizmust, ami biztosítja,&lt;br /&gt;
hogy egy diák csak akkor tudjon különböző műveleteket végrehajtani az&lt;br /&gt;
adatbázisban, ha valóban belépett. Készíts egy csomagot, aminek változójában el&lt;br /&gt;
tudjuk tárolni, hogy egy adott diák belépett-e vagy sem! Írd meg a belépő eljárást, és&lt;br /&gt;
a belépést ellenőrző függvényt!&lt;br /&gt;
&lt;br /&gt;
Írj triggert, ami csak akkor enged adatmódosító utasítást lefuttatni a vizsga&lt;br /&gt;
jelentkezés táblán, ha a diák belépett a rendszerbe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Módosítsd az előző feladatban megírt csomagot úgy, hogy a tanárok jogosultságait is&lt;br /&gt;
tudja kezelni. Egy vizsgát csak egy tanári jogosultsággal rendelkező felhasználó&lt;br /&gt;
írhasson ki, míg egy vizsgára diák is vagy akár tanár is jelentkezhessen. A diák&lt;br /&gt;
adatait pl. E-mail cím vagy jelszó, csak az adott diák tudja módosítani! Írd meg hozzá a szükséges triggereket vagy tárol eljárásokat!&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.04.04.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060314&amp;diff=163839</id>
		<title>AdatbServerProgJegyzet20060314</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060314&amp;diff=163839"/>
		<updated>2013-03-31T19:03:33Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.03.14.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.03.14.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.14.&amp;diff=163838</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.03.14.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.14.&amp;diff=163838"/>
		<updated>2013-03-31T19:03:32Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060314}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;br/&amp;gt; &amp;amp;lt;&amp;amp;lt; Labor,…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060314}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060310|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.03.14. [[AdatbServerProgJegyzet20060317|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Készíts egy anonim blokkot, ami sorra kiírja a kimenetre a páros számokat 1-től 100-ig, majd a páratlan számokat visszafele 100-tól 1-ig!&lt;br /&gt;
&amp;lt;pre&amp;gt;BEGIN&lt;br /&gt;
	FOR i IN 1..50 LOOP&lt;br /&gt;
		DBMS_OUTPUT.put_line(i*2);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
	FOR i IN REVERSE 1..50 LOOP&lt;br /&gt;
		DBMS_OUTPUT.put_line(i*2-1);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Készíts egy anonim blokkot, aminek van két paramétere, amiket futás előtt állíthatunk, az egyik a pilóta azonosítója, a másik egy évszám. A blokk belsejében írd ki (&amp;lt;pre&amp;gt;DBMS_OUTPUT.put_line&amp;lt;/pre&amp;gt;), hogy az adott pilóta az adott szezonban milyen típusú pilótaként (Elsőszámú, Másodszámú, Teszt) szerepelt a Forma-1 világában. Amennyiben hibás paramétereket adtak meg, akkor azt írd ki, hogy nincs megfelelő adat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	pilota_id int := 103;&lt;br /&gt;
	evszam int := 2005;&lt;br /&gt;
	pilota_tipus int;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT pilotatipus INTO pilota_tipus&lt;br /&gt;
	FROM csapat_pilota, csapat_szezon&lt;br /&gt;
	WHERE csapat_pilota.csapatszezonid = csapat_szezon.csapatszezonid AND&lt;br /&gt;
		csapat_pilota.pilotaid = pilota_id AND&lt;br /&gt;
		csapat_szezon.ev = evszam;&lt;br /&gt;
		&lt;br /&gt;
	CASE pilota_tipus&lt;br /&gt;
		WHEN &#039;1&#039; THEN DBMS_OUTPUT.put_line(&#039;Elsőszámú&#039;);&lt;br /&gt;
		WHEN &#039;2&#039; THEN DBMS_OUTPUT.put_line(&#039;Másodszámú&#039;);&lt;br /&gt;
		WHEN &#039;T&#039; THEN DBMS_OUTPUT.put_line(&#039;Teszt&#039;);&lt;br /&gt;
		ELSE DBMS_OUTPUT.put_line(&#039;Nincs megfelelő adat&#039;);&lt;br /&gt;
	END CASE;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Definiálj egy tízelemű egész számok tárolására alkalmas tömböt! Töltsd fel a tömb elemeit sorra páros számokkal! Ezek után írasd ki a tömb elemeit a kimenetre. A megoldáskor ne használd ki, hogy tudod a tömb méretét!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	TYPE tomb_tipus IS TABLE OF int;&lt;br /&gt;
	tomb tomb_tipus;&lt;br /&gt;
	i int;&lt;br /&gt;
BEGIN&lt;br /&gt;
	tomb:=tomb_tipus();&lt;br /&gt;
	FOR i IN 1..10 LOOP&lt;br /&gt;
		 tomb.EXTEND;&lt;br /&gt;
		 tomb(i):=i*2;&lt;br /&gt;
	END LOOP;&lt;br /&gt;
&lt;br /&gt;
	i:=tomb.FIRST;&lt;br /&gt;
	LOOP&lt;br /&gt;
		EXIT WHEN i IS NULL;&lt;br /&gt;
		DBMS_OUTPUT.put_line(tomb(i));&lt;br /&gt;
		i:=tomb.NEXT(i);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Írj egy PL/SQL blokkot, ami kurzor használata nélkül az anyag tábla sorait kiírja a kimenetre!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	min_id int;&lt;br /&gt;
	max_id int;&lt;br /&gt;
	db int;&lt;br /&gt;
	anyag_sor anyag%ROWTYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT min(anyag_id) INTO min_id FROM anyag;&lt;br /&gt;
	SELECT max(anyag_id) INTO max_id FROM anyag;&lt;br /&gt;
	FOR i IN min_id..max_id LOOP&lt;br /&gt;
		SELECT count(anyag_id) INTO db FROM anyag WHERE anyag_id=i;&lt;br /&gt;
		IF db=1 THEN&lt;br /&gt;
			SELECT * into anyag_sor FROM anyag WHERE anyag_id=i;&lt;br /&gt;
			DBMS_OUTPUT.put_line(anyag_sor.anyag_id || &#039; &#039; || anyag_sor.anyag_nev);&lt;br /&gt;
		END IF;&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Oldd meg az előző feladatot explicit kurzor használatával! Hasonlítsa össze a két megoldást!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	CURSOR c IS SELECT anyag_id id, anyag_nev nev FROM anyag;&lt;br /&gt;
BEGIN&lt;br /&gt;
	FOR rec IN c LOOP&lt;br /&gt;
		DBMS_OUTPUT.put_line(rec.id || &#039; &#039; || rec.nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Oldd meg az előző feladatot implicit kurzort használó kurzor for ciklussal!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;BEGIN&lt;br /&gt;
	FOR rec IN (SELECT anyag_id, anyag_nev FROM anyag) LOOP&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(rec.anyag_id || &#039; &#039; || rec.anyag_nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki, hogy a gyümölcstorta milyen összetevőkből áll. A lista tartalmazza az alapanyagokat, amiket közvetlen a tortához kell felhasználni, és a félkész termékeket. Minden félkész termékek alatt egy kis listában jelenjen meg, hogy az adott félkész termék milyen alapanyagokból tevődik össze. Az alapanyag neve mellett a mennyiséget és a mértékegységet is írasd ki.&lt;br /&gt;
&lt;br /&gt;
Minta:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;A Csokitorta osszetevoi:&lt;br /&gt;
	porcukor(.02 kg)&lt;br /&gt;
	tejszinhab&lt;br /&gt;
		tejszin(4 dl)&lt;br /&gt;
		cukor(.1 kg)&lt;br /&gt;
	csoki krem&lt;br /&gt;
		kakao(750 g)&lt;br /&gt;
		tej(1 l)&lt;br /&gt;
		cukor(.5 kg)&lt;br /&gt;
	piskota&lt;br /&gt;
		tojas(6 db)&lt;br /&gt;
		liszt(.25 kg)&lt;br /&gt;
		cukor(.06 kg)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	termeknev termek.termek_nev%TYPE := &#039;Gyumolcstorta&#039;;&lt;br /&gt;
BEGIN&lt;br /&gt;
  DBMS_OUTPUT.put_line(&#039;A(z) &#039; || termeknev || &#039; összetev&amp;amp;otilde;i&#039;);&lt;br /&gt;
  FOR rec IN (&lt;br /&gt;
	  SELECT anyag.anyag_nev, termek_anyag.ta_mennyiseg, egyseg.egyseg_nev&lt;br /&gt;
	  FROM termek, termek_anyag, anyag, egyseg&lt;br /&gt;
	  WHERE termek.termek_id = termek_anyag.ta_termekid AND&lt;br /&gt;
		  anyag.anyag_id = termek_anyag.ta_anyagid AND&lt;br /&gt;
		  egyseg.egyseg_id = anyag.anyag_egyseg AND&lt;br /&gt;
		  termek.termek_nev = termeknev&lt;br /&gt;
  ) LOOP&lt;br /&gt;
	  DBMS_OUTPUT.put_line(&#039;	&#039; || rec.anyag_nev || &#039; (&#039; || rec.ta_mennyiseg || &lt;br /&gt;
		  &#039; &#039; || rec.egyseg_nev || &#039;)&#039;);&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  &lt;br /&gt;
  FOR rec IN (&lt;br /&gt;
	  SELECT felkesz.felkesz_id, felkesz.felkesz_nev&lt;br /&gt;
	  FROM termek, termek_felkesz, felkesz&lt;br /&gt;
	  WHERE termek.termek_id = termek_felkesz.tf_termekid AND&lt;br /&gt;
		  felkesz.felkesz_id = termek_felkesz.tf_felkeszid AND&lt;br /&gt;
		  termek.termek_nev = termeknev&lt;br /&gt;
	 ) LOOP&lt;br /&gt;
		 DBMS_OUTPUT.put_line(&#039;	&#039; || rec.felkesz_nev);&lt;br /&gt;
		 FOR rec2 IN (&lt;br /&gt;
			 SELECT anyag.anyag_nev, felkesz_anyag.fa_mennyiseg, egyseg.egyseg_nev&lt;br /&gt;
			 FROM felkesz, felkesz_anyag, anyag, egyseg&lt;br /&gt;
			 WHERE felkesz.felkesz_id = felkesz_anyag.fa_felkeszid AND&lt;br /&gt;
				 anyag.anyag_id = felkesz_anyag.fa_anyagid AND&lt;br /&gt;
				 anyag.anyag_egyseg = egyseg.egyseg_id AND&lt;br /&gt;
				 felkesz.felkesz_id = rec.felkesz_id&lt;br /&gt;
		 ) LOOP&lt;br /&gt;
			 DBMS_OUTPUT.put_line(&#039;		&#039; || rec2.anyag_nev || &#039; (&#039; || &lt;br /&gt;
				 rec2.fa_mennyiseg || &#039; &#039; || rec2.egyseg_nev || &#039;)&#039;);&lt;br /&gt;
		 END LOOP;&lt;br /&gt;
	 END LOOP;		  &lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Hozz létre egy struktúrát, ami félkész termékek receptjeinek tárolására szolgál. Hozz létre egy tömböt az összes félkész termék receptjeinek a tárolására, és töltsd fel adatokkal. Ellenőrzésképpen írasd ki a tömb tartalmát a kimenetre!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.14.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060324&amp;diff=163837</id>
		<title>AdatbServerProgJegyzet20060324</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060324&amp;diff=163837"/>
		<updated>2013-03-31T19:03:31Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.03.24.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.03.24.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.24.&amp;diff=163836</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.03.24.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.24.&amp;diff=163836"/>
		<updated>2013-03-31T19:03:30Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060324}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display:block; me…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060324}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	code.precompact { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px; line-height: 12px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060321|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.03.24. [[AdatbServerProgJegyzet20060328|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Triggerek==&lt;br /&gt;
&lt;br /&gt;
A trigger egy adatbázis eseményre automatikusan lefutó tárolt eljárás. Explicite nem hívható.&lt;br /&gt;
&lt;br /&gt;
Típusai:&lt;br /&gt;
* DML triggerek: =INSERT=, =UPDATE= vagy =DELETE= eseménzekre fut le&lt;br /&gt;
* DDL triggerek: =CREATE=, =ALTER=, =DROP=, =GRANT=, =REVOKE= eseményekre fut le&lt;br /&gt;
* Szerver események: Startup, Shutdown&lt;br /&gt;
* Felhasználói események: Logon, Logoff&lt;br /&gt;
&lt;br /&gt;
===DML triggerek===&lt;br /&gt;
* esemény lehet: =INSERT=, =UPDATE= vagy =DELETE=&lt;br /&gt;
* nézethez vagy táblához rendelhető hozzá&lt;br /&gt;
* esemény előtt (&amp;lt;pre&amp;gt;BEFORE&amp;lt;/pre&amp;gt;), után (&amp;lt;pre&amp;gt;AFTER&amp;lt;/pre&amp;gt;) vagy helyett (&amp;lt;pre&amp;gt;INSTEAD OF&amp;lt;/pre&amp;gt;) fut le&lt;br /&gt;
* az esemény bekövetkeztekor lefuthat egyszer vagy minden sorra&lt;br /&gt;
&lt;br /&gt;
====Szintaktika====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE TRIGGER név&lt;br /&gt;
	{BEFORE | AFTER || INSTEAD OF} {INSERT || DELETE  UPDATE [OF oszlop1, ...]}&lt;br /&gt;
	[OR további események ...]&lt;br /&gt;
	ON {táblanév | nézetnév} [FOR EACH ROW]&lt;br /&gt;
	[WHEN feltétel]&lt;br /&gt;
PL/SQL blokk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Az =INSTEAD OF= csak nézetre használható. Akkor van értelme, ha a nézet több táblából származik. Ilyenkor az Oracle nem támogatja az =INSERT=, =UPDATE= és =DELETE= parancsokat, nekünk kell megírnunk, hogy mi történjen.&lt;br /&gt;
* A =BEFORE= és az =AFTER= csak táblára működik. &lt;br /&gt;
* Az =UPDATE= trigger alapesetben bármelyik oszlop változása esetén kiváltódik, de az =OF= kulcsszóval szűkíthető kevesebb oszlopra.&lt;br /&gt;
* A tábla törlésével a kapcsolódó triggerek is törlődnek&lt;br /&gt;
&lt;br /&gt;
====BEFORE használata====&lt;br /&gt;
* A =BEFORE= az utasítás előtt fut le, ha exceptiont dobunk, az utasítás nem hajtódik végre&lt;br /&gt;
* Leggyakoribb célok&lt;br /&gt;
** azonosító generálás&lt;br /&gt;
** logolás, ha a próbálkozást is naplózzuk (pl. biztonsági log)&lt;br /&gt;
** táblaméret korlátozása (&amp;lt;pre&amp;gt;INSERT&amp;lt;/pre&amp;gt; előtt, pl. a vizsgára csak 20 ember jelentkezhet)&lt;br /&gt;
** származtatott mező kitöltése&lt;br /&gt;
&lt;br /&gt;
====AFTER használata====&lt;br /&gt;
* származtatott mező kitöltése másik táblában, mint amire az SQL utasítás hivatkozik&lt;br /&gt;
* sikeres műveletek naplózása&lt;br /&gt;
&lt;br /&gt;
====Triggerek lefutási sorrendje====&lt;br /&gt;
* =BEFORE= utasításra vonatkozó trigger&lt;br /&gt;
* minden sorra&lt;br /&gt;
** =BEFORE= sorra vonatkozó trigger&lt;br /&gt;
** utasítás&lt;br /&gt;
** =AFTER= sorra vonatkozó trigger&lt;br /&gt;
* =AFTER= utasításra vonatkozó trigger&lt;br /&gt;
* Ha 1 táblára több azonos típusú trigger is vonatkozik, a lefutási sorrend nem definiált&lt;br /&gt;
&lt;br /&gt;
====Hivatkozás az éppen beszúrt vagy törölt adatokra====&lt;br /&gt;
* csak =FOR EACH ROW= trigger esetén használható&lt;br /&gt;
* Beszúrandó (&amp;lt;pre&amp;gt;INSERT&amp;lt;/code) vagy módosított (&amp;lt;code&amp;gt;UPDATE&amp;lt;/pre&amp;gt;) érték: =:new.oszlopnév=&lt;br /&gt;
* Módosítandó (&amp;lt;pre&amp;gt;UPDATE&amp;lt;/code) vagy törlendőt (&amp;lt;code&amp;gt;DELETE&amp;lt;/pre&amp;gt;) érték: =:old.oszlopnév=&lt;br /&gt;
* A =BEFORE= triggerekben a =:new= értékek írhatók, az =:old= értékek csak olvashatók&lt;br /&gt;
* Az =AFTER= triggerekben mindkettő csak olvasható&lt;br /&gt;
&lt;br /&gt;
===DDL triggerek===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE TRIGGER név&lt;br /&gt;
	{BEFORE | AFTER} DDL esemény [OR DDL esemény ...]&lt;br /&gt;
	ON SCHEMA&lt;br /&gt;
	[WHEN feltétel]&lt;br /&gt;
PL/SQL blokk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Szerver triggerek===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE TRIGGER név&lt;br /&gt;
	{BEFORE | AFTER} adatbázis esemény [OR adatbázis esemény ...]&lt;br /&gt;
	ON DATABASE&lt;br /&gt;
	[WHEN feltétel]&lt;br /&gt;
PL/SQL blokk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Példák===&lt;br /&gt;
&lt;br /&gt;
====ID generálás====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TRIGGER agyag_idtr BEFORE INSERT ON anyag FOR EACH ROW&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT anyag_seq.NEXTVAL INTO :new.anyag_id FROM DUAL;&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Kurzus létszám korlátozása====&lt;br /&gt;
&lt;br /&gt;
Relációs séma:&lt;br /&gt;
&amp;lt;code class=&amp;quot;precompact&amp;quot;&amp;gt;&lt;br /&gt;
+------=		 +----------------+		 +-----------+=&lt;br /&gt;
&amp;amp;#124; Student |-------|| Student_course ||-------|| Course	 &lt;br /&gt;
|}&lt;br /&gt;
+------=		 +----------------+		 +-----------+=&lt;br /&gt;
														 &amp;amp;#124; cou_limit |&lt;br /&gt;
|}&lt;br /&gt;
														 +--------==&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE TRIGGER diak_limit&lt;br /&gt;
	BEFORE INSERT ON student_course FOR EACH ROW&lt;br /&gt;
DECLARE&lt;br /&gt;
	db INT;&lt;br /&gt;
	dblimit INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT count(*) INTO db FROM student_course WHERE sc_courseid = :new.sc_courseid;&lt;br /&gt;
	SELECT cou_limit INTO dblimit FROM course WHERE cou_id = :new.sc_courseid;&lt;br /&gt;
	IF db&amp;gt;=dblimit THEN&lt;br /&gt;
		RAISE_APPLICATION_ERROR(-20111, &#039;Betelt&#039;);&lt;br /&gt;
	END IF;&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Trigger szintű constraintek====&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
* Formula 1 relációs séma&lt;br /&gt;
* milyen constrainteknek van értelme jelen esetben&lt;br /&gt;
* kód a helyezés számítására&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.27.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060224&amp;diff=163835</id>
		<title>AdatbServerProgJegyzet20060224</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060224&amp;diff=163835"/>
		<updated>2013-03-31T19:03:29Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.02.24.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.02.24.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.02.24.&amp;diff=163834</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.02.24.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.02.24.&amp;diff=163834"/>
		<updated>2013-03-31T19:03:28Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060224}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display:block; me…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060224}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060221|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.02.24. [[AdatbServerProgJegyzet20060303|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Oracle és Sql Server 2005 közötti különbségek==&lt;br /&gt;
&lt;br /&gt;
* String összefűzés&lt;br /&gt;
** Oracle: =SELECT vezetéknév ||| &#039; &#039; || keresztnév FROM felhasználók=&lt;br /&gt;
** MS SQL: =SELECT vezetéknév + &#039; &#039; + keresztnév FROM felhasználók= &lt;br /&gt;
&amp;lt;br/&amp;gt; Szám és string összefűzésénél a számot először konvertálni kell: =CONVERT(varchar, oszlopnév)=&lt;br /&gt;
&lt;br /&gt;
* =NULL= érték kezelés&lt;br /&gt;
** Oracle: =NVL(oszlop, érték)=&lt;br /&gt;
** MS SQL: =ISNULL(oszlop, érték)=&lt;br /&gt;
&lt;br /&gt;
* Aktuális dátum&lt;br /&gt;
** Oracle: =SELECT sysdate FROM DUAL= &lt;br /&gt;
&amp;lt;br/&amp;gt; A =DUAL= egy 1 soros beépített tábla. Oracle-ben nem hagyható el a =SELECT= mögül a =FROM=, ezért kell trükközni.&lt;br /&gt;
** MS SQL: =SELECT getdate()=&lt;br /&gt;
&lt;br /&gt;
* Stringből dátum&lt;br /&gt;
** Oracle: =INSERT INTO tábla VALUES(TO_DATE(&#039;2006-02-24&#039;, &#039;yyyy-mm-dd&#039;))=&lt;br /&gt;
** MS SQL: automatikusan konvertál stringből, többféle formátumot felismer (pl. &#039;2006-02-24&#039;)&lt;br /&gt;
&lt;br /&gt;
* Első 5 sor&lt;br /&gt;
** Oracle: =rownum&amp;amp;lt;=5=. Operátorként itt csak &amp;amp;lt; és &amp;amp;lt;= megengedett. Ha egy táblának kérjük valamilyen rendezés (&amp;lt;pre&amp;gt;ORDER BY ...&amp;lt;/pre&amp;gt;) szerinti első néhány sorát, a rendezést allekérdezébe (beágyazott lekérdezésbe) kell rakni, mert különben fordított sorrendben értékeli ki az &amp;lt;pre&amp;gt;ORDER BY&amp;lt;/pre&amp;gt;-t és a &amp;lt;pre&amp;gt;rownum&amp;amp;lt;=5&amp;lt;/pre&amp;gt;-öt. (tehát először kapjuk meg a rendezetlen tábla első öt sorát, majd az &amp;lt;pre&amp;gt;ORDER BY&amp;lt;/pre&amp;gt; csak a lekért rendezetlen öt sort rendezi) &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;SELECT * FROM (&lt;br /&gt;
&amp;lt;br/&amp;gt;	SELECT id, name&lt;br /&gt;
&amp;lt;br/&amp;gt;	FROM students ORDER BY name) a&lt;br /&gt;
&amp;lt;br/&amp;gt;WHERE rownum&amp;amp;lt;=5&amp;lt;/code&amp;gt;&lt;br /&gt;
** MS SQL: =SELECT TOP 5 id, name FROM student ORDER BY name=&lt;br /&gt;
		&lt;br /&gt;
* Intervallum kiválasztása&lt;br /&gt;
** Oracle: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;SELECT * FROM&lt;br /&gt;
&amp;lt;br/&amp;gt;	(SELECT id, name FROM student ORDER BY name) a&lt;br /&gt;
&amp;lt;br/&amp;gt;WHERE rownum&amp;amp;lt;=10&lt;br /&gt;
&amp;lt;br/&amp;gt;MINUS&lt;br /&gt;
&amp;lt;br/&amp;gt;SELECT * FROM&lt;br /&gt;
&amp;lt;br/&amp;gt;	(SELECT id, name FROM student ORDER BY name) b&lt;br /&gt;
&amp;lt;br/&amp;gt;WHERE rownum&amp;amp;lt;=5&amp;lt;/code&amp;gt;&lt;br /&gt;
** MS SQL: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;SELECT * FROM&lt;br /&gt;
&amp;lt;br/&amp;gt;	(SELECT TOP 10 id, name FROM student ORDER BY név) a&lt;br /&gt;
&amp;lt;br/&amp;gt;EXCEPT&lt;br /&gt;
&amp;lt;br/&amp;gt;SELECT * FROM&lt;br /&gt;
&amp;lt;br/&amp;gt;	(SELECT TOP 5 id, name FROM student ORDER BY név) b&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Táblanevek lekérdezése&lt;br /&gt;
** Oracle: =SELECT table_name FROM user_tables=&lt;br /&gt;
** MS SQL: =sp_tables=&lt;br /&gt;
&lt;br /&gt;
* Logolás&lt;br /&gt;
** Oracle: =DBMS_OUTPUT.PUT_LINE(&#039;a&#039;)=&lt;br /&gt;
** MS SQL: =print &#039;a&#039;=&lt;br /&gt;
&lt;br /&gt;
* Azonosító generálás (primary key oszlop automatikus generálása):&lt;br /&gt;
** ld. [[AdatbServerProgJegyzet20060217#generate_identifier|2006.02.17. jegyzet]]&lt;br /&gt;
&lt;br /&gt;
==PL/SQL==&lt;br /&gt;
&lt;br /&gt;
===Tárolt eljárások===&lt;br /&gt;
&lt;br /&gt;
Az Oracle-ben minden utasítást blokkba kell zárni. Az utasításokat és a blokkokat pontosvessző zárja le.&lt;br /&gt;
&lt;br /&gt;
====Anonim blokk====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;[&amp;amp;lt;&amp;amp;lt;cimke&amp;amp;gt;&amp;amp;gt;]&lt;br /&gt;
[DECLARE&lt;br /&gt;
	változó deklaráció, lokális eljárások]&lt;br /&gt;
BEGIN&lt;br /&gt;
	utasítások, blokkok&lt;br /&gt;
[EXCEPTION&lt;br /&gt;
	kivételkezelés]&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
====Eljárás====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;PROCEDURE név(paraméterek)&lt;br /&gt;
[IS&lt;br /&gt;
	...]&lt;br /&gt;
BEGIN&lt;br /&gt;
	... &lt;br /&gt;
[EXCEPTION&lt;br /&gt;
	...] &lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Függvény====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;coe class=&amp;quot;pre&amp;quot;&amp;gt;FUNCTION név(paraméterek)&lt;br /&gt;
RETURN típus&lt;br /&gt;
[IS&lt;br /&gt;
	...]&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
[EXCEPTION&lt;br /&gt;
	...]&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
===Komment===&lt;br /&gt;
&lt;br /&gt;
* Egysoros: =--=&lt;br /&gt;
* Többsoros: =/* */=, nem ágyazhatók egymásba&lt;br /&gt;
&lt;br /&gt;
===Változók===&lt;br /&gt;
&lt;br /&gt;
* azonosító: [a-zA-Z][a-zA-Z0-9$_]*, nem case sensitive és legfeljebb 30 hosszú. Ha az azonosító ettől különböző formájú, idézőjelek közé kell tenni. A hosszba az idézőjeleket is bele kell számolni.&lt;br /&gt;
* deklaráció: ha nem adunk meg kezdőértéket, &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-t vesz fel.&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
&amp;lt;br/&amp;gt;	szam1 INT;&lt;br /&gt;
&amp;lt;br/&amp;gt;	szam2 INT := 3;&lt;br /&gt;
&amp;lt;br/&amp;gt;	szam3 INT DEFAULT 5;&lt;br /&gt;
&amp;lt;br/&amp;gt;	datum DATE NOT NULL := &#039;2006-FEB-12&#039;;&lt;br /&gt;
&amp;lt;br/&amp;gt;	pi CONSTANT REAL := 3.14;&lt;br /&gt;
&amp;lt;br/&amp;gt;	diak_nev student.stud_name%TYPE;&lt;br /&gt;
&amp;lt;br/&amp;gt;	diak_rekord student%ROWTYPE;&amp;lt;/code&amp;gt;&lt;br /&gt;
* értékadás: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;BEGIN&lt;br /&gt;
&amp;lt;br/&amp;gt;	szám1 := 3;&lt;br /&gt;
&amp;lt;br/&amp;gt;	SELECT id INTO szam2 FROM ...;&lt;br /&gt;
&amp;lt;br/&amp;gt;	=SELECT id,id2 INTO szam3,szam4 FROM ...;&amp;lt;/code&amp;gt; A &amp;lt;pre&amp;gt;SELECT&amp;lt;/pre&amp;gt;-nek pontosan 1 sorral kell visszatérnie, különben &amp;lt;pre&amp;gt;NO_DATA_FOUND&amp;lt;/pre&amp;gt; vagy &amp;lt;pre&amp;gt;TOO_MANY_ROWS&amp;lt;/pre&amp;gt; exceptiont dob.&lt;br /&gt;
* névelfedés&lt;br /&gt;
** az SQL oszlopnév elfedi a változónevet&lt;br /&gt;
** a belső blokkban deklarált változó elfedi a külsőt&lt;br /&gt;
** az elfedett változóra &amp;lt;i&amp;gt;cimkenév.változónév&amp;lt;/i&amp;gt; alakban tudunk hivatkozni&lt;br /&gt;
* változó hatásköre = a kódnak azon része, ahol tudunk rá hivatkozni&lt;br /&gt;
* változó láthatósága = az a blokk, amiben a változót dekaráltuk&lt;br /&gt;
&lt;br /&gt;
===Vezérlési szerkezetek===&lt;br /&gt;
&lt;br /&gt;
Minden vezérlési szerkezetet megelőzhet egy &amp;lt;pre&amp;gt;&amp;amp;lt;&amp;amp;lt;cimkenév&amp;amp;gt;&amp;amp;gt;&amp;lt;/pre&amp;gt; formátumú cimke.&lt;br /&gt;
&lt;br /&gt;
* =NULL=: üres utasítás. A blokkokban mindenképpen szerepelni kell utasításnak. Ha pl. egy tárolt eljárást nem akarunk megírni, &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-t írunk a törzsébe, hogy leforduljon.&lt;br /&gt;
&lt;br /&gt;
* =GOTO cimke=: nem ugorhat bele alblokkba, vagy ki a blokkból. Az =EXCEPTION= részből nem ugorhat vissza a saját blokkjába.&lt;br /&gt;
&lt;br /&gt;
====Elágazások====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;IF feltétel THEN&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;[ELSIF feltétel THEN&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;]&lt;br /&gt;
&amp;lt;br/&amp;gt;[ELSE&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;]&lt;br /&gt;
&amp;lt;br/&amp;gt;END IF;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Searched case (ugyanaz, mint az =IF=) &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CASE&lt;br /&gt;
&amp;lt;br/&amp;gt;WHEN keresési feltétel THEN&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;[ELSE&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;]&lt;br /&gt;
&amp;lt;br/&amp;gt;END CASE;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CASE szelektor&lt;br /&gt;
&amp;lt;br/&amp;gt;WHEN kif THEN&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;[ELSE&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;]&lt;br /&gt;
&amp;lt;br/&amp;gt;END CASE;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Ciklusok====&lt;br /&gt;
&lt;br /&gt;
A ciklusokból az =EXIT;= utasítással lehet kilépni. Feltételes kilépés: =EXIT WHEN feltétel;=.&lt;br /&gt;
&lt;br /&gt;
* végtelen ciklus: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;LOOP&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;END LOOP;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;WHILE feltétel LOOP&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;END LOOP;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;FOR változó IN [REVERSE] alsó..felső LOOP&lt;br /&gt;
&amp;lt;br/&amp;gt;	utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;END LOOP;&amp;lt;/code&amp;gt;A változó helyben van deklarálva, a hatásköre a ciklus belseje, és nem módosítható. A ciklus határai lehetnek változók, de összetett kifejezés már nem.&lt;br /&gt;
&lt;br /&gt;
===Példa===&lt;br /&gt;
&lt;br /&gt;
Az =ember(id, név)= táblából írjuk ki a neveket. Megjegyzés: gányolunk egy kicsit, kurzorokkal sokkal szebben megoldható a feladat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	minid INT;&lt;br /&gt;
	maxid INT;&lt;br /&gt;
	db INT;&lt;br /&gt;
	embernev ember.nev%TYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT min(id), max(id) INTO minid, maxid FROM ember;&lt;br /&gt;
	FOR i IN minid..maxid LOOP&lt;br /&gt;
		SELECT count(*) INTO db FROM ember WHERE id=i;&lt;br /&gt;
		IF db=1 THEN&lt;br /&gt;
			SELECT nev INTO embernev FROM ember WHERE id=i;&lt;br /&gt;
			DBMS_OUTPUT.PUT_LINE(embernev);&lt;br /&gt;
		END IF;&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.02.26.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060328&amp;diff=163833</id>
		<title>AdatbServerProgJegyzet20060328</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060328&amp;diff=163833"/>
		<updated>2013-03-31T19:03:25Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.03.28.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.03.28.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.28.&amp;diff=163832</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.03.28.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.28.&amp;diff=163832"/>
		<updated>2013-03-31T19:03:24Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060328}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060328}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; }&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060324|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.03.28. [[AdatbServerProgJegyzet20060331|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Tárolt alprogramok==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy tárolt eljárást, aminek a segítségével kurzusokat lehet felvenni. Az eljárásnak&lt;br /&gt;
két bemenő paramétere van, a diák azonosító, és a kurzusazonosító. Az eljárás a&lt;br /&gt;
következő esetekben generáljon hibát:&lt;br /&gt;
* ha a kurzus már betelt&lt;br /&gt;
* ha a hallgató már jelentkezett erre a kurzusra&lt;br /&gt;
* ha nem létezik a paraméterként beadott diák vagy kurzus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy tárolt eljárást, aminek a segítségével ki lehet törölni egy hallgatót egy&lt;br /&gt;
kurzusról. Az eljárásnak legyen két bemenő paramétere, a diák azonosító és a törölni&lt;br /&gt;
kívánt kurzusazonosító. Az eljárás akkor dobjon hibát, ha nem létezik a törölni kívánt&lt;br /&gt;
diák vagy kurzus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj függvényt, aminek két bemeneti paramétere van, a pilóta azonosítója és egy&lt;br /&gt;
évszám, visszatérési értéke pedig a pilóta adott évben szerzett pontjainak az összege!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj függvényt, aminek bemenete egy helyezés, visszatérési értéke pedig a helyezéshez&lt;br /&gt;
tartozó pontszám!&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Triggerek==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy triggert, ami az anyag táblába való beszúrás esetén automatikusan generál&lt;br /&gt;
azonosítót, ha a beszúrni kívánt adatok közt nincs megadva az azonosító!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE SEQUENCE anyag_seq START WITH 100 INCREMENT BY 1&lt;br /&gt;
CREATE OR REPLACE TRIGGER anyag_idtr BEFORE INSERT ON anyag FOR EACH ROW&lt;br /&gt;
BEGIN&lt;br /&gt;
	IF :new.anyag_id IS NULL THEN&lt;br /&gt;
		SELECT anyag_seq.NEXTVAL INTO :new.anyag_id FROM DUAL;&lt;br /&gt;
	END IF;&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy triggert, ami csak akkor engedi, hogy egy hallgató felvegyen egy kurzust, ha a&lt;br /&gt;
kurzus még nincs betelve.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts el egy nézetet, aminek segítségével a FELKESZ_ANYAG táblát láthatjuk, de&lt;br /&gt;
az anyag és a félkész nevét láthatjuk, nem pedig a kódját. Ezek után írj egy triggert,&lt;br /&gt;
ami lehetővé teszi, hogy új anyagot adjunk hozzá a félkészhez a nézeten keresztül!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View létrehozása&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE VIEW felkeszanyag AS&lt;br /&gt;
	SELECT felkesz_nev, anyag_nev, fa_mennyiseg&lt;br /&gt;
	FROM felkesz, anyag, felkesz_anyag&lt;br /&gt;
	WHERE felkesz.felkesz_id = felkesz_anyag.fa_felkeszid&lt;br /&gt;
		AND anyag.anyag_id = felkesz_anyag.fa_anyagid&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trigger létrehozása&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE TRIGGER felkesz_anyag_insert&lt;br /&gt;
	INSTEAD OF INSERT ON felkeszanyag FOR EACH ROW&lt;br /&gt;
DECLARE&lt;br /&gt;
	anyagid INT;&lt;br /&gt;
	felkeszid INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT anyag_id INTO anyagid FROM anyag &lt;br /&gt;
		WHERE anyag_nev = :new.anyag_nev;&lt;br /&gt;
	SELECT felkesz_id INTO felkeszid FROM felkesz&lt;br /&gt;
		WHERE felkesz_nev = :new.felkesz_nev;&lt;br /&gt;
	INSERT INTO felkesz_anyag (fa_felkeszid, fa_anyagid, fa_mennyiseg)&lt;br /&gt;
		VALUES (felkeszid, anyagid, :new.fa_mennyiseg);&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tesztelés&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;INSERT INTO felkeszanyag VALUES (&#039;tejszinhab&#039;, &#039;liszt&#039;, 1);&lt;br /&gt;
COMMIT;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Módosítsd a PILOTA_FUTAM táblát úgy, hogy legyen egy oszlop a pilóta&lt;br /&gt;
pontszámának tárolására is (ez származtatott adat, a PILOTA_FUTAM tábla alapján&lt;br /&gt;
számítható). Készíts triggert, ami karbantartja az új oszlop értékét, bármilyen&lt;br /&gt;
módosítást is hajtunk végre a pilóta pontszámát érintő táblában! Próbálj meg olyan&lt;br /&gt;
megoldást találni, ami a lehető legkevesebb mővelettel oldja meg a feladatot!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;ALTER TABLE futam_pilota ADD pontszam INT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE TRIGGER pilota_pontszam&lt;br /&gt;
	BEFORE INSERT OR UPDATE &lt;br /&gt;
	ON futam_pilota FOR EACH ROW&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT decode(:new.helyezes, NULL, 0, 1, 10, 2, 8, 3, 6, 4, 5, 5, 4, 6, 3, 7, 2, 8, 1, 0) &lt;br /&gt;
		INTO :new.pontszam&lt;br /&gt;
		FROM dual;&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts nézetet, ami az alábbi mezőket tartalmazza: évszám, csapat neve, pilóta neve,&lt;br /&gt;
pilóta típusa az adott csapatban az adott évben. Készíts triggert, ami lehetővé teszi új&lt;br /&gt;
pilótát felvenni egy adott csapatba a nézeten keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts triggert, ami biztosítja, hogy egy évben egy pilóta csak egy csapatban&lt;br /&gt;
szerepelhessen, valamint egy csapatban egyszerre csak egy elsőszámú és egy&lt;br /&gt;
másodszámú pilóta lehessen, de akármennyi teszt pilóta.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A cukrász adatbázisban módosítsd a FELKESZ táblát úgy, hogy egy mezőben a&lt;br /&gt;
félkész egységárát is el tudjuk tárolni. Ez egy származtatott adat lesz, annak az&lt;br /&gt;
érdekében, hogy a termék árának a lekérdezése egyszerőbb és gyorsabb legyen. Az új&lt;br /&gt;
oszlop a (felkesz_ar float). Írd meg a triggereket, amik karban tartják ezt a mezőt.&lt;br /&gt;
Triggereket az alábbi eseményekre kell írni:&lt;br /&gt;
* Egy anyag ára megváltozott.&lt;br /&gt;
* Új anyag kerül a félkész anyaglistájába.&lt;br /&gt;
* Egy anyagot törölnek a félkész anyaglistájából.&lt;br /&gt;
* Megváltozik a mennyisége a félkész által tartalmazott anyagnak (FELKESZ_ANYAG táblában).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;ALTER TABLE felkesz ADD felkesz_ar FLOAT&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A cukrászat adatbázist egészítsd ki az alábbi rendelés táblával!&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE TABLE rendeles&lt;br /&gt;
(&lt;br /&gt;
	rendeles_id INT CONSTRAINT rendeles_primary_key PRIMARY KEY,&lt;br /&gt;
	rendeles_datum date NOT NULL,&lt;br /&gt;
	rendeles_anyagid int NOT NULL,&lt;br /&gt;
	rendeles_mennyiseg float NOT NULL,&lt;br /&gt;
	rendeles_rendezve date&lt;br /&gt;
)&amp;lt;/code&amp;gt;&lt;br /&gt;
Írj triggert, ami felad egy újabb rendelést, ha valamely anyag mennyisége a minimális&lt;br /&gt;
érték alá csökken. A rendelés mennyisége legyen annyi, hogy utána a maximális&lt;br /&gt;
mennyiség legyen a raktárban.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.28.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060331&amp;diff=163831</id>
		<title>AdatbServerProgJegyzet20060331</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060331&amp;diff=163831"/>
		<updated>2013-03-31T19:03:23Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.03.31.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.03.31.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.31.&amp;diff=163830</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.03.31.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.31.&amp;diff=163830"/>
		<updated>2013-03-31T19:03:21Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060331}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060331}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060328|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.03.31. [[AdatbServerProgJegyzet20060404|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Csomagok==&lt;br /&gt;
&lt;br /&gt;
A csomag egy olyan séma objektum, ami logikailag összetartozó elemeket tartalmaz. Részei:&lt;br /&gt;
* Típusok&lt;br /&gt;
* Alprogramok&lt;br /&gt;
* Kivételek&lt;br /&gt;
&lt;br /&gt;
A csomagok 2 részből állnak:&lt;br /&gt;
* nyilvános specifikáció (interfész)&lt;br /&gt;
* privát törzs (implementáció)&lt;br /&gt;
&lt;br /&gt;
===Csomagok célja===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt; logikailag összetartozó függvények egységbe zárása&lt;br /&gt;
	&amp;lt;li&amp;gt; olyan eljárás létrehozása, aminek a kimenő paramétere eredményhalmaz&lt;br /&gt;
* SQL Serverben van lehetőség eljáráson belül több sort visszaadó &amp;lt;pre&amp;gt;SELECT&amp;lt;/pre&amp;gt;-ek hívására. Az eredményt a kliens olvassa ki.&lt;br /&gt;
* Oracle-ben az eredményt kötelező változóban elhelyezni (&amp;lt;pre&amp;gt;SELECT ... INTO&amp;lt;/pre&amp;gt;). Több soros kimenetet csak kurzor változóval lehet kezelni, amit vagy lokálisan, vagy csomagon belül kell deklarálni. A Java támogatja a kurzor típust, a Visual Studioban csak külön plugin telepítése után lehet kiolvasni a kurzorváltozó tartalmát.&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Csomagok előnyei===&lt;br /&gt;
* modularitás&lt;br /&gt;
* egyszerű programfejlesztés: a specifikáció fordítható a törzs nélkül is&lt;br /&gt;
* információ elrejtés&lt;br /&gt;
* bővített funkcionalitás: a változók és a kurzorok a session végéig élnek, az alprogramok megosztva használhatják őket&lt;br /&gt;
* teljesítmény: lehetőség van tranzakciók között infót átadni táblák használata nélkül (1 sessionben)&lt;br /&gt;
&lt;br /&gt;
===Felhasználó által definiált csomagok===&lt;br /&gt;
&lt;br /&gt;
Vizsgán az Oracle rész egyik feladata biztosan csomagkezelésről fog szólni.&lt;br /&gt;
&lt;br /&gt;
====Szintaxis====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Csomag fejléc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE [OR REPLACE] PACKAGE csomagnév&lt;br /&gt;
	[AUTHID {CURRENT_USER|DEFINER}]&lt;br /&gt;
{IS|AS}&lt;br /&gt;
	kollekció típusok&lt;br /&gt;
	altípusok&lt;br /&gt;
	konstansok&lt;br /&gt;
	kivételek&lt;br /&gt;
	objektumok&lt;br /&gt;
	kurzor deklarációk&lt;br /&gt;
	függvény deklarációk&lt;br /&gt;
	eljárás deklarációk&lt;br /&gt;
END [csomagnév];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Az =AUTHID= azt határozza meg, hogy a csomag alprogramjai kinek a nevében fussanak.&lt;br /&gt;
* A deklarációs részben utoljára kell felsorolni a függvényeket és az eljárásokat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Csomag törzs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE [OR REPLACE] PACKAGE BODY csomagnév&lt;br /&gt;
	...&lt;br /&gt;
	lokális változók&lt;br /&gt;
	kurzor törzsek&lt;br /&gt;
	függvény törzsek&lt;br /&gt;
	eljárás törzsek&lt;br /&gt;
[BEGIN&lt;br /&gt;
	utasítások;]&lt;br /&gt;
END [csomagnév];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* A csomag törzsében az alprogramok deklarációjának karakterről karakterre meg kell egyeznie a csomag fejlécében található deklarációval.&lt;br /&gt;
* A =BEGIN= és =END= közötti szakasz az első függvényhívás előtt fut le.&lt;br /&gt;
&lt;br /&gt;
====Példa: jogosultságkezelés a tanár-diák adatbázisban====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;ALTER TABLE student ADD stud_pwd VARCHAR2(20);&lt;br /&gt;
UPDATE student SET stud_pwd=&#039;jelszo&#039; WHERE stud_id=&#039;XSFXCF&#039;;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
CREATE PACKAGE userlogin IS&lt;br /&gt;
	hibasjelszo EXCEPTION;&lt;br /&gt;
	nincsbelepve EXCEPTION;&lt;br /&gt;
	PROCEDURE login(id CHAR, passwd VARCHAR2);&lt;br /&gt;
	PROCEDURE logout;&lt;br /&gt;
	FUNCTION is_logged_in(hibatdob BOOLEAN) RETURN BOOLEAN;&lt;br /&gt;
END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
CREATE PACKAGE BODY userlogin IS&lt;br /&gt;
	loggedin BOOLEAN;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	PROCEDURE login(id CHAR, passwd VARCHAR2) IS&lt;br /&gt;
		jelszo VARCHAR2(20);&lt;br /&gt;
	BEGIN&lt;br /&gt;
		SELECT stud_pwd INTO jelszo FROM student WHERE stud_id=id;&lt;br /&gt;
		IF passwd!=jelszo THEN&lt;br /&gt;
			RAISE hibasjelszo;&lt;br /&gt;
		ELSE&lt;br /&gt;
			loggedin:=TRUE;&lt;br /&gt;
		END IF;&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
		WHEN NO_DATA_FOUND THEN&lt;br /&gt;
			loggedin:=FALSE;&lt;br /&gt;
			RAISE hibasjelszo;&lt;br /&gt;
	END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	PROCEDURE logout IS&lt;br /&gt;
	BEGIN&lt;br /&gt;
		loggedin:=FALSE;&lt;br /&gt;
	END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
	FUNCTION is_logged_in(dobhibat BOOLEAN)&lt;br /&gt;
		RETURN boolean IS&lt;br /&gt;
	BEGIN&lt;br /&gt;
		IF dobhibat AND loggedin=FALSE THEN&lt;br /&gt;
			RAISE nincsbelepve;&lt;br /&gt;
		END;&lt;br /&gt;
		RETURN loggedin;&lt;br /&gt;
	END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
BEGIN&lt;br /&gt;
	loggedin:=FALSE;&lt;br /&gt;
END userlogin;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Példa a userlogin csomag használata====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE PROCEDURE getcourses(diakid CHAR, szemeszter CHAR)&lt;br /&gt;
IS&lt;br /&gt;
	belepve BOOLEAN;&lt;br /&gt;
	CURSOR c IS SELECT sub_id, sub_name &lt;br /&gt;
		FROM subject, course, sutdent_course&lt;br /&gt;
		WHERE sc_studentid = diakid&lt;br /&gt;
			AND sc_courseid = cou_id&lt;br /&gt;
			AND cou_semestername = szemeszter&lt;br /&gt;
			AND cou_subjectid = sub_id;&lt;br /&gt;
BEGIN&lt;br /&gt;
	belepve:=userlogin.is_logged_in(true);&lt;br /&gt;
	FOR crec IN c LOOP&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(crec.sub_id ||| &#039; &#039; || crec.sub_name);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN userlogin.nincsbelepve&lt;br /&gt;
		RAISE_APPLICATION_ERROR(-20101, &#039;nincs belépve&#039;);&lt;br /&gt;
END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
DECLARE&lt;br /&gt;
	code VARCHAR2(20);&lt;br /&gt;
	message VARCHAR2(200);&lt;br /&gt;
BEGIN&lt;br /&gt;
	getcourses(&#039;XSFXCF&#039;, &#039;20012&#039;);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN OTHERS THEN&lt;br /&gt;
		code:=SQLCODE;&lt;br /&gt;
		message:=SQLERRM;&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(code ||| &#039; &#039; || message);&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
		userlogin.login(&#039;XSFXCF&#039;, &#039;jelszo&#039;);&lt;br /&gt;
		getcourses(&#039;XSFXCF&#039;, &#039;20012&#039;);&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
		userlogin.logout;&lt;br /&gt;
		getcourses(&#039;XSFXCF&#039;, &#039;20012&#039;);&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Példa kurzor típusú kimenetre====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE PACKAGE tanar_csomag IS&lt;br /&gt;
	TYPE tanarlista_type IS REF CURSOR;&lt;br /&gt;
	PROCEDURE tanar_lista(tanszekkod CHAR, tanarlista OUT tanarlista_type);&lt;br /&gt;
END;&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
CREATE PACKAGE BODY tanar_csomag IS&lt;br /&gt;
	PROCEDURE tanar_lista(tanszekkod CHAR, tanarlista OUT tanarlista_type) IS&lt;br /&gt;
	BEGIN&lt;br /&gt;
		OPEN tanarlista FOR &lt;br /&gt;
			SELECT tea_grade ||| &#039; &#039; |||| tea_lname |||| &#039; &#039; || tea_fname, tea_id, status_id&lt;br /&gt;
				FROM teacher, sort_status&lt;br /&gt;
				WHERE tea_status=status_id AND tea_dept=tanszekkod&lt;br /&gt;
				ORDER BY status_id;&lt;br /&gt;
	END;&lt;br /&gt;
END tanar_csomag;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Használat:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	tanlist tanar_csomag.tanar_lista(&#039;AUT&#039;, tanlist);&lt;br /&gt;
	LOOP&lt;br /&gt;
		FETCH tanlist INTO nev, kod, statusz;&lt;br /&gt;
		EXIT WHEN tanlista%NOTFOUND;&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(...);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Beépített csomagok===&lt;br /&gt;
&lt;br /&gt;
Vizsgakérdés lehet, hogy soroljunk fel hármat.&lt;br /&gt;
&lt;br /&gt;
* =DBMS_OUTPUT=: standard output&lt;br /&gt;
* =STANDARD=: kivételek, sysdate, sum, ...&lt;br /&gt;
* =DBMS_LOB=: large objectek kezelése&lt;br /&gt;
* =DBMS_PIPE=: sessionök közti kommunikáció&lt;br /&gt;
* =UTL_FILE=: filekezelés&lt;br /&gt;
* =DBMS_LOCK=: &lt;br /&gt;
* =DBMS_RANDOM=: véletlenszám generálás&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.04.02.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060321&amp;diff=163829</id>
		<title>AdatbServerProgJegyzet20060321</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060321&amp;diff=163829"/>
		<updated>2013-03-31T19:03:20Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.03.21.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.03.21.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.21.&amp;diff=163828</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.03.21.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.21.&amp;diff=163828"/>
		<updated>2013-03-31T19:03:19Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060321}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt; pre { margin-top: 2px; margin-bottom: 2px; } li …”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060321}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; pre { margin-top: 2px; margin-bottom: 2px; } li { line-height: 18px; } &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060317|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.03.21. [[AdatbServerProgJegyzet20060324|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts egy tárolt eljárást, aminek bemeneti paramétere egy pilóta neve, két kimeneti paramétere pedig a pilóta magassága és súlya! Az eljárást próbáld ki SQL Windowból, a kimeneti paramétereket a DBMS_OUTPUT.PUT_LINE metódussal írasd ki a&lt;br /&gt;
kimenetre!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Program Window:&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE pilotaparams(pnev IN VARCHAR2, magassag OUT INT, suly OUT INT) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT pilota.magassag, pilota.suly INTO magassag, suly&lt;br /&gt;
  FROM pilota&lt;br /&gt;
  WHERE pilota.nev = pnev;&lt;br /&gt;
END pilotaparams;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;SQL Window:&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
  magassag INT;&lt;br /&gt;
  suly INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
  pilotaparams(&#039;Cristijan Albers&#039;, magassag, suly);&lt;br /&gt;
  DBMS_OUTPUT.PUT_LINE(&#039;Magassag: &#039; || magassag || &#039;  Suly: &#039; || suly);&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Próbáld ki az előző feladatban megoldott eljárás hívását a Test Window-ból! A Test Window egy olyan környezet, ahol lehetőség van környezeti változókat használni a&lt;br /&gt;
blokkon belül. Ha környezeti változóban adjuk meg a bemeneti és a két kimeneti&lt;br /&gt;
paramétert, akkor az eredményt az ablak alsó felében láthatjuk, nem kell nekünk extra&lt;br /&gt;
kiíratni a kimenetre. A környezeti változók deklarálása is a Test Window alsó&lt;br /&gt;
ablakában lehetséges, ahol meg kell adni a változó nevét és típusát, ha bemeneti&lt;br /&gt;
paraméter, akkor az értékét is. A változóra a blokkon belül a kettőspont változónévvel lehet hivatkozni. (Pl. a változó neve legyen pilotanev, akkor a blokkon belül =:pilotanev= kifejezéssel hivatkozunk rá.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;BEGIN&lt;br /&gt;
  pilotaparams(:pilotanev, magassag, suly);&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test Window alján:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Variable&#039;&#039;&#039; || &#039;&#039;&#039;Type&#039;&#039;&#039; || &#039;&#039;&#039;Value&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| pilotanev || String || Cristijan Albers &lt;br /&gt;
|-&lt;br /&gt;
| magassag || Integer || &lt;br /&gt;
|-&lt;br /&gt;
| suly || Integer || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
F8-ra kitölti a hiányzó értékeket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Egészítsd ki az előző feladatot hibakezeléssel is. Amennyiben nem létezik a&lt;br /&gt;
bemenetként megadott pilóta, akkor a kimeneti értékek -1 legyenek!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE pilotaparams(pnev IN VARCHAR2, magassag OUT INT, suly OUT INT) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT pilota.magassag, pilota.suly INTO magassag, suly&lt;br /&gt;
  FROM pilota&lt;br /&gt;
  WHERE pilota.nev = pnev;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
  WHEN NO_DATA_FOUND THEN&lt;br /&gt;
	 magassag := -1;&lt;br /&gt;
	 suly := -1;&lt;br /&gt;
END pilotaparams;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts egy tárolt eljárást, aminek bemeneti paramétere egy csapat neve és egy&lt;br /&gt;
évszám! Az eljárás listázza ki a kimenetre az adott csapat adott évben szerződtetett&lt;br /&gt;
pilótáit!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE csapat_szezon_pilotak(csnev IN VARCHAR2, szev IN int) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
	FOR rec IN (&lt;br /&gt;
		SELECT pilota.nev&lt;br /&gt;
		FROM csapat, csapat_pilota, csapat_szezon, pilota&lt;br /&gt;
		WHERE csapat.csapatid = csapat_szezon.csapatid&lt;br /&gt;
			AND csapat_szezon.csapatszezonid = csapat_pilota.csapatszezonid&lt;br /&gt;
			AND pilota.pilotaid = csapat_pilota.pilotaid&lt;br /&gt;
			AND csapat.nev = csnev&lt;br /&gt;
			AND csapat_szezon.ev = szev&lt;br /&gt;
	) LOOP&lt;br /&gt;
	  DBMS_OUTPUT.PUT_LINE(rec.nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END csapat_szezon_pilotak;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy olyan eljárást, aminek az egyetlen bemenő paramétere az évszám, és az adott szezonban létező csapatok pilótáit listázza ki a kimenetre szépen formázva (a csapat nevek alatt bentebb vannak felsorolva a pilóták nevei)!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE szezon_pilotak(szev IN int) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
	FOR rec IN (&lt;br /&gt;
		SELECT csapat.csapatid, csapat.nev&lt;br /&gt;
		FROM csapat, csapat_szezon&lt;br /&gt;
		WHERE csapat.csapatid = csapat_szezon.csapatid&lt;br /&gt;
			AND csapat_szezon.ev = szev&lt;br /&gt;
	) LOOP&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(rec.nev);&lt;br /&gt;
		FOR rec2 IN (&lt;br /&gt;
			SELECT pilota.nev&lt;br /&gt;
			FROM csapat_pilota, csapat_szezon, pilota&lt;br /&gt;
			WHERE csapat_szezon.csapatszezonid = csapat_pilota.csapatszezonid&lt;br /&gt;
				AND pilota.pilotaid = csapat_pilota.pilotaid&lt;br /&gt;
				AND rec.csapatid = csapat_szezon.csapatid&lt;br /&gt;
				AND csapat_szezon.ev = szev&lt;br /&gt;
		) LOOP&lt;br /&gt;
			DBMS_OUTPUT.PUT_LINE(&#039;	&#039; || rec2.nev);&lt;br /&gt;
		END LOOP;&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END szezon_pilotak;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy tárolt eljárást, aminek segítségével egy csapatot és egy pilótát tudunk egy szezonban összerendelni. Az eljárás bemenő paramétere a csapat neve, a pilóta neve, a szezon évszáma és a pilóta típusa legyen. Használd a hibakezelési lehetőségeket az alábbi szituációkra, és mindegyikről külön küldj hibaüzenetet:&lt;br /&gt;
&lt;br /&gt;
* Nem létezik az adott nevő csapat vagy az adott évben nem indult.&lt;br /&gt;
* Nem létezik az adott pilóta.&lt;br /&gt;
* Nincs ilyen szezon definiálva az adatbázisban.&lt;br /&gt;
* Már tagja az adott pilóta az adott csapatnak az adott évben.&lt;br /&gt;
* Ha a pilóta típusa 1 vagy 2 és ilyen már létezik, akkor vegye fel másik számúnak, ha az még nem foglalt, vagy ha már mindkét pozíció foglalt, akkor teszt pilótának, és küldjön erről üzenetet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE szezon_pilotak(&lt;br /&gt;
	csapatnev VARCHAR2;&lt;br /&gt;
	pilotanev VARCHAR2;&lt;br /&gt;
	szezonev INT;&lt;br /&gt;
	pilotatipus CHAR;&lt;br /&gt;
) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- to be continued...&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj függvényt, ami a bemeneteként kapott FLOAT típusú számot szöveges&lt;br /&gt;
formátummá konvertálja a következők szerint:&lt;br /&gt;
óra:perc:másodperc.ezredmásodperc!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj lekérdezést, ami az előző feladatban megírt függvény segítségével kilistázza a 2005-ös Ausztrál Nagydíj eredményét (pilóta név, helyezés, idő)!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj lekérdezést, ami az előző feladatban megírt lekérdezést egészíti ki olyan módon, hogy egy újabb oszlopban az adott időeredmény és az első helyezett eredményének a különbsége is megjelenik! Az eredményedet ellenőrizd le a http://www.formula1.com oldalon található táblázattal! Az eredmény így nézzen ki:&lt;br /&gt;
&lt;br /&gt;
TODO: táblázat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy függvényt, ami a tanév szemesztereinek következőképpen megadott kódját&lt;br /&gt;
szöveges, emberek számára egyértelmően értelmezhetővé konvertálja! A&lt;br /&gt;
szemeszterkód egy ötjegyő szám, aminek első négy jegye az évet jelenti, míg az&lt;br /&gt;
ötödik számjegye az év félévét jelenti. Például a 2002 év őszi félévét a 20022 jelöli,&lt;br /&gt;
míg a 2003 tavaszi félévet a 20031 kód jelöli. Megjelenítéskor az első esetben&lt;br /&gt;
&amp;amp;#8222;2002/2003 I. félév&amp;amp;#8221; a második esetben pedig &amp;amp;#8222;2002/2003 II. félév&amp;amp;#8221; szöveget&lt;br /&gt;
szeretnénk látni. A megírt függvényt próbáld ki néhány minta bemenettel!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Az előző feladatban megírt függvény segítségével listázd ki a tanár-diák adatbázis =SEMESTER= tábla adatait!&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.21.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060307&amp;diff=163827</id>
		<title>AdatbServerProgJegyzet20060307</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060307&amp;diff=163827"/>
		<updated>2013-03-31T19:03:17Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.03.07.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.03.07.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.07.&amp;diff=163826</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.03.07.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.03.07.&amp;diff=163826"/>
		<updated>2013-03-31T19:03:14Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060307}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;br/&amp;gt; &amp;amp;lt;&amp;amp;lt; Labor,…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060307}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060303|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.03.07. [[AdatbServerProgJegyzet20060310|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Futtasd le a minta adatbázisok menüpont alatt található scripteket, amik létrehozzák a CUKRÁSZ adatbázis tábláit, és feltöltik egységes minta adatokkal!&lt;br /&gt;
&lt;br /&gt;
* File / New / Command Window&lt;br /&gt;
* A [https://avalon.aut.bme.hu/~reni/aszp/script.html]-ről letölthető 2 SQL scriptet lefuttatni.&lt;br /&gt;
* All objects helyett csak a My objects-et mutassa. &lt;br /&gt;
* Tables / Refresh&lt;br /&gt;
* Cukrász adatbázis séma grafikusan: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/cukrasz_sema.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki, megnevezés szerint fordított ABC sorrendben, hogy milyen félkész&lt;br /&gt;
termékek vannak (minden adatot)!&lt;br /&gt;
&lt;br /&gt;
* File / New / SQL Window&lt;br /&gt;
* =SELECT * FROM felkesz ORDER BY felkesz_nev DESC;=&lt;br /&gt;
* Ha a találatok nem férnek ki az ablakba, csak az első néhányat jeleníti meg. A többi a dupla zöld lefele nyíllal kérhető le.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki, hogy a gyümölcstorta alap milyen alapanyagokból áll, és melyikből mennyi kell! (név, mennyiség, egység)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT anyag_nev AS nev, &lt;br /&gt;
		 fa_mennyiseg || &#039; &#039; || egyseg_nev AS mennyiseg&lt;br /&gt;
FROM felkesz, felkesz_anyag, anyag, egyseg&lt;br /&gt;
WHERE felkesz.felkesz_id = felkesz_anyag.fa_felkeszid&lt;br /&gt;
		AND anyag.anyag_id = felkesz_anyag.fa_anyagid&lt;br /&gt;
		AND anyag.anyag_egyseg = egyseg.egyseg_id&lt;br /&gt;
		AND felkesz.felkesz_nev = &#039;gyumolcstorta alap&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki azokat a termékeket, amihez kell vaníliáscukor!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT termek_nev&lt;br /&gt;
FROM termek, termek_anyag, anyag&lt;br /&gt;
WHERE termek.termek_id = termek_anyag.ta_termekid&lt;br /&gt;
		AND anyag.anyag_id = termek_anyag.ta_anyagid&lt;br /&gt;
		AND anyag_nev = &#039;vaniliascukor&#039;&lt;br /&gt;
UNION&lt;br /&gt;
SELECT termek_nev&lt;br /&gt;
FROM termek, termek_felkesz, felkesz, felkesz_anyag, anyag&lt;br /&gt;
WHERE termek.termek_id = termek_felkesz.tf_termekid&lt;br /&gt;
		AND felkesz.felkesz_id = termek_felkesz.tf_felkeszid&lt;br /&gt;
		AND felkesz.felkesz_id = felkesz_anyag.fa_felkeszid&lt;br /&gt;
		AND anyag.anyag_id = felkesz_anyag.fa_anyagid&lt;br /&gt;
		AND anyag_nev = &#039;vaniliascukor&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki azokat a termékeket, amikhez nem kell vaníliáscukor!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT termek_nev FROM termek&lt;br /&gt;
MINUS&lt;br /&gt;
(SELECT termek_nev&lt;br /&gt;
FROM termek, termek_anyag, anyag&lt;br /&gt;
WHERE termek.termek_id = termek_anyag.ta_termekid&lt;br /&gt;
		AND anyag.anyag_id = termek_anyag.ta_anyagid&lt;br /&gt;
		AND anyag_nev = &#039;vaniliascukor&#039;&lt;br /&gt;
UNION&lt;br /&gt;
SELECT termek_nev&lt;br /&gt;
FROM termek, termek_felkesz, felkesz, felkesz_anyag, anyag&lt;br /&gt;
WHERE termek.termek_id = termek_felkesz.tf_termekid&lt;br /&gt;
		AND felkesz.felkesz_id = termek_felkesz.tf_felkeszid&lt;br /&gt;
		AND felkesz.felkesz_id = felkesz_anyag.fa_felkeszid&lt;br /&gt;
		AND anyag.anyag_id = felkesz_anyag.fa_anyagid&lt;br /&gt;
		AND anyag_nev = &#039;vaniliascukor&#039;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki a legolcsóbb anyagot!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT anyag_nev FROM anyag &lt;br /&gt;
WHERE anyag_egysegar = (SELECT MIN(anyag_egysegar) FROM anyag)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki, az alapanyag neve szerint sorrendben, hogy a gyümölcstorta milyen&lt;br /&gt;
alapanyagokból készül (név, mennyiség)!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT anyag_nev&lt;br /&gt;
FROM termek, termek_anyag, anyag&lt;br /&gt;
WHERE termek.termek_id = termek_anyag.ta_termekid&lt;br /&gt;
		AND anyag.anyag_id = termek_anyag.ta_anyagid&lt;br /&gt;
		AND termek.termek_nev = &#039;Gyumolcstorta&#039;&lt;br /&gt;
UNION&lt;br /&gt;
SELECT anyag_nev&lt;br /&gt;
FROM termek, termek_felkesz, felkesz, felkesz_anyag, anyag&lt;br /&gt;
WHERE termek.termek_id = termek_felkesz.tf_termekid&lt;br /&gt;
		AND felkesz.felkesz_id = termek_felkesz.tf_felkeszid&lt;br /&gt;
		AND felkesz.felkesz_id = felkesz_anyag.fa_felkeszid&lt;br /&gt;
		AND anyag.anyag_id = felkesz_anyag.fa_anyagid&lt;br /&gt;
		AND termek.termek_nev = &#039;Gyumolcstorta&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Számold ki, hogy egy gyümölcstorta alap mennyibe kerül!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT SUM(fa_mennyiseg*anyag_egysegar/felkesz_mennyiseg) AS ar&lt;br /&gt;
FROM felkesz, felkesz_anyag, anyag&lt;br /&gt;
WHERE felkesz.felkesz_id = felkesz_anyag.fa_felkeszid&lt;br /&gt;
		AND anyag.anyag_id = felkesz_anyag.fa_anyagid&lt;br /&gt;
		AND felkesz.felkesz_nev = &#039;gyumolcstorta alap&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Számold ki, hogy az egyes félkész termékek hány forintba kerülnek!&lt;br /&gt;
&amp;lt;li&amp;gt; Listázd ki, hogy mely félkész termékek olcsóbbak 150 Ft-nál!&lt;br /&gt;
&amp;lt;li&amp;gt; Számold ki, hogy egy gyümölcstorta mennyibe kerül!&lt;br /&gt;
&amp;lt;li&amp;gt; Számold ki, hogy az egyes termékek hány forintba kerülnek!&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.07.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060221&amp;diff=163825</id>
		<title>AdatbServerProgJegyzet20060221</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060221&amp;diff=163825"/>
		<updated>2013-03-31T19:03:09Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Labor, 2006.02.21.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Labor,_2006.02.21.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.02.21.&amp;diff=163824</id>
		<title>Adatbázisok szerver oldali programozása Labor, 2006.02.21.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_Labor,_2006.02.21.&amp;diff=163824"/>
		<updated>2013-03-31T19:03:07Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060221}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt; ol li { line-height: 18px; } &amp;lt;/style&amp;gt;  &amp;lt;br/&amp;gt; [[A…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060221}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; ol li { line-height: 18px; } &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060217|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.02.21. [[AdatbServerProgJegyzet20060224|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Labor honlapja: https://avalon.aut.bme.hu/~reni/aszp&lt;br /&gt;
&amp;lt;!-- student / aszp0405 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Oracle kliens: PL/SQL Developer &lt;br /&gt;
&amp;lt;br/&amp;gt; Jelszó az adatbázishoz: https://avalon.aut.bme.hu/~reni/aszp/jelentkezes/aszp/userkod.php &lt;br /&gt;
&amp;lt;br/&amp;gt; A felhasználónév és a jelszó egyaránt az ott kapott kód.&lt;br /&gt;
* Minta adatbázis (Cukrász illetve Tanár-diák): https://avalon.aut.bme.hu/~reni/aszp/script.html &lt;br /&gt;
&amp;lt;br/&amp;gt; A script a File/New/Command Window-ból futtatható.&lt;br /&gt;
* A nézetet érdemes átállítani úgy, hogy az All objects helyett csak a My objects-et mutassa.&lt;br /&gt;
* A script futtatása után frissíteni kell a fa táblákat felsoroló ágát.&lt;br /&gt;
* SQL lekérdezést az SQL Window-ban kell írni, komment: =--= vagy =/* */=. Itt nem kell pontosvesszőzni, és egyszerre csak 1 utasítást fogad el.&lt;br /&gt;
* Alprogramok&lt;br /&gt;
** Tárolt eljárást a Program Windowban érdemes írni, mert fordításkor itt kijelzi a hibákat, míg a Command Windowban nem. Fordítás: F8.&lt;br /&gt;
** Az eljáráshívást SQL Window-ban =BEGIN= és =END;= közé kell ágyazni, Command Windowban pedig &amp;lt;pre&amp;gt;EXEC&amp;lt;/pre&amp;gt;-et kell eléírni&lt;br /&gt;
** Ha a Command Windowból futtatjuk az eljárást, alapból nem jelenik meg az output, előbb be kell írni egy =SET SERVEROUTPUT ON;= sort.&lt;br /&gt;
* Labor feladat: https://avalon.aut.bme.hu/~reni/aszp/gyakorlat.html&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.07.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060317&amp;diff=163823</id>
		<title>AdatbServerProgJegyzet20060317</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060317&amp;diff=163823"/>
		<updated>2013-03-31T19:03:06Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.03.17.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.03.17.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.17.&amp;diff=163822</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.03.17.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.17.&amp;diff=163822"/>
		<updated>2013-03-31T19:03:04Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060317}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060317}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060314|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.03.17. [[AdatbServerProgJegyzet20060321|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Kivételek kezelése==&lt;br /&gt;
&lt;br /&gt;
===Kivétel típusok===&lt;br /&gt;
&lt;br /&gt;
* Rendszer kivételek&lt;br /&gt;
** Névvel ellátott kivételek (név, sorszám, üzenet)&lt;br /&gt;
** Név nélküli kivételek (sorszám, üzenet)&lt;br /&gt;
* Felhasználói kivételek&lt;br /&gt;
* Alkalmazás hibák&lt;br /&gt;
&lt;br /&gt;
====Névvel ellátott kivételek====&lt;br /&gt;
&lt;br /&gt;
* Kivétel lekezelése: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE ...&lt;br /&gt;
&amp;lt;br/&amp;gt;BEGIN ...&lt;br /&gt;
&amp;lt;br/&amp;gt;EXCEPTION&lt;br /&gt;
&amp;lt;br/&amp;gt;	WHEN kivételnév [OR kivételnév2 [...]] THEN utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;	WHEN OTHERS THEN utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;END;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Az =OTHERS= blokknak a =EXCEPTION= blokk végére kell kerülnie.&lt;br /&gt;
* Gyakori, névvel ellátott kivételek:&lt;br /&gt;
** =NO_DATA_FOUND=&lt;br /&gt;
** =TOO_MANY_ROWS=&lt;br /&gt;
** =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&lt;br /&gt;
** =VALUE_ERROR=: pl. =NULL= értéket akarunk beszúrni =NOT NULL= oszlopba&lt;br /&gt;
** =ZERO_DIVIDE=&lt;br /&gt;
** =CURSOR_ALREADY_OPEN=: kétszer nyitunk meg egy kurzort&lt;br /&gt;
** =INVALID_CURSOR=&lt;br /&gt;
** =CASE_NOT_FOUND=: a =CASE= utasítás szelektora egyik ágra sem illeszkedik&lt;br /&gt;
* A nevek a =STANDARD= csomagban vannak összegyűjtve. Nem kell deklarálni őket.&lt;br /&gt;
* Kivétel generálása: =RAISE NO_DATA_FOUND;=&lt;br /&gt;
&lt;br /&gt;
====Név nélküli rendszer kivételek====&lt;br /&gt;
* A =WHEN OTHERS= blokkban egyszerre elkaphatók&lt;br /&gt;
* Elnevezhetők a =PRAGMA= utasítás segítségével: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE kivételnév EXCEPTION;&lt;br /&gt;
&amp;lt;br/&amp;gt;PRAGMA EXCEPTION_INIT(kivételnév, szám);&amp;lt;/code&amp;gt;&lt;br /&gt;
* 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 ...=&lt;br /&gt;
* Kivétel generálása: =RAISE kivételnév;=&lt;br /&gt;
&lt;br /&gt;
====Felhasználói kivételek====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Szintaktika:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE &lt;br /&gt;
	kivételnév EXCEPTION;&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
	RAISE kivételnév;&lt;br /&gt;
	...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN kivételnév THEN ...&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Alkalmazás hibák====&lt;br /&gt;
* Hiba kiváltása: =RAISE_APPLICATION_ERROR(hibakód, üzenet[, {FALSE|TRUE}])=&lt;br /&gt;
** hibakód: -20999 és -20000 közötti szám&lt;br /&gt;
** üzenet: =VARCHAR(2048)=&lt;br /&gt;
** 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=&lt;br /&gt;
&lt;br /&gt;
===Kivételek terjedése===&lt;br /&gt;
* A =DECLARE= és =BEGIN= között keletkezett hibát csak kívül lehet elkapni.&lt;br /&gt;
* Ugyanez igaz az =EXCEPTION= és az =END= között keletkezett kivételre is.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
===Hibakód és hibaüzenet===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt; Az =SQLCODE= illetve az =SQLERRM= függvényekkel kérdezhető le.&lt;br /&gt;
	&amp;lt;li&amp;gt; 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.&lt;br /&gt;
	&amp;lt;li&amp;gt; Példa a hibák naplózására:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	hibakod INT;&lt;br /&gt;
	uzenet VARCHAR2(512);&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN OTHERS THEN&lt;br /&gt;
		szam := SQLCODE;&lt;br /&gt;
		uzenet := SQLERRM;&lt;br /&gt;
		INSERT INTO naplo VALUES (szam, uzenet, sysdate);&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Hibakódok====&lt;br /&gt;
* Belső kivétel: &amp;lt;0&lt;br /&gt;
* =NO_DATA_FOUND=: 100&lt;br /&gt;
* Felhasználói kivétel: 1&lt;br /&gt;
* Nincs hiba: 0&lt;br /&gt;
&lt;br /&gt;
====Hibaüzenetek====&lt;br /&gt;
* A rendszerüzenetek =VARCHAR2(512)= típusúak&lt;br /&gt;
* Felhasználói kivétel esetén a =&#039;User Defined Exception&#039;= üzenetet kapjuk&lt;br /&gt;
* Siker esetén =&#039;ORA-0000&#039;= az üzenet&lt;br /&gt;
&lt;br /&gt;
==Alprogramok==&lt;br /&gt;
&lt;br /&gt;
===Alprogramok típusai, terminológia===&lt;br /&gt;
&lt;br /&gt;
* Lehetnek eljárások vagy függvények&lt;br /&gt;
* Lehetnek tároltak vagy lokálisak&lt;br /&gt;
* Részei: deklaráció, kód, kivételkezelés&lt;br /&gt;
* _Formális paraméter_: a paraméter neve&lt;br /&gt;
* _Aktuális paraméter_: a paraméter értéke&lt;br /&gt;
&lt;br /&gt;
===Eljárások és függvények===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt; Eljárás deklarációja:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;[CREATE [OR REPLACE]] PROCEDURE eljárásnév [(paraméterek)]&lt;br /&gt;
	[AUTHID {DEFINER|CURRENT_USER}]&lt;br /&gt;
{IS|AS}&lt;br /&gt;
	lokális deklaráció&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	...&lt;br /&gt;
END [eljárásnév];&amp;lt;/code&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt; Függvény deklarációja:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;[CREATE [OR REPLACE]] FUNCTION függvénynév [(paraméterek)]&lt;br /&gt;
	RETURN típus&lt;br /&gt;
	[AUTHID {DEFINER|CURRENT_USER}]&lt;br /&gt;
{IS|AS}&lt;br /&gt;
	lokális deklaráció&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
	RETURN érték;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	...&lt;br /&gt;
END [függvénynév];&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Paraméter deklaráció: &lt;br /&gt;
&amp;lt;br/&amp;gt; =név [IN|OUT [NOCOPY]||IN OUT [NOCOPY]] típus [{:=DEFAULT} kifejezés]=&lt;br /&gt;
&amp;lt;/ul&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Paraméter módok====&lt;br /&gt;
&lt;br /&gt;
* A típus nem tartalmazhat megkötést, mint pl. =VARCHAR2(50)=&lt;br /&gt;
* =IN=: alapértelmezett mód, eljáráson belül konstansként viselkedik, lehet default értéke&lt;br /&gt;
* =OUT=: változóként viselkedik, változóval kell meghívni. Hívás után &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-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.&lt;br /&gt;
* =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&lt;br /&gt;
* =IN OUT=: értékadás bal és jobb oldalán is állhat&lt;br /&gt;
&lt;br /&gt;
====Eljárás hívása====&lt;br /&gt;
&lt;br /&gt;
* =BEGIN= és =END= között =eljárásnév(paraméterek);=&lt;br /&gt;
* Command windowból =EXEC eljárásnév(paraméterek);=&lt;br /&gt;
* Paraméterek átadása&lt;br /&gt;
** A paraméter lehet konstans, változó vagy kifejezés&lt;br /&gt;
** Paraméterátadás pozíció alapján: &lt;br /&gt;
&amp;lt;br/&amp;gt; =eljárásnév(érték, ...);=&lt;br /&gt;
** Paraméterátadás név alapján: &lt;br /&gt;
&amp;lt;br/&amp;gt; =eljárásnév(formális paraméter=&amp;gt;aktuális paraméter, ...);=&lt;br /&gt;
** 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.&lt;br /&gt;
* Függvényhívás történhet&lt;br /&gt;
** Kifejezés részeként&lt;br /&gt;
** =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.&lt;br /&gt;
&lt;br /&gt;
===Példák===&lt;br /&gt;
&lt;br /&gt;
====Tárolt eljárás hibakezeléssel====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PROCEDURE anyag_beszur&lt;br /&gt;
	(azonosito INT, nev VARCHAR2, egyszegnev VARCHAR2)&lt;br /&gt;
IS&lt;br /&gt;
	egysegid INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT egyseg_id INTO egysegid FROM egyseg&lt;br /&gt;
		WHERE UPPER(egyseg_nev) = UPPER(egysegnev);&lt;br /&gt;
	INSERT INTO anyag(anyag_id, anyag_nev, anyag_egyseg)&lt;br /&gt;
		VALUES(azonosito, ne, egysegid);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
		RAISE_APPLICATION_ERROR(-20101, &#039;Nincs ilyen egység&#039;);&lt;br /&gt;
	WHEN DUP_VAL_ON_INDEX THEN&lt;br /&gt;
	BEGIN&lt;br /&gt;
		SELECT anya_id INTO aid FROM anyag&lt;br /&gt;
			WHERE UPPER(anyag_nev) = UPPER(nev);&lt;br /&gt;
		RAISE_APPLICATION_ERROR(-20102, &#039;Az anyag létezik &#039; ||| aid || &#039; azonosítóval&#039;);&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
		WHEN NO_DATA_FOUND THEN&lt;br /&gt;
		  SELECT MAX(anyag_id)+1 INTO aid FROM anyag;&lt;br /&gt;
		  RAISE_APPLICATION_ERROR(-20103, &#039;Dupla azonosító, ajánlott: &#039; | aid&#039;);&lt;br /&gt;
	END;&lt;br /&gt;
END anyag_beszur;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Tárolt eljárás név nélküli hiba kezelésével====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PROCEDURE recept_beszur&lt;br /&gt;
	(aid INT, fid INT, mennyiseg FLOAT)	 -- aid=anyag id, fid=félkész id&lt;br /&gt;
IS&lt;br /&gt;
	referencia EXCEPTION;&lt;br /&gt;
	PRAGMA EXCEPTION_INIT(referencia, -2291);&lt;br /&gt;
BEGIN&lt;br /&gt;
	INSERT INTO felkesz_anyag VALUES(aid, fid, mennyiseg);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN referencia THEN&lt;br /&gt;
		RAISE ...	  -- itt még lehetne ellenőrizni, hogy melyik oszlop okozza&lt;br /&gt;
	WHEN DUP_VAL_ON_INDEX THEN&lt;br /&gt;
		RAISE ...&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Tárolt függvény hibakezeléssel====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE FUNCTION pilota_pontszam(pid INT, fid INT)&lt;br /&gt;
	 RETURN INT&lt;br /&gt;
IS&lt;br /&gt;
	result INT;&lt;br /&gt;
	sorszam INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT helyezes [[INTo]] sorszam FROM futam_pilota&lt;br /&gt;
		WHERE futam_id=fid AND pilota_id=pid;&lt;br /&gt;
	CASE sorszam&lt;br /&gt;
		WHEN 1 THEN result:=10;&lt;br /&gt;
		WHEN 2 THEN result:=8;&lt;br /&gt;
		WHEN 3 THEN result:=6;&lt;br /&gt;
		...&lt;br /&gt;
		WHEN 8 THEN result:=1;&lt;br /&gt;
		ELSE result:=0;&lt;br /&gt;
	END CASE;&lt;br /&gt;
	RETURN result;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
		RAISE ...&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Tárolt eljárás hívása====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;SELECT nev, helyezes, pilota_pontszam(pilotaid, futamid) pont&lt;br /&gt;
	FROM futam_pilota NATURAL JOIN pilota&lt;br /&gt;
	WHERE futamid=51001&lt;br /&gt;
	ORDER BY helyezes, pont DESC;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060310&amp;diff=163821</id>
		<title>AdatbServerProgJegyzet20060310</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060310&amp;diff=163821"/>
		<updated>2013-03-31T19:03:03Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.03.10.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.03.10.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.10.&amp;diff=163820</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.03.10.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.10.&amp;diff=163820"/>
		<updated>2013-03-31T19:03:02Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060310}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;br/&amp;gt; &amp;amp;lt;&amp;amp;lt; Előad…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060310}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060307|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.03.10. [[AdatbServerProgJegyzet20060314|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Kurzorok==&lt;br /&gt;
&lt;br /&gt;
A következő kód hibás, mert ha a =SELECT= nulla sorral tér vissza, exceptiont kapunk:&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	myid INT:=3;&lt;br /&gt;
	nev VARCHAR(50);&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT anyag_nev INTO nev FROM anyag WHERE anyag_id=myid;&lt;br /&gt;
	DBMS_OUTPUT.PUT_LINE(nev);&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy tábla sorain kurzor segítségével lehet végiglépkedni.&lt;br /&gt;
&lt;br /&gt;
* Explicit kurzor: a programozó hozza létre&lt;br /&gt;
* Implicit kurzor: az Oracle hozza létre azokra a lekérdezésekre, amikre nincs explicit kurzor.&lt;br /&gt;
&lt;br /&gt;
===Kurzorok szintaktikája===&lt;br /&gt;
&lt;br /&gt;
* Kurzor deklarálása: =CURSOR kurzor_név [(param1, ...)] [RETURN visszatérési_típus] IS lekérdezés;= &lt;br /&gt;
&amp;lt;br/&amp;gt; A paraméterek láthatósága lokális.&lt;br /&gt;
* Kurzor megnyitása: =OPEN kurzor_név [(érték1, ...)];=&lt;br /&gt;
* Léptetés a következő sorra, és beolvasás: =FETCH kurzor_név INTO változó;= &lt;br /&gt;
&amp;lt;br/&amp;gt; A =FETCH= csak az =OPEN= és a =CLOSE= között használható.&lt;br /&gt;
* Összes sor kiolvasása egyszerre: =FETCH kurzor_név BULK COLLECT INTO tömb;=&lt;br /&gt;
* Kurzor bezárása: =CLOSE kurzornév;=&lt;br /&gt;
  &lt;br /&gt;
===Attribútumok===&lt;br /&gt;
&lt;br /&gt;
* =kurzor_név%ISOPEN=: true, ha a kurzor meg van nyitva.&lt;br /&gt;
* =kurzor_név%NOTFOUND=: false, ha az utolsó =FETCH= sorral tért vissza. Első =FETCH= előtt =NULL=.&lt;br /&gt;
* =kurzor_név%FOUND=: true, ha az utolsó =FETCH= sorral tért vissza. Első =FETCH= előtt =NULL=.&lt;br /&gt;
* =kurzor_név%ROWCOUNT=: a &amp;lt;pre&amp;gt;FETCH&amp;lt;/pre&amp;gt;-elt sorok száma. Első =FETCH= előtt 0.&lt;br /&gt;
* =kurzor_név%ROWTYPE=: a kurzorral fesorolható sorok típusa. Csak akkor kérdezhető le, ha a =RETURN= után megadtunk visszatérési típust.&lt;br /&gt;
&lt;br /&gt;
Az implicit kurzorok az utolsó SQL utasításról adnak információt. Az attribútmait az =SQL%attribútum_név= kifejezéssel lehet lekérdezni.&lt;br /&gt;
&lt;br /&gt;
* =SQL%ISOPEN=: mindig false.&lt;br /&gt;
* =SQL%NOTFOUND=: true, ha az utolsó =SELECT=, =INSERT=, =UPDATE= vagy =INSERT= 0 sort érintett.&lt;br /&gt;
* =SQL%FOUND=: false, ha az utolsó =SELECT=, =INSERT=, =UPDATE= vagy =INSERT= 0 sort érintett.&lt;br /&gt;
* =SQL%ROWCOUNT=: az utolsó SQL utasítás által érintett sorok száma.&lt;br /&gt;
&lt;br /&gt;
==Példák==&lt;br /&gt;
&lt;br /&gt;
===Felsorolás LOOP ciklussal===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	CURSOR c IS SELECT anyag_id, anyag_nev FROM anyag;&lt;br /&gt;
	id INT;&lt;br /&gt;
	nev anyag.anyag_nev%TYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c;&lt;br /&gt;
	LOOP&lt;br /&gt;
		FETCH c INTO id, nev;&lt;br /&gt;
		EXIT WHEN c%NOTFOUND;&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(id || &#039; &#039; || nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Felsorolás FOR ciklussal===&lt;br /&gt;
&lt;br /&gt;
A FOR automatikusan megnyitja illetve lezárja a kurzort. A ciklusváltozót nem kell deklarálni, a típusa =kurzor%ROWTYPE= lesz.&lt;br /&gt;
&lt;br /&gt;
Szintaktika: =FOR rekord IN kurzor[(param1, ...)] LOOP= ... =END LOOP=;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	CURSOR c IS SELECT anyag_id id, anyag_nev nev FROM anyag;&lt;br /&gt;
BEGIN&lt;br /&gt;
	FOR crec IN c LOOP&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(crec.id || &#039; &#039; || crec.nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BULK COLLECT===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	CURSOR c IS SELECT anyag_nev, anyag_id FROM anyag;&lt;br /&gt;
	TYPE nev_type IS TABLE OF anyag.anyag_nev%TYPE;&lt;br /&gt;
	TYPE id_type IS TABLE OF anyag.anyag_id%TYPE;&lt;br /&gt;
	nev_tomb nev_type;&lt;br /&gt;
	id_tomb id_type;&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c;&lt;br /&gt;
	FETCH c BULK COLLECT INTO nev_tomb, id_tomb;&lt;br /&gt;
	CLOSE c;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implicit kurzor FOR ciklusban===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;BEGIN&lt;br /&gt;
	FOR crec IN (SELECT anyag_id, anyag_nev FROM anyag) LOOP&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(crec.anyag_id || &#039; &#039; || crec.anyag_nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Rekord típusú kurzor===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	TYPE anyag_rec IS RECORD (id INT, nev VARCHAR2(50));&lt;br /&gt;
	CURSOR c RETURN anyag_rec IS&lt;br /&gt;
		SELECT anyag_id, anyag_nev FROM anyag;&lt;br /&gt;
	rec c%ROWTYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c;&lt;br /&gt;
	LOOP&lt;br /&gt;
		FETCH c INTO rec;&lt;br /&gt;
		EXIT WHEN c1%NOTFOUND;&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(rec.anyag_id || &#039; &#039; || rec.anyag_nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kurzor változók==&lt;br /&gt;
&lt;br /&gt;
Az eddig használt kurzorok konstansok voltak. &lt;br /&gt;
* A kurzor változóhoz dinamikusan lehet hozzákötni a lekérdezést. Megnyitáskor az előző értékeket elfelejti. Az újbóli megnyitás előtt nem szükséges lezárni.&lt;br /&gt;
* A kurzor változót is meg kell nyitni és be kell zárni. &lt;br /&gt;
* A =BULK COLLECT= használható rá, de a FOR ciklus nem.&lt;br /&gt;
* A =%ROWTYPE= attribútum csak akkor használható, ha a változónak deklaráltuk a visszatérési típusát.&lt;br /&gt;
&lt;br /&gt;
===Szintaktika===&lt;br /&gt;
&lt;br /&gt;
* Deklaráció: =TYPE típusnév IS REF CURSOR [RETURN visszatérési_típus];=&lt;br /&gt;
* Megnyitás: =OPEN {kurzor_változó | :host_kurzor_változó} FOR {lekérdezés  dinamikus string} [USING bind_argument1, ...];=&lt;br /&gt;
* Olvasás: =FETCH {kurzor_változó | :host_kurzor_változó} [BULK COLLECT] INTO változó1, ...=&lt;br /&gt;
&lt;br /&gt;
==Példák==&lt;br /&gt;
&lt;br /&gt;
===Egyszerű felsorolás===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	TYPE c_type IS REF CURSOR;&lt;br /&gt;
	c c_type;&lt;br /&gt;
	nev VARCHAR2(50);&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c FOR SELECT anyag_nev FROM anyag;&lt;br /&gt;
	LOOP&lt;br /&gt;
		FETCH c INTO nev;&lt;br /&gt;
		EXIT WHEN c%NOTFOUND;&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
	OPEN c FOR SELECT stud_lname FROM student&lt;br /&gt;
	LOOP&lt;br /&gt;
		FETCH c INTO nev;&lt;br /&gt;
		EXIT WHEN c%NOTFOUND;&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
	CLOSE c;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Összetett lekérdezés===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
	CURSOR c IS&lt;br /&gt;
		SELECT felkesz_nev, CURSOR(&lt;br /&gt;
			SELECT anyag_nev, fa_mennyiseg, egyseg_nev&lt;br /&gt;
			FROM anyag, felkesz_anyag, egyseg&lt;br /&gt;
			WHERE anyag_id=fa_anyagid AND fa_felkesz_id=f.felkesz_id AND egyseg_id=anyag_egyseg)&lt;br /&gt;
		FROM felkesz f ORDER BY felkesz_nev;&lt;br /&gt;
	TYPE refcursor IS REF CURSOR;&lt;br /&gt;
	nev VARCHAR2(100);&lt;br /&gt;
	TYPE anyagdatatype IS RECORD&lt;br /&gt;
		(nev VARCHAR2(100), mennyiseg FLOAT, egyseg VARCHAR2(20));&lt;br /&gt;
	anyagadat anyagdatatype;&lt;br /&gt;
	mycur refcursor;&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c;&lt;br /&gt;
	LOOP&lt;br /&gt;
		FETCH c INTO nev, mycur;&lt;br /&gt;
		EXIT WHEN c%NOTFOUND;&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(&#039;A &#039; || nev || &#039; összetevői:&#039;);&lt;br /&gt;
		LOOP&lt;br /&gt;
			FETCH mycur INTO anyagadat;&lt;br /&gt;
			EXIT WHEN mycur%NOTFOUND;&lt;br /&gt;
			DBMS_OUTPUT.PUT_LINE(&lt;br /&gt;
				&#039;  &#039; || anyagadat.nev || &#039; &#039; || anyagadat.mennyiseg || &#039; &#039; || anyagadat.egyseg);&lt;br /&gt;
		END LOOP;&lt;br /&gt;
	END LOOP;&lt;br /&gt;
	CLOSE c;&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.10.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060217&amp;diff=163819</id>
		<title>AdatbServerProgJegyzet20060217</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060217&amp;diff=163819"/>
		<updated>2013-03-31T19:03:01Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.02.17.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.02.17.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.02.17.&amp;diff=163818</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.02.17.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.02.17.&amp;diff=163818"/>
		<updated>2013-03-31T19:03:00Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060217}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt; ol li { line-height: 18px; } &amp;lt;/style&amp;gt;  &amp;lt;br/&amp;gt; [[A…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060217}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; ol li { line-height: 18px; } &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProg|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.02.17. [[AdatbServerProgJegyzet20060221|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Kliens-szerver architektúra==&lt;br /&gt;
* Kliens: üzleti logika és megjelenítés&lt;br /&gt;
* Szerver: adatbázis&lt;br /&gt;
&lt;br /&gt;
* Előny: kevés kommunikáció&lt;br /&gt;
* Hátrány: ha az üzleti logika megváltozik, minden klienst cserélni kell&lt;br /&gt;
&lt;br /&gt;
==n-rétegű architektúra==&lt;br /&gt;
* Presentation Layer&lt;br /&gt;
* Business Logic Layer&lt;br /&gt;
* Data Access Layer&lt;br /&gt;
* Database -&amp;gt; mi csak ezzel foglalkozunk&lt;br /&gt;
&lt;br /&gt;
===Előnyök===&lt;br /&gt;
* rugalmasabban módosítható&lt;br /&gt;
* DAL miatt a DB cserélhető&lt;br /&gt;
* skálázható&lt;br /&gt;
===Hátrányok===&lt;br /&gt;
* bonyolultabb&lt;br /&gt;
* több kommunikáció&lt;br /&gt;
* interfészeket előre definiálni kell&lt;br /&gt;
&lt;br /&gt;
==Szerver oldali programozás==&lt;br /&gt;
* Tárolt eljárások és függvények&lt;br /&gt;
* Triggerek = eseményre automatikusan lefutó tárolt eljárások. Esemény alatt mást értünk Oracle és MS SQL alatt.&lt;br /&gt;
&lt;br /&gt;
===Tárolt eljárások===&lt;br /&gt;
&lt;br /&gt;
====Előnyök====&lt;br /&gt;
* Teljesítmény&lt;br /&gt;
** Szerveren lefordítva tárolódnak&lt;br /&gt;
** Több szál ugyanazt a memóriát használja&lt;br /&gt;
** Kisebb hálózati forgalom&lt;br /&gt;
** BLL-ben kevesebb funkció, jobban skálázható (rossz is lehet, mert a szervert terheljük)&lt;br /&gt;
* Kevésbé redundáns kódolás&lt;br /&gt;
* Biztonságos jogosultságkezelés a szerveren: felhasználó jogosultsága csak a tárolt eljárások futtatására korlátozható&lt;br /&gt;
* karbantarthatóság: ha csak a szervert módosítjuk, a klienst nem kell újrafordítani&lt;br /&gt;
 &lt;br /&gt;
====Hátrányok====&lt;br /&gt;
* Szervert terheljük&lt;br /&gt;
* Nem szabványos&lt;br /&gt;
&lt;br /&gt;
==SQL szintaktika==&lt;br /&gt;
&lt;br /&gt;
===Alap típusok===&lt;br /&gt;
* =int=&lt;br /&gt;
* =varchar(20)=: változó hosszú string&lt;br /&gt;
* =nvarchar(20)=: változó hosszú unicode string&lt;br /&gt;
* =char(20)=: fix hosszú string&lt;br /&gt;
* =nchar(20)=: fix hosszú unicode string&lt;br /&gt;
* =date= vagy =datetime=&lt;br /&gt;
* =float=&lt;br /&gt;
* =bit= (csak MS SQL-ben)&lt;br /&gt;
&lt;br /&gt;
===Tábla létrehozása===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE TABLE táblanév (&lt;br /&gt;
	{ oszlopdef | tábla szintű megkötés }*&lt;br /&gt;
)&lt;br /&gt;
oszlopdef: oszlopnév típus [oszlopszintű megkötés]&lt;br /&gt;
oszlopszintű megkötés:&lt;br /&gt;
	NULL | NOT NULL	// default: NULL&lt;br /&gt;
	[CONSTRAINT megkötésnév]&lt;br /&gt;
		PRIMARY KEY&lt;br /&gt;
		UNIQUE&lt;br /&gt;
		REFERENCES tábla(oszlop)&lt;br /&gt;
		CHECK(feltétel)	// a feltételben csak a saját oszlopnév szerepelhet&lt;br /&gt;
táblaszintű megkötés:&lt;br /&gt;
	CONSTRAINT név&lt;br /&gt;
		PRIMARY KEY (oszlopnév1, oszlopnév2, ...)&lt;br /&gt;
		UNIQUE (oszlopnév1, oszlopnév2, ...)&lt;br /&gt;
		FOREIGN KEY (oszlopnév1, ... oszlopnévn) REFERENCES táblanév(oszlopnév1, ... oszlopnévn)&lt;br /&gt;
		CHECK (több oszlopot tartalmazó logikai kifejezés&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tábla módosítása===&lt;br /&gt;
&amp;lt;pre&amp;gt;ALTER TABLE&lt;br /&gt;
	ADD { oszlopdef | tábla szintű megkötés }&lt;br /&gt;
	DROP, stb.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Lekérdezés===&lt;br /&gt;
&amp;lt;pre&amp;gt;SELECT [ALL|DISTINCT] oszloplista	// default: all&lt;br /&gt;
FROM táblalista&lt;br /&gt;
[WHERE keresési feltétel]&lt;br /&gt;
[GROUP BY csoportosítási kifejezés&lt;br /&gt;
	[HAVING csoport feltétel]]&lt;br /&gt;
[ORDER BY oszlop [ASC|DESC]]	// default: ASC&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Táblák összekapcsolása====&lt;br /&gt;
# Descartes-szorzat &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT * FROM t1,t2=&lt;br /&gt;
# =WHERE= mögött id-k alapján &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT * FROM t1,t2 WHERE t1.id=t2.t1_id=&lt;br /&gt;
# =JOIN= kulcsszó &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT * FROM t1 JOIN t2 ON t1.id=t2.t1_id= &lt;br /&gt;
&amp;lt;br/&amp;gt; Állítólag gyorsabb, de a jobb olvashatóság miatt a 2. változatot szokták használni.&lt;br /&gt;
# =NATURAL JOIN= &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT * FROM t1 NATURAL JOIN t2= &lt;br /&gt;
&amp;lt;br/&amp;gt; A két tábla közötti referenciánál illeszt.&lt;br /&gt;
# Beágyazott =SELECT= a tábla helyén &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT * FROM t1, (SELECT * FROM t2) a WHERE a.id=t1.a_id=&lt;br /&gt;
# Beágyazott =SELECT= a =WHERE= mögött &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT * from t1 WHERE t1_id IN (SELECT id FROM t2)=&lt;br /&gt;
&lt;br /&gt;
====GROUP BY====&lt;br /&gt;
&lt;br /&gt;
Oszlopfüggvények: =MIN=, =MAX=, =SUM=, =COUNT=, =AVG=.&lt;br /&gt;
&lt;br /&gt;
* Legjobban megfizetett alkalmazott: &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT MAX(fizetés) FROM alkalmazott=&lt;br /&gt;
* Minden tanszékről a legjobban megfizetett alkalmazott: &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT tanszék, MAX(fizetés) FROM alkalmazott GROUP BY tanszék=&lt;br /&gt;
* Azok a tanszékek, ahol a legjobb fizetés 200000 fölött van + a fizetés értéke: &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT tanszék, MAX(fizetés) maxfizu FROM alkalmazott &lt;br /&gt;
&amp;lt;br/&amp;gt; GROUP BY tanszék HAVING MAX(fizetés)&amp;gt;200000= &lt;br /&gt;
&amp;lt;br/&amp;gt; (A =HAVING= után nem használható az oszlopok új neve (itt: maxfizu))&lt;br /&gt;
* Ha a =SELECT= oszlopfüggvényt tartalmaz, a =GROUP BY= után szerepelnie kell minden olyan oszlopnak, ami a &amp;lt;pre&amp;gt;SELECT&amp;lt;/pre&amp;gt;-ben oszlopfüggvény kívül szerepelt.&lt;br /&gt;
&lt;br /&gt;
====Halmazműveletek====&lt;br /&gt;
&lt;br /&gt;
* =UNION=&lt;br /&gt;
* =UNION ALL=&lt;br /&gt;
* =INTERSECT= (Az SQL Server 2000 nem támogatja, csak a 2005)&lt;br /&gt;
* =MINUS= (Az SQL Server 2000 nem támogatja, csak a 2005)&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.02.21.&lt;br /&gt;
&lt;br /&gt;
===Beszúrás===&lt;br /&gt;
&lt;br /&gt;
* =INSERT INTO tábla (oszlop1, oszlop2, ...) VALUES (érték1, érték2, ...)=&lt;br /&gt;
* =INSERT INTO tábla (oszlop1, oszlop2, ...) SELECT (oszlop1, oszlop2, ...) ...=&lt;br /&gt;
&lt;br /&gt;
====Azonosító generálás====&lt;br /&gt;
&lt;br /&gt;
* SQL Server&lt;br /&gt;
** Létrehozás: =CREATE TABLE a (id INT IDENTITY PRIMARY KEY, szoveg VARCHAR(20))=&lt;br /&gt;
** Beszúrás: =INSERT INTO a VALUES(&#039;abc&#039;)=&lt;br /&gt;
** Beszúrás nem automatikusan generált id-vel: &lt;br /&gt;
&amp;lt;br/&amp;gt; =SET IDENTITY_INSERT a ON= &lt;br /&gt;
&amp;lt;br/&amp;gt; =INSERT INTO a(id,szoveg) VALUES(3, &#039;cde&#039;)= &lt;br /&gt;
&amp;lt;br/&amp;gt; =SET IDENTITY_INSERT a OFF=&lt;br /&gt;
* Oracle&lt;br /&gt;
** Szekvencia létrehozása (különálló objektum, nem kapcsolódik táblához): &lt;br /&gt;
&amp;lt;br/&amp;gt; =CREATE SEQUENCE a_seq START WITH 1 INCREMENT BY 1=&lt;br /&gt;
** Beszúrás: =INSERT INTO a VALUES(a_seq.NEXTVAL, &#039;abc&#039;)=&lt;br /&gt;
** Beszúrás a szekvencia aktuális értékével: &lt;br /&gt;
&amp;lt;br/&amp;gt; =INSERT INTO a VALUES(a_seq.CURVAL, &#039;abc&#039;)=&lt;br /&gt;
&lt;br /&gt;
===Módosítás===&lt;br /&gt;
&lt;br /&gt;
* =UPDATE táblanév SET oszlop1=érték1, oszlop2=érték2, ... [WHERE feltétel]=&lt;br /&gt;
* Több táblás módosítás:&lt;br /&gt;
** SQL Server: =FROM= kulcsszóval&lt;br /&gt;
** Oracle: al-&amp;lt;pre&amp;gt;SELECT&amp;lt;/pre&amp;gt; segítségével&lt;br /&gt;
&lt;br /&gt;
===Törlés===&lt;br /&gt;
&lt;br /&gt;
* =DELETE FROM táblanév [WHERE feltétel]= &lt;br /&gt;
&amp;lt;br/&amp;gt; Ha nincs feltétel megadva, az egész táblát törli.&lt;br /&gt;
* =TRUNCATE táblanév= == =DELETE FROM táblanév=. Az előbbi gyorsabb.&lt;br /&gt;
&lt;br /&gt;
===Nézet létrehozása===&lt;br /&gt;
&lt;br /&gt;
* =CREATE VIEW nézetnév(oszlop1, oszlop2, ...) AS lekérdezés=&lt;br /&gt;
* Egy táblás nézetbe be lehet szúrni sorokat, több tábla esetén csak triggerekkel lehet trükközni.&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.02.21.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060303&amp;diff=163817</id>
		<title>AdatbServerProgJegyzet20060303</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060303&amp;diff=163817"/>
		<updated>2013-03-31T19:02:59Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása Előadás, 2006.03.03.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása_Előadás,_2006.03.03.]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.03.&amp;diff=163816</id>
		<title>Adatbázisok szerver oldali programozása Előadás, 2006.03.03.</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s,_2006.03.03.&amp;diff=163816"/>
		<updated>2013-03-31T19:02:57Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060303}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display:block; me…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060303}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display:block; mergin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060224|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.03.03. [[AdatbServerProgJegyzet20060307|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Adattípusok==&lt;br /&gt;
&lt;br /&gt;
===Típusok osztályozása===&lt;br /&gt;
* változó / konstans / oszlop / összetett&lt;br /&gt;
* skalár / összetett&lt;br /&gt;
* beépitett / programozó által definiált&lt;br /&gt;
&lt;br /&gt;
===Skalár típusok===&lt;br /&gt;
* =NUMBER(p,s)=: fixpontos szám. p=hossz, s=tizedesjegyek száma. Ha s=0, egészet tárol.&lt;br /&gt;
* =CHAR(hossz [CHAR|BYTE])=: fix hosszú karakterláncot tárol. A hossz alapérteke 1, legfeljebb 32767 lehet. Táblában maximum 2000 hosszú karakterlánc tárolható. Ha rövidebb karakterláncot szúrunk be, a maradék helyeket automatikusan feltölti szóközökkel, ha hosszabbat, =VALUE_ERROR= exceptiont kapunk. A =CHAR= módositó segítségével unicode karakterek tárolhatók, BYTE esetén 1 karakter 1 byte hosszú.&lt;br /&gt;
* =VARCHAR2(hossz [CHAR|BYTE])=: változo hosszú karakterlánc. Ugyanazok a korlátozások érvényesek rá, mint a &amp;lt;pre&amp;gt;CHAR&amp;lt;/pre&amp;gt;-ra. Ha a hossz paraméter legfeljebb 2000, akkor a memóriában a maximális hosszt foglalja le, különben csak a string aktuális hosszát.&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
&amp;lt;br/&amp;gt;	a VARCHAR2(1500);&lt;br /&gt;
&amp;lt;br/&amp;gt;	b VARCHAR(3000);&lt;br /&gt;
&amp;lt;br/&amp;gt;BEGIN&lt;br /&gt;
&amp;lt;br/&amp;gt;	a:=&#039;abcde&#039;;	-- 1500 byte&lt;br /&gt;
&amp;lt;br/&amp;gt;	b:=&#039;abcde&#039;;	-- 5 byte&lt;br /&gt;
&amp;lt;br/&amp;gt;END;&amp;lt;/code&amp;gt;&lt;br /&gt;
* =NCHAR2=, =NVARCHAR2=: ugyanazt tudja, mint az előző két típus, csak unicode karaktereket tárol.&lt;br /&gt;
* =LONG=: &amp;gt;2000 hosszú karaktersorozatot is tud tárolni&lt;br /&gt;
* =DATE=: dátumot és időt tárol&lt;br /&gt;
* =BOOLEAN=: értékkészlete: ={TRUE, FALSE, NULL}=. Nem lehet oszlop típusa.&lt;br /&gt;
* =BINARY INTEGER=: -2^31+1 és 2^31-1 közötti egész&lt;br /&gt;
* =PLS_INTEGER=: ugyanez, csak hardver aritmetikát használ&lt;br /&gt;
* =LOB=: Large Object, legfeljebb 4 GB méretű. Típusai:&lt;br /&gt;
** =BFILE=: bináris file, az operációs rendszer filerendszerében tárolódik. Az adatbázis csak hivatkozást tartalmaz. Nem backupolódik automatikusan az adatbázissal.&lt;br /&gt;
** =BLOB=: adatbázison belül tárolódik, backupolódik.&lt;br /&gt;
** =CLOB=: mint a =BLOB=, csak karaktereket tartalmaz.&lt;br /&gt;
&lt;br /&gt;
===Altípusok===&lt;br /&gt;
&lt;br /&gt;
Altípus = alaptípus + megszorítás&lt;br /&gt;
&lt;br /&gt;
* =BINARY_INTEGER= altípusok&lt;br /&gt;
** =NATURAL= &amp;amp;isin; {0..2^31-1, NULL}&lt;br /&gt;
** =NATURALN= &amp;amp;isin; {0..2^31-1}&lt;br /&gt;
** =POSITIVE= &amp;amp;isin; {1..2^31-1, NULL}&lt;br /&gt;
** =POSITIVEN= &amp;amp;isin; {1..2^31-1}&lt;br /&gt;
** =SIGNTYPE= &amp;amp;isin; {-1, 0, 1}&lt;br /&gt;
* =NUMBER= altípusok&lt;br /&gt;
** =DEC=, =DECIMAL=, =NUMERIC=: fixpontos&lt;br /&gt;
** =FLOAT=, =DOUBLE PRECISION=, =REAL=: lebegőpontos&lt;br /&gt;
** =INTEGER=, =INT=, =SMALLINT=: egész&lt;br /&gt;
* =VARCHAR2= altípusok&lt;br /&gt;
** =STRING=, =VARCHAR= (csak alias)&lt;br /&gt;
&lt;br /&gt;
===Programozó által definiált típusok===&lt;br /&gt;
&lt;br /&gt;
Előre definiált típusok + megkötések.&lt;br /&gt;
&lt;br /&gt;
=SUBTYPE típusnév IS alaptípus [(megkötés)] [NOT NULL]= &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Csak a hosszra adható megkötés, értékkészletre nem.&lt;br /&gt;
&lt;br /&gt;
===Összetett típusok===&lt;br /&gt;
&lt;br /&gt;
* Rekord&lt;br /&gt;
** Típus deklaráció: =TYPE típusnév IS RECORD (mezőnév típus, mezőnév típus, ...);= &lt;br /&gt;
&amp;lt;br/&amp;gt; =típus=: &amp;lt;pre&amp;gt;típusnév [NOT NULL] [{:= | DEFAULT} érték];&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Változó deklaráció: =rekord_változó típusnév=&lt;br /&gt;
** Hivatkozás a rekord mezőjére: =rekord_változó.mezőnév=&lt;br /&gt;
** Értékadás: &amp;lt;pre&amp;gt;:=&amp;lt;/pre&amp;gt;, ha a két rekord azonos típusú, &lt;br /&gt;
&amp;lt;br/&amp;gt; =SELECT ... INTO rekord= vagy =FETCH ... INTO rekord=&lt;br /&gt;
* Rekord az adatbázis sémából&lt;br /&gt;
** =rekord_változó1 tábla%ROWTYPE;= &lt;br /&gt;
&amp;lt;br/&amp;gt; =rekord_változó2 tábla%ROWTYPE;= &lt;br /&gt;
&amp;lt;br/&amp;gt; A két változó nem lesz azonos típusú, még akkor sem, ha ugyanannak a táblának a sorát reprezentálják.&lt;br /&gt;
* Tömb: &lt;br /&gt;
** Az elemek azonos típusúak&lt;br /&gt;
** Az elemek sorban követik egymást, a tömb nem tartalmazhat lyukakat&lt;br /&gt;
** Az elemek indexelése 1-től kezdődik&lt;br /&gt;
** A minimális méret 1, az =EXTEND= metódussal növelhető, de nem haladhatja meg a deklarációkor megadott maximumot. Az új elemek a tömb végére szúrhatók be.&lt;br /&gt;
** Oszlop típusa is lehet&lt;br /&gt;
** Inicializálás előtt NULL értékű&lt;br /&gt;
** Deklaráció: =TYPE tömbtípus IS VARRAY(5) OF INT;=&lt;br /&gt;
** Konstruktor: &amp;lt;pre&amp;gt;tömb:=tömbtípus(elem, elem, ...);&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Új elem beszúrása: =tömb.EXTEND=; majd &amp;lt;pre&amp;gt;tömb(tömb.LAST):=érték;&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Címzés: =tömbnév(index)=&lt;br /&gt;
* Nested table &amp;amp;mdash; különbségek a sima tömbhöz képest&lt;br /&gt;
** Az elemszám nem korlátos&lt;br /&gt;
** Ritka, középről is törölhetők elemek&lt;br /&gt;
** Deklaráció: =TYPE típusnév IS TABLE OF elem_típus [NOT NULL];=&lt;br /&gt;
* Index-by table = hash tábla&lt;br /&gt;
** Nem lehet táblában tárolni&lt;br /&gt;
** Nem kell inicializálni, kezdetben üres&lt;br /&gt;
** Szerkezeténél fogva ritka&lt;br /&gt;
** Az index negatív is lehet, az Oracle 10g-től kezdve pedig =VARCHAR2= is.&lt;br /&gt;
** Deklaráció: =TYPE típusnév IS TABLE OF elem_típus INDEX BY index_típus;=&lt;br /&gt;
&lt;br /&gt;
Példa tömb használatára:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	TYPE tombtipus IS VARRAY(5) OF INT;&lt;br /&gt;
	tomb tombtipus;&lt;br /&gt;
BEGIN&lt;br /&gt;
	tomb:=tombtipus(1,4,9);&lt;br /&gt;
	tomb.EXTEND;&lt;br /&gt;
	tomb(4):=16;&lt;br /&gt;
	FOR i IN 1..tomb.LAST LOOP&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(tomb(i));&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Metódusok====&lt;br /&gt;
&lt;br /&gt;
=változónév.metódusnév[(paraméterek)]= formában hívhatók&lt;br /&gt;
&lt;br /&gt;
* =EXISTS(n)=: n. indexen van-e elem. Ha túlcímzünk a tömbön, &amp;lt;pre&amp;gt;FALSE&amp;lt;/pre&amp;gt;-szal tér vissza.&lt;br /&gt;
* =COUNT=: a kollekció elemszáma. Nested table-nél értéke különbözhet a &amp;lt;pre&amp;gt;LAST&amp;lt;/pre&amp;gt;-tól.&lt;br /&gt;
* =LIMIT=: a kollekció maximális elemszáma. Nested table-nél NULL.&lt;br /&gt;
* =FIRST=, =LAST=: első illetve utolsó elem indexe. Üres kollekció esetén NULL.&lt;br /&gt;
* =PRIOR(n)=, =NEXT(n)=: n-et megelőző illetve rákövetkező kitöltött elem indexe. =VARRAY= esetén n-1 illetve n+1, index-by table-re nincs értelmezve. Ha nincs előző vagy következő elem, &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-lal tér vissza.&lt;br /&gt;
* =EXTEND=, =ENTEND(n)=, =EXTEND(n,i)=: bővíti a &amp;lt;pre&amp;gt;VARRAY&amp;lt;/pre&amp;gt;-t vagy a nested table-t 1 db &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-lal, n db &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-lal, illetve n példánnyal az i indexű elemből. Index-by table-re nem értelmezett.&lt;br /&gt;
* =TRIM=, =TRIM(n)=: törli a =VARRAY= vagy a nested table utolsó 1 illetve n elemét. Index-by table-re nem értelmezett.&lt;br /&gt;
* =DELETE=, =DELETE(n)=, =DELETE(n,m)=: törli az összes, az n. illetve a [n...m] intervallum összes elemét az index-by vagy nested table-ből.&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.06.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Valaszthato_AdatbServerProgJegyzet20060321&amp;diff=163813</id>
		<title>Valaszthato AdatbServerProgJegyzet20060321</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Valaszthato_AdatbServerProgJegyzet20060321&amp;diff=163813"/>
		<updated>2013-03-31T18:51:56Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060321}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt; pre { margin-top: 2px; margin-bottom: 2px; } li …”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060321}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; pre { margin-top: 2px; margin-bottom: 2px; } li { line-height: 18px; } &amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060317|&amp;amp;lt;&amp;amp;lt;]] Labor, 2006.03.21. [[AdatbServerProgJegyzet20060324|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts egy tárolt eljárást, aminek bemeneti paramétere egy pilóta neve, két kimeneti paramétere pedig a pilóta magassága és súlya! Az eljárást próbáld ki SQL Windowból, a kimeneti paramétereket a DBMS_OUTPUT.PUT_LINE metódussal írasd ki a&lt;br /&gt;
kimenetre!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Program Window:&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE pilotaparams(pnev IN VARCHAR2, magassag OUT INT, suly OUT INT) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT pilota.magassag, pilota.suly INTO magassag, suly&lt;br /&gt;
  FROM pilota&lt;br /&gt;
  WHERE pilota.nev = pnev;&lt;br /&gt;
END pilotaparams;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;SQL Window:&lt;br /&gt;
&amp;lt;pre&amp;gt;DECLARE&lt;br /&gt;
  magassag INT;&lt;br /&gt;
  suly INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
  pilotaparams(&#039;Cristijan Albers&#039;, magassag, suly);&lt;br /&gt;
  DBMS_OUTPUT.PUT_LINE(&#039;Magassag: &#039; || magassag || &#039;  Suly: &#039; || suly);&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Próbáld ki az előző feladatban megoldott eljárás hívását a Test Window-ból! A Test Window egy olyan környezet, ahol lehetőség van környezeti változókat használni a&lt;br /&gt;
blokkon belül. Ha környezeti változóban adjuk meg a bemeneti és a két kimeneti&lt;br /&gt;
paramétert, akkor az eredményt az ablak alsó felében láthatjuk, nem kell nekünk extra&lt;br /&gt;
kiíratni a kimenetre. A környezeti változók deklarálása is a Test Window alsó&lt;br /&gt;
ablakában lehetséges, ahol meg kell adni a változó nevét és típusát, ha bemeneti&lt;br /&gt;
paraméter, akkor az értékét is. A változóra a blokkon belül a kettőspont változónévvel lehet hivatkozni. (Pl. a változó neve legyen pilotanev, akkor a blokkon belül =:pilotanev= kifejezéssel hivatkozunk rá.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;BEGIN&lt;br /&gt;
  pilotaparams(:pilotanev, magassag, suly);&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test Window alján:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Variable&#039;&#039;&#039; || &#039;&#039;&#039;Type&#039;&#039;&#039; || &#039;&#039;&#039;Value&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| pilotanev || String || Cristijan Albers &lt;br /&gt;
|-&lt;br /&gt;
| magassag || Integer || &lt;br /&gt;
|-&lt;br /&gt;
| suly || Integer || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
F8-ra kitölti a hiányzó értékeket.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Egészítsd ki az előző feladatot hibakezeléssel is. Amennyiben nem létezik a&lt;br /&gt;
bemenetként megadott pilóta, akkor a kimeneti értékek -1 legyenek!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE pilotaparams(pnev IN VARCHAR2, magassag OUT INT, suly OUT INT) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
  SELECT pilota.magassag, pilota.suly INTO magassag, suly&lt;br /&gt;
  FROM pilota&lt;br /&gt;
  WHERE pilota.nev = pnev;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
  WHEN NO_DATA_FOUND THEN&lt;br /&gt;
	 magassag := -1;&lt;br /&gt;
	 suly := -1;&lt;br /&gt;
END pilotaparams;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Készíts egy tárolt eljárást, aminek bemeneti paramétere egy csapat neve és egy&lt;br /&gt;
évszám! Az eljárás listázza ki a kimenetre az adott csapat adott évben szerződtetett&lt;br /&gt;
pilótáit!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE csapat_szezon_pilotak(csnev IN VARCHAR2, szev IN int) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
	FOR rec IN (&lt;br /&gt;
		SELECT pilota.nev&lt;br /&gt;
		FROM csapat, csapat_pilota, csapat_szezon, pilota&lt;br /&gt;
		WHERE csapat.csapatid = csapat_szezon.csapatid&lt;br /&gt;
			AND csapat_szezon.csapatszezonid = csapat_pilota.csapatszezonid&lt;br /&gt;
			AND pilota.pilotaid = csapat_pilota.pilotaid&lt;br /&gt;
			AND csapat.nev = csnev&lt;br /&gt;
			AND csapat_szezon.ev = szev&lt;br /&gt;
	) LOOP&lt;br /&gt;
	  DBMS_OUTPUT.PUT_LINE(rec.nev);&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END csapat_szezon_pilotak;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy olyan eljárást, aminek az egyetlen bemenő paramétere az évszám, és az adott szezonban létező csapatok pilótáit listázza ki a kimenetre szépen formázva (a csapat nevek alatt bentebb vannak felsorolva a pilóták nevei)!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE szezon_pilotak(szev IN int) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
	FOR rec IN (&lt;br /&gt;
		SELECT csapat.csapatid, csapat.nev&lt;br /&gt;
		FROM csapat, csapat_szezon&lt;br /&gt;
		WHERE csapat.csapatid = csapat_szezon.csapatid&lt;br /&gt;
			AND csapat_szezon.ev = szev&lt;br /&gt;
	) LOOP&lt;br /&gt;
		DBMS_OUTPUT.PUT_LINE(rec.nev);&lt;br /&gt;
		FOR rec2 IN (&lt;br /&gt;
			SELECT pilota.nev&lt;br /&gt;
			FROM csapat_pilota, csapat_szezon, pilota&lt;br /&gt;
			WHERE csapat_szezon.csapatszezonid = csapat_pilota.csapatszezonid&lt;br /&gt;
				AND pilota.pilotaid = csapat_pilota.pilotaid&lt;br /&gt;
				AND rec.csapatid = csapat_szezon.csapatid&lt;br /&gt;
				AND csapat_szezon.ev = szev&lt;br /&gt;
		) LOOP&lt;br /&gt;
			DBMS_OUTPUT.PUT_LINE(&#039;	&#039; || rec2.nev);&lt;br /&gt;
		END LOOP;&lt;br /&gt;
	END LOOP;&lt;br /&gt;
END szezon_pilotak;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy tárolt eljárást, aminek segítségével egy csapatot és egy pilótát tudunk egy szezonban összerendelni. Az eljárás bemenő paramétere a csapat neve, a pilóta neve, a szezon évszáma és a pilóta típusa legyen. Használd a hibakezelési lehetőségeket az alábbi szituációkra, és mindegyikről külön küldj hibaüzenetet:&lt;br /&gt;
&lt;br /&gt;
* Nem létezik az adott nevő csapat vagy az adott évben nem indult.&lt;br /&gt;
* Nem létezik az adott pilóta.&lt;br /&gt;
* Nincs ilyen szezon definiálva az adatbázisban.&lt;br /&gt;
* Már tagja az adott pilóta az adott csapatnak az adott évben.&lt;br /&gt;
* Ha a pilóta típusa 1 vagy 2 és ilyen már létezik, akkor vegye fel másik számúnak, ha az még nem foglalt, vagy ha már mindkét pozíció foglalt, akkor teszt pilótának, és küldjön erről üzenetet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE PROCEDURE szezon_pilotak(&lt;br /&gt;
	csapatnev VARCHAR2;&lt;br /&gt;
	pilotanev VARCHAR2;&lt;br /&gt;
	szezonev INT;&lt;br /&gt;
	pilotatipus CHAR;&lt;br /&gt;
) IS&lt;br /&gt;
BEGIN&lt;br /&gt;
  -- to be continued...&lt;br /&gt;
END;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj függvényt, ami a bemeneteként kapott FLOAT típusú számot szöveges&lt;br /&gt;
formátummá konvertálja a következők szerint:&lt;br /&gt;
óra:perc:másodperc.ezredmásodperc!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj lekérdezést, ami az előző feladatban megírt függvény segítségével kilistázza a 2005-ös Ausztrál Nagydíj eredményét (pilóta név, helyezés, idő)!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj lekérdezést, ami az előző feladatban megírt lekérdezést egészíti ki olyan módon, hogy egy újabb oszlopban az adott időeredmény és az első helyezett eredményének a különbsége is megjelenik! Az eredményedet ellenőrizd le a http://www.formula1.com oldalon található táblázattal! Az eredmény így nézzen ki:&lt;br /&gt;
&lt;br /&gt;
TODO: táblázat&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Írj egy függvényt, ami a tanév szemesztereinek következőképpen megadott kódját&lt;br /&gt;
szöveges, emberek számára egyértelmően értelmezhetővé konvertálja! A&lt;br /&gt;
szemeszterkód egy ötjegyő szám, aminek első négy jegye az évet jelenti, míg az&lt;br /&gt;
ötödik számjegye az év félévét jelenti. Például a 2002 év őszi félévét a 20022 jelöli,&lt;br /&gt;
míg a 2003 tavaszi félévet a 20031 kód jelöli. Megjelenítéskor az első esetben&lt;br /&gt;
&amp;amp;#8222;2002/2003 I. félév&amp;amp;#8221; a második esetben pedig &amp;amp;#8222;2002/2003 II. félév&amp;amp;#8221; szöveget&lt;br /&gt;
szeretnénk látni. A megírt függvényt próbáld ki néhány minta bemenettel!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Az előző feladatban megírt függvény segítségével listázd ki a tanár-diák adatbázis =SEMESTER= tábla adatait!&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.21.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Valaszthato_AdatbServerProgJegyzet20060317&amp;diff=163812</id>
		<title>Valaszthato AdatbServerProgJegyzet20060317</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Valaszthato_AdatbServerProgJegyzet20060317&amp;diff=163812"/>
		<updated>2013-03-31T18:50:54Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060317}}  &amp;lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060317}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
* Set DENYTOPICVIEW = [[TWikiGuest]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt; &lt;br /&gt;
	code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px;}&lt;br /&gt;
	li { line-height: 18px; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; [[AdatbServerProgJegyzet20060314|&amp;amp;lt;&amp;amp;lt;]] Előadás, 2006.03.17. [[AdatbServerProgJegyzet20060321|&amp;amp;gt;&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Kivételek kezelése==&lt;br /&gt;
&lt;br /&gt;
===Kivétel típusok===&lt;br /&gt;
&lt;br /&gt;
* Rendszer kivételek&lt;br /&gt;
** Névvel ellátott kivételek (név, sorszám, üzenet)&lt;br /&gt;
** Név nélküli kivételek (sorszám, üzenet)&lt;br /&gt;
* Felhasználói kivételek&lt;br /&gt;
* Alkalmazás hibák&lt;br /&gt;
&lt;br /&gt;
====Névvel ellátott kivételek====&lt;br /&gt;
&lt;br /&gt;
* Kivétel lekezelése: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE ...&lt;br /&gt;
&amp;lt;br/&amp;gt;BEGIN ...&lt;br /&gt;
&amp;lt;br/&amp;gt;EXCEPTION&lt;br /&gt;
&amp;lt;br/&amp;gt;	WHEN kivételnév [OR kivételnév2 [...]] THEN utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;	WHEN OTHERS THEN utasítások;&lt;br /&gt;
&amp;lt;br/&amp;gt;END;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Az =OTHERS= blokknak a =EXCEPTION= blokk végére kell kerülnie.&lt;br /&gt;
* Gyakori, névvel ellátott kivételek:&lt;br /&gt;
** =NO_DATA_FOUND=&lt;br /&gt;
** =TOO_MANY_ROWS=&lt;br /&gt;
** =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&lt;br /&gt;
** =VALUE_ERROR=: pl. =NULL= értéket akarunk beszúrni =NOT NULL= oszlopba&lt;br /&gt;
** =ZERO_DIVIDE=&lt;br /&gt;
** =CURSOR_ALREADY_OPEN=: kétszer nyitunk meg egy kurzort&lt;br /&gt;
** =INVALID_CURSOR=&lt;br /&gt;
** =CASE_NOT_FOUND=: a =CASE= utasítás szelektora egyik ágra sem illeszkedik&lt;br /&gt;
* A nevek a =STANDARD= csomagban vannak összegyűjtve. Nem kell deklarálni őket.&lt;br /&gt;
* Kivétel generálása: =RAISE NO_DATA_FOUND;=&lt;br /&gt;
&lt;br /&gt;
====Név nélküli rendszer kivételek====&lt;br /&gt;
* A =WHEN OTHERS= blokkban egyszerre elkaphatók&lt;br /&gt;
* Elnevezhetők a =PRAGMA= utasítás segítségével: &amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE kivételnév EXCEPTION;&lt;br /&gt;
&amp;lt;br/&amp;gt;PRAGMA EXCEPTION_INIT(kivételnév, szám);&amp;lt;/code&amp;gt;&lt;br /&gt;
* 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 ...=&lt;br /&gt;
* Kivétel generálása: =RAISE kivételnév;=&lt;br /&gt;
&lt;br /&gt;
====Felhasználói kivételek====&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Szintaktika:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE &lt;br /&gt;
	kivételnév EXCEPTION;&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
	RAISE kivételnév;&lt;br /&gt;
	...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN kivételnév THEN ...&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Alkalmazás hibák====&lt;br /&gt;
* Hiba kiváltása: =RAISE_APPLICATION_ERROR(hibakód, üzenet[, {FALSE|TRUE}])=&lt;br /&gt;
** hibakód: -20999 és -20000 közötti szám&lt;br /&gt;
** üzenet: =VARCHAR(2048)=&lt;br /&gt;
** 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=&lt;br /&gt;
&lt;br /&gt;
===Kivételek terjedése===&lt;br /&gt;
* A =DECLARE= és =BEGIN= között keletkezett hibát csak kívül lehet elkapni.&lt;br /&gt;
* Ugyanez igaz az =EXCEPTION= és az =END= között keletkezett kivételre is.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
===Hibakód és hibaüzenet===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt; Az =SQLCODE= illetve az =SQLERRM= függvényekkel kérdezhető le.&lt;br /&gt;
	&amp;lt;li&amp;gt; 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.&lt;br /&gt;
	&amp;lt;li&amp;gt; Példa a hibák naplózására:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;DECLARE&lt;br /&gt;
	hibakod INT;&lt;br /&gt;
	uzenet VARCHAR2(512);&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN OTHERS THEN&lt;br /&gt;
		szam := SQLCODE;&lt;br /&gt;
		uzenet := SQLERRM;&lt;br /&gt;
		INSERT INTO naplo VALUES (szam, uzenet, sysdate);&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Hibakódok====&lt;br /&gt;
* Belső kivétel: &amp;lt;0&lt;br /&gt;
* =NO_DATA_FOUND=: 100&lt;br /&gt;
* Felhasználói kivétel: 1&lt;br /&gt;
* Nincs hiba: 0&lt;br /&gt;
&lt;br /&gt;
====Hibaüzenetek====&lt;br /&gt;
* A rendszerüzenetek =VARCHAR2(512)= típusúak&lt;br /&gt;
* Felhasználói kivétel esetén a =&#039;User Defined Exception&#039;= üzenetet kapjuk&lt;br /&gt;
* Siker esetén =&#039;ORA-0000&#039;= az üzenet&lt;br /&gt;
&lt;br /&gt;
==Alprogramok==&lt;br /&gt;
&lt;br /&gt;
===Alprogramok típusai, terminológia===&lt;br /&gt;
&lt;br /&gt;
* Lehetnek eljárások vagy függvények&lt;br /&gt;
* Lehetnek tároltak vagy lokálisak&lt;br /&gt;
* Részei: deklaráció, kód, kivételkezelés&lt;br /&gt;
* _Formális paraméter_: a paraméter neve&lt;br /&gt;
* _Aktuális paraméter_: a paraméter értéke&lt;br /&gt;
&lt;br /&gt;
===Eljárások és függvények===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt; Eljárás deklarációja:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;[CREATE [OR REPLACE]] PROCEDURE eljárásnév [(paraméterek)]&lt;br /&gt;
	[AUTHID {DEFINER|CURRENT_USER}]&lt;br /&gt;
{IS|AS}&lt;br /&gt;
	lokális deklaráció&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	...&lt;br /&gt;
END [eljárásnév];&amp;lt;/code&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt; Függvény deklarációja:&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;[CREATE [OR REPLACE]] FUNCTION függvénynév [(paraméterek)]&lt;br /&gt;
	RETURN típus&lt;br /&gt;
	[AUTHID {DEFINER|CURRENT_USER}]&lt;br /&gt;
{IS|AS}&lt;br /&gt;
	lokális deklaráció&lt;br /&gt;
BEGIN&lt;br /&gt;
	...&lt;br /&gt;
	RETURN érték;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	...&lt;br /&gt;
END [függvénynév];&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Paraméter deklaráció: &lt;br /&gt;
&amp;lt;br/&amp;gt; =név [IN|OUT [NOCOPY]||IN OUT [NOCOPY]] típus [{:=DEFAULT} kifejezés]=&lt;br /&gt;
&amp;lt;/ul&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Paraméter módok====&lt;br /&gt;
&lt;br /&gt;
* A típus nem tartalmazhat megkötést, mint pl. =VARCHAR2(50)=&lt;br /&gt;
* =IN=: alapértelmezett mód, eljáráson belül konstansként viselkedik, lehet default értéke&lt;br /&gt;
* =OUT=: változóként viselkedik, változóval kell meghívni. Hívás után &amp;lt;pre&amp;gt;NULL&amp;lt;/pre&amp;gt;-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.&lt;br /&gt;
* =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&lt;br /&gt;
* =IN OUT=: értékadás bal és jobb oldalán is állhat&lt;br /&gt;
&lt;br /&gt;
====Eljárás hívása====&lt;br /&gt;
&lt;br /&gt;
* =BEGIN= és =END= között =eljárásnév(paraméterek);=&lt;br /&gt;
* Command windowból =EXEC eljárásnév(paraméterek);=&lt;br /&gt;
* Paraméterek átadása&lt;br /&gt;
** A paraméter lehet konstans, változó vagy kifejezés&lt;br /&gt;
** Paraméterátadás pozíció alapján: &lt;br /&gt;
&amp;lt;br/&amp;gt; =eljárásnév(érték, ...);=&lt;br /&gt;
** Paraméterátadás név alapján: &lt;br /&gt;
&amp;lt;br/&amp;gt; =eljárásnév(formális paraméter=&amp;gt;aktuális paraméter, ...);=&lt;br /&gt;
** 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.&lt;br /&gt;
* Függvényhívás történhet&lt;br /&gt;
** Kifejezés részeként&lt;br /&gt;
** =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.&lt;br /&gt;
&lt;br /&gt;
===Példák===&lt;br /&gt;
&lt;br /&gt;
====Tárolt eljárás hibakezeléssel====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PROCEDURE anyag_beszur&lt;br /&gt;
	(azonosito INT, nev VARCHAR2, egyszegnev VARCHAR2)&lt;br /&gt;
IS&lt;br /&gt;
	egysegid INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT egyseg_id INTO egysegid FROM egyseg&lt;br /&gt;
		WHERE UPPER(egyseg_nev) = UPPER(egysegnev);&lt;br /&gt;
	INSERT INTO anyag(anyag_id, anyag_nev, anyag_egyseg)&lt;br /&gt;
		VALUES(azonosito, ne, egysegid);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
		RAISE_APPLICATION_ERROR(-20101, &#039;Nincs ilyen egység&#039;);&lt;br /&gt;
	WHEN DUP_VAL_ON_INDEX THEN&lt;br /&gt;
	BEGIN&lt;br /&gt;
		SELECT anya_id INTO aid FROM anyag&lt;br /&gt;
			WHERE UPPER(anyag_nev) = UPPER(nev);&lt;br /&gt;
		RAISE_APPLICATION_ERROR(-20102, &#039;Az anyag létezik &#039; ||| aid || &#039; azonosítóval&#039;);&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
		WHEN NO_DATA_FOUND THEN&lt;br /&gt;
		  SELECT MAX(anyag_id)+1 INTO aid FROM anyag;&lt;br /&gt;
		  RAISE_APPLICATION_ERROR(-20103, &#039;Dupla azonosító, ajánlott: &#039; | aid&#039;);&lt;br /&gt;
	END;&lt;br /&gt;
END anyag_beszur;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Tárolt eljárás név nélküli hiba kezelésével====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE PROCEDURE recept_beszur&lt;br /&gt;
	(aid INT, fid INT, mennyiseg FLOAT)	 -- aid=anyag id, fid=félkész id&lt;br /&gt;
IS&lt;br /&gt;
	referencia EXCEPTION;&lt;br /&gt;
	PRAGMA EXCEPTION_INIT(referencia, -2291);&lt;br /&gt;
BEGIN&lt;br /&gt;
	INSERT INTO felkesz_anyag VALUES(aid, fid, mennyiseg);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN referencia THEN&lt;br /&gt;
		RAISE ...	  -- itt még lehetne ellenőrizni, hogy melyik oszlop okozza&lt;br /&gt;
	WHEN DUP_VAL_ON_INDEX THEN&lt;br /&gt;
		RAISE ...&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Tárolt függvény hibakezeléssel====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;CREATE OR REPLACE FUNCTION pilota_pontszam(pid INT, fid INT)&lt;br /&gt;
	 RETURN INT&lt;br /&gt;
IS&lt;br /&gt;
	result INT;&lt;br /&gt;
	sorszam INT;&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT helyezes [[INTo]] sorszam FROM futam_pilota&lt;br /&gt;
		WHERE futam_id=fid AND pilota_id=pid;&lt;br /&gt;
	CASE sorszam&lt;br /&gt;
		WHEN 1 THEN result:=10;&lt;br /&gt;
		WHEN 2 THEN result:=8;&lt;br /&gt;
		WHEN 3 THEN result:=6;&lt;br /&gt;
		...&lt;br /&gt;
		WHEN 8 THEN result:=1;&lt;br /&gt;
		ELSE result:=0;&lt;br /&gt;
	END CASE;&lt;br /&gt;
	RETURN result;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
		RAISE ...&lt;br /&gt;
END;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Tárolt eljárás hívása====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code class=&amp;quot;pre&amp;quot;&amp;gt;SELECT nev, helyezes, pilota_pontszam(pilotaid, futamid) pont&lt;br /&gt;
	FROM futam_pilota NATURAL JOIN pilota&lt;br /&gt;
	WHERE futamid=51001&lt;br /&gt;
	ORDER BY helyezes, pont DESC;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.03.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa&amp;diff=163811</id>
		<title>Adatbázisok szerver oldali programozása</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa&amp;diff=163811"/>
		<updated>2013-03-31T18:50:29Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GlobalTemplate|Valaszthato|AdatbServerProg}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tantárgy adatlap: &lt;br /&gt;
* http://www.vdk.bme.hu/targykov/valaszthato/viau9159.htm&lt;br /&gt;
Tanszéki oldal:&lt;br /&gt;
* https://avalon.aut.bme.hu/~reni/aszp/ (jelszavas)&lt;br /&gt;
* https://avalon.aut.bme.hu/~ivancsy/aszp.html&lt;br /&gt;
* http://www.aut.bme.hu/Portal/Targy.aspx?courseId=06d4f149-7397-4e93-903b-0d52483c49ed&lt;br /&gt;
Oktatók: &lt;br /&gt;
* Iváncsy Renáta (IB.153, 1668, reni@aut.bme.hu)&lt;br /&gt;
* Dr. Iváncsy Szabolcs (csak a Neptun szerint tanít minket, a félév során kétszer láttam)&lt;br /&gt;
&lt;br /&gt;
==Órai jegyzet==&lt;br /&gt;
&lt;br /&gt;
===Bevezetés===&lt;br /&gt;
* [[AdatbServerProgJegyzet20060217|Előadás, 2006.02.17.]] &amp;amp;mdash; 2 és n-rétegű architektúra, szerver oldali programozás, SQL szintaktika&lt;br /&gt;
&lt;br /&gt;
===Oracle===&lt;br /&gt;
* [[AdatbServerProgJegyzet20060221|Labor, 2006.02.21.]] &amp;amp;mdash; PL/SQL Developer alapok, Forma1 adatbázis létrehozása és feltöltése&lt;br /&gt;
* [[AdatbServerProgJegyzet20060224|Előadás, 2006.02.24.]] &amp;amp;mdash; Oracle és Sql Server összehasonlítása, Oracle vezérlési szerkezetek&lt;br /&gt;
* Labor, 2006.03.07. &amp;amp;mdash; Az ipari nyílt nap miatt elmaradt.&lt;br /&gt;
* [[AdatbServerProgJegyzet20060303|Előadás, 2006.03.03.]] &amp;amp;mdash; adattípusok&lt;br /&gt;
* [[AdatbServerProgJegyzet20060307|Labor, 2006.03.07.]] &amp;amp;mdash; &amp;lt;pre&amp;gt;SELECT&amp;lt;/pre&amp;gt;-ek írása a cukrász adatbázishoz&lt;br /&gt;
* [[AdatbServerProgJegyzet20060310|Előadás, 2006.03.10.]] &amp;amp;mdash; kurzorok&lt;br /&gt;
* [[AdatbServerProgJegyzet20060314|Labor, 2006.03.14.]] &amp;amp;mdash; elágazások, ciklusok, kurzorok használata&lt;br /&gt;
* [[AdatbServerProgJegyzet20060317|Előadás, 2006.03.17.]] &amp;amp;mdash; hibakezelés, tárolt eljárások és függvények&lt;br /&gt;
* [[AdatbServerProgJegyzet20060321|Labor, 2006.03.21.]] &amp;amp;mdash; tárolt eljárások és hibakezelés (Formula 1 DB)&lt;br /&gt;
* [[AdatbServerProgJegyzet20060324|Előadás, 2006.03.24.]] &amp;amp;mdash; triggerek&lt;br /&gt;
* [[AdatbServerProgJegyzet20060328|Labor, 2006.03.28.]] &amp;amp;mdash; tárolt alprogramok és triggerek&lt;br /&gt;
* [[AdatbServerProgJegyzet20060331|Előadás, 2006.03.31.]] &amp;amp;mdash; csomagok&lt;br /&gt;
* [[AdatbServerProgJegyzet20060404|Labor, 2006.04.04.]] &amp;amp;mdash; Forma1 csomag írása&lt;br /&gt;
* [[AdatbServerProgJegyzet20060407|Előadás, 2006.04.07.]] &amp;amp;mdash; tranzakciók&lt;br /&gt;
* [[AdatbServerProgJegyzet20060411|Labor, 2006.04.11.]] &amp;amp;mdash; tranzakciók&lt;br /&gt;
* [[AdatbServerProgJegyzet20060414|Előadás, 2006.04.14.]] &amp;amp;mdash; dinamikus SQL&lt;br /&gt;
* [[AdatbServerProgJegyzet20060418|Labor, 2006.04.18.]] &amp;amp;mdash; dinamikus SQL, infó kinyerése rendszer táblákból&lt;br /&gt;
&lt;br /&gt;
===Microsoft SQL Server ===&lt;br /&gt;
* [[AdatbServerProgJegyzet20060421|Előadás, 2006.04.21.]] &amp;amp;mdash; MS SQL bevezetés, =IDENTITY=, típusok, operátorok, vezérlési szerkezetek&lt;br /&gt;
* [[AdatbServerProgJegyzet20060425|Labor, 2006.04.25.]] &amp;amp;mdash; SQL Management Studio, változók, dátumkezelés, =UPDATE OUTPUT=&lt;br /&gt;
* [[AdatbServerProgJegyzet20060428|Előadás, 2006.04.28.]] &amp;amp;mdash; SQL-92 és T-SQL kurzor, kurzor ciklus, tárolt eljárások és függvények&lt;br /&gt;
* [[AdatbServerProgJegyzet20060502|Labor, 2006.05.02.]] &amp;amp;mdash; kurzorok, tárolt eljárások, függvények, =CASE=&lt;br /&gt;
* [[AdatbServerProgJegyzet20060505|Előadás, 2006.05.05.]] &amp;amp;mdash; DML és DDL triggerek, hibakezelés&lt;br /&gt;
* [[AdatbServerProgJegyzet20060509|Labor, 2006.05.09.]] &amp;amp;mdash; triggerek, hibakezelés, nézetek, példa kliens progi kiegészítése&lt;br /&gt;
* [[AdatbServerProgJegyzet20060512|Előadás, 2006.05.12.]] &amp;amp;mdash; dinamikus SQL, tranzakciók, XML (vetítős óra, XML nem vizsgaanyag)&lt;br /&gt;
* [[AdatbServerProgJegyzet20060516|Labor, 2006.05.16.]] &amp;amp;mdash; egy 2003-as vizsgát végig oldottunk&lt;br /&gt;
A jegyzetek Iváncsy Renáta kérésére csak bejelentkezés után elérhetők.&lt;br /&gt;
&lt;br /&gt;
==Minta adatbázisok==&lt;br /&gt;
&lt;br /&gt;
* Cukrász séma: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/cukrasz_sema.pdf&lt;br /&gt;
* Tanár-diák séma: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/tanar_diak_sema.pdf&lt;br /&gt;
* Forma-1 séma: https://avalon.aut.bme.hu/~reni/aszp/script/uj/sema/forma1_sema.pdf&lt;br /&gt;
* Oracle és MS SQL scriptek (&amp;lt;pre&amp;gt;CREATE TABLE&amp;lt;/pre&amp;gt; és &amp;lt;pre&amp;gt;INSERT&amp;lt;/pre&amp;gt;): https://avalon.aut.bme.hu/~reni/aszp/script.html&lt;br /&gt;
* Csatlakozás a tanszéki adatbázis szerverhez&lt;br /&gt;
** Csanás: egyetemi VPN-nel tavaly (2005-ben) el lehetett érni&lt;br /&gt;
** Chris: Oracle? szerver címe: deathstar.aut.bme.hu&lt;br /&gt;
&lt;br /&gt;
==Vizsga==&lt;br /&gt;
* 50 perc elmélet&lt;br /&gt;
** csak papírt használhatunk&lt;br /&gt;
** a feladat kidolgozásánál megválaszthatjuk a nyelvet&lt;br /&gt;
** példa elméleti kérdésre:&lt;br /&gt;
*** soroljunk fel 3 beépített csomagot&lt;br /&gt;
*** tranzakciók tulajdonságai (ACID)&lt;br /&gt;
** példa feladatra:&lt;br /&gt;
*** írjunk tárolt eljárást kivételkezeléssel&lt;br /&gt;
* 90 perc gyakorlat&lt;br /&gt;
** bármi használható (jegyzet, net, stb.)&lt;br /&gt;
** 4 feladat, 2 Oracle + 2 Microsoft SQL&lt;br /&gt;
** az egyik Oracle feladat biztosan egy csomag írása&lt;br /&gt;
** a megoldást emailben kell beküldeni		&lt;br /&gt;
* Elővizsga a 2006. tavaszi félévben utolsó héten pénteken. &lt;br /&gt;
&amp;lt;br/&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
-- [[PallosPeter|Peti]] - 2006.05.18.&lt;br /&gt;
&lt;br /&gt;
* {{InLineFileLink|Valaszthato|AdatbServerProg|000_elmeleti_kerdesek.rtf|000_elmeleti_kerdesek.rtf}}: Elméleti kérdések kidolgozása&lt;br /&gt;
&lt;br /&gt;
%META:FORM{name=&amp;quot;ValaszthatoForm&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Trgy&amp;quot; title=&amp;quot;Tárgy&amp;quot; value=&amp;quot;Adatbázisok szerver oldali programozása&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Trgykd&amp;quot; title=&amp;quot;Tárgykód&amp;quot; value=&amp;quot;VIAU9159&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Tanszk&amp;quot; title=&amp;quot;Tanszék&amp;quot; value=&amp;quot;AUT&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Elad&amp;quot; title=&amp;quot;Előadó&amp;quot; value=&amp;quot;Iváncsy Renáta&amp;amp;#44; Dr. Iváncsy Szabolcs&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Kreditszm&amp;quot; title=&amp;quot;Kreditszám&amp;quot; value=&amp;quot;5&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;raszm&amp;quot; title=&amp;quot;Óraszám&amp;quot; value=&amp;quot;4&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Flv&amp;quot; title=&amp;quot;Félév&amp;quot; value=&amp;quot;&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Terlet&amp;quot; title=&amp;quot;Terület&amp;quot; value=&amp;quot;Programozás&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;raijelenlt&amp;quot; title=&amp;quot;Órai jelenlét&amp;quot; value=&amp;quot;nem kötelező&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Jegy&amp;quot; title=&amp;quot;Jegy&amp;quot; value=&amp;quot;vizsga &amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Elvrtmin.munka&amp;quot; title=&amp;quot;Elvárt min. munka&amp;quot; value=&amp;quot;bejárás&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Minimumrajrjegy&amp;quot; title=&amp;quot;Minimumra járó jegy&amp;quot; value=&amp;quot;&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Elvrtmax.munka&amp;quot; title=&amp;quot;Elvárt max. munka&amp;quot; value=&amp;quot;kis utánaolvasás - kis munka&amp;quot;}%&lt;br /&gt;
%META:FIELD{name=&amp;quot;Munkrajrjegy&amp;quot; title=&amp;quot;Munkára járó jegy&amp;quot; value=&amp;quot;5&amp;quot;}%&lt;br /&gt;
&lt;br /&gt;
[[Category:Valaszthato]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060317&amp;diff=163810</id>
		<title>AdatbServerProgJegyzet20060317</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=AdatbServerProgJegyzet20060317&amp;diff=163810"/>
		<updated>2013-03-31T18:48:53Z</updated>

		<summary type="html">&lt;p&gt;2001:738:2001:2078:0:208:37:0: Átirányítás ide: Adatbázisok szerver oldali programozása&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adatbázisok_szerver_oldali_programozása]]&lt;/div&gt;</summary>
		<author><name>2001:738:2001:2078:0:208:37:0</name></author>
	</entry>
</feed>