<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s%2C_2006.03.31.</id>
	<title>Adatbázisok szerver oldali programozása Előadás, 2006.03.31. - Laptörténet</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/index.php?action=history&amp;feed=atom&amp;title=Adatb%C3%A1zisok_szerver_oldali_programoz%C3%A1sa_El%C5%91ad%C3%A1s%2C_2006.03.31."/>
	<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;action=history"/>
	<updated>2026-05-16T18:02:02Z</updated>
	<subtitle>Az oldal laptörténete a wikiben</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<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&amp;oldid=prev</id>
		<title>2001:738:2001:2078:0:208:37:0: Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060331}}  &lt;!--  * Set DENYTOPICVIEW = TWikiGuest --&gt;   &lt;style&gt;  	code.pre { white-space: pre; display: block; m…”</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&amp;oldid=prev"/>
		<updated>2013-03-31T19:03:21Z</updated>

		<summary type="html">&lt;p&gt;Új oldal, tartalma: „{{GlobalTemplate|Valaszthato|AdatbServerProgJegyzet20060331}}  &amp;lt;!--  * Set DENYTOPICVIEW = &lt;a href=&quot;/index.php?title=TWikiGuest&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;TWikiGuest (a lap nem létezik)&quot;&gt;TWikiGuest&lt;/a&gt; --&amp;gt;   &amp;lt;style&amp;gt;  	code.pre { white-space: pre; display: block; m…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Új lap&lt;/b&gt;&lt;/p&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;
&amp;#039;&amp;#039;&amp;#039;Csomag fejléc&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Csomag törzs&amp;#039;&amp;#039;&amp;#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=&amp;#039;jelszo&amp;#039; WHERE stud_id=&amp;#039;XSFXCF&amp;#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 ||| &amp;#039; &amp;#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, &amp;#039;nincs belépve&amp;#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(&amp;#039;XSFXCF&amp;#039;, &amp;#039;20012&amp;#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 ||| &amp;#039; &amp;#039; || message);&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
		userlogin.login(&amp;#039;XSFXCF&amp;#039;, &amp;#039;jelszo&amp;#039;);&lt;br /&gt;
		getcourses(&amp;#039;XSFXCF&amp;#039;, &amp;#039;20012&amp;#039;);&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
		userlogin.logout;&lt;br /&gt;
		getcourses(&amp;#039;XSFXCF&amp;#039;, &amp;#039;20012&amp;#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 ||| &amp;#039; &amp;#039; |||| tea_lname |||| &amp;#039; &amp;#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;
&amp;#039;&amp;#039;&amp;#039;Használat:&amp;#039;&amp;#039;&amp;#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(&amp;#039;AUT&amp;#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>
</feed>