„Informatikai technológiák laboratórium 1 - AUT 1. mérés: Adatbázis szerver oldali programozása” változatai közötti eltérés

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
(link, kép)
 
(6 közbenső módosítás, amit 3 másik szerkesztő végzett, nincs mutatva)
5. sor: 5. sor:
 
PL/SQL anonymous blokk szerkezete ([opcionális részek]):
 
PL/SQL anonymous blokk szerkezete ([opcionális részek]):
  
<pre>
+
<syntaxhighlight lang="sql">
 
[DECLARE]
 
[DECLARE]
 
BEGIN
 
BEGIN
11. sor: 11. sor:
 
[EXCEPTION]
 
[EXCEPTION]
 
END;
 
END;
</pre>
+
</syntaxhighlight>
  
 
Forrás: https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/05-Oracle%20Server%20programoz%C3%A1s.pdf, [http://i.imgur.com/RrF1RzC.png 32. dia]<br>
 
Forrás: https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/05-Oracle%20Server%20programoz%C3%A1s.pdf, [http://i.imgur.com/RrF1RzC.png 32. dia]<br>
18. sor: 18. sor:
 
==2. Hogyan lehet Oracle szerveren elkapni egy hibát?==
 
==2. Hogyan lehet Oracle szerveren elkapni egy hibát?==
  
<pre>
+
<syntaxhighlight lang="sql">
 
BEGIN
 
BEGIN
 
   utasítások_sorozata1;
 
   utasítások_sorozata1;
30. sor: 30. sor:
 
   utasítások_sorozata4;
 
   utasítások_sorozata4;
 
END;
 
END;
</pre>
+
</syntaxhighlight>
  
 
Forrás: https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/05-Oracle%20Server%20programozás.pdf, [http://i.imgur.com/QuiaamK.png 40. dia]<br>
 
Forrás: https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/05-Oracle%20Server%20programozás.pdf, [http://i.imgur.com/QuiaamK.png 40. dia]<br>
37. sor: 37. sor:
  
 
Példa:<br>
 
Példa:<br>
<pre>
+
<syntaxhighlight lang="sql">
 
exception
 
exception
 
   when no_data_found then
 
   when no_data_found then
 
     /* hibakezelés a no_data_found típusú hibára */
 
     /* hibakezelés a no_data_found típusú hibára */
</pre>
+
</syntaxhighlight>
  
 
==3. Hogyan kell alkalmazás hibát dobni Oracle szerveren?==
 
==3. Hogyan kell alkalmazás hibát dobni Oracle szerveren?==
47. sor: 47. sor:
 
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm#sthref2006
 
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm#sthref2006
  
<pre>
+
<syntaxhighlight lang="sql">
 
raise_application_error(-20001, 'hibauzenet');
 
raise_application_error(-20001, 'hibauzenet');
</pre>
+
</syntaxhighlight>
  
A függvény első paramétere a hibakód, negatív egész számnak kell lennie a -20000..-20999 tartományban.
+
A függvény első paramétere a hibakód, negatív egész számnak kell lennie a -20000..-20999 tartományban. A második paraméter egy karaktersorozat, 2048 byte hosszúságig.
 +
(Egyébként van egy opcionális harmadik paraméter is, ami TRUE vagy FALSE lehet, alapértelmezett értéke FALSE. Ha ez az érték TRUE, akkor a hiba a stackbe kerül, ha FALSE, akkor a hiba minden korábbi hibát felülír.)
  
 
==4. Hogyan kell alkalmazás hibát dobni SQL Serveren?==
 
==4. Hogyan kell alkalmazás hibát dobni SQL Serveren?==
  
http://technet.microsoft.com/en-us/library/ms178592.aspx
+
* <code>sys.messages</code> táblában lévő előre definiált hibák küldése
 +
* Egyedi hibák
 +
*: <code>RAISERROR ( { msg_id | msg_str } , severity, state [, argument [, ... n ] ] )</code>
 +
** Severity
 +
*** 0…18: Felhasználói
 +
*** 19…25: csak sysadmin generálhatja
 +
*** 20…25: súlyos hiba, kapcsolatot is lezárja
 +
** State
 +
*** Több helyről küldhetjük ugyanazt a hibát
 +
*** Helyek azonosítása
 +
*** 1…127
  
 
+
Konkrétan:
<pre>
+
<syntaxhighlight lang="sql">
 
raiserror('hibauzenet', 16, 1)
 
raiserror('hibauzenet', 16, 1)
 
raiserror('hibauzenet2, valami szam: %d', 16, 1, 1234)
 
raiserror('hibauzenet2, valami szam: %d', 16, 1, 1234)
</pre>
+
</syntaxhighlight>
  
 
A függvény neve '''raiserror''' (egy &#8222;e&#8221;-vel), nem raiseerror! Hasonlít a C nyelv printf-jére, itt is adhatunk meg az üzenetbe behelyettesítendő paramétereket (a fenti példában ez a második sorban az 1234). A hibaüzenet utáni első paraméter a severity (súlyosság), értéke: 1-10 között csak hibaüzenet, de megy tovább a program; 11-19 között ha try blokkban keletkezik a hiba, akkor a catch-részbe ugrik a vezérlés, tehát ez már tényleg kivételt dob. A második paraméter a state (állapot), az itt megadott értéket adja vissza az error_state() függvény. Értékkészlete: 1-127. Minden raiserror-nál, ami ugyanolyan hibára vonatkozik, adjunk más értéket a state-nek, mert így könnyebb megtalálni, melyik raiserror dobta a hibát.
 
A függvény neve '''raiserror''' (egy &#8222;e&#8221;-vel), nem raiseerror! Hasonlít a C nyelv printf-jére, itt is adhatunk meg az üzenetbe behelyettesítendő paramétereket (a fenti példában ez a második sorban az 1234). A hibaüzenet utáni első paraméter a severity (súlyosság), értéke: 1-10 között csak hibaüzenet, de megy tovább a program; 11-19 között ha try blokkban keletkezik a hiba, akkor a catch-részbe ugrik a vezérlés, tehát ez már tényleg kivételt dob. A második paraméter a state (állapot), az itt megadott értéket adja vissza az error_state() függvény. Értékkészlete: 1-127. Minden raiserror-nál, ami ugyanolyan hibára vonatkozik, adjunk más értéket a state-nek, mert így könnyebb megtalálni, melyik raiserror dobta a hibát.
 +
 +
Források:
 +
* http://technet.microsoft.com/en-us/library/ms178592.aspx
 +
* https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/06-MS%20SQL%20Server%20programoz%C3%A1s.pdf, [http://i.imgur.com/U0Pt7Xc.png 22. dia]
  
 
==5. Hogyan kell tárolt eljárást létrehozni Oracle szerveren?==
 
==5. Hogyan kell tárolt eljárást létrehozni Oracle szerveren?==
70. sor: 85. sor:
  
  
<pre>
+
<syntaxhighlight lang="sql">
 
create or replace procedure eljaras_neve
 
create or replace procedure eljaras_neve
 
(param1_bementi in varchar2, param2_kimeneti out varchar2)
 
(param1_bementi in varchar2, param2_kimeneti out varchar2)
80. sor: 95. sor:
 
   tárolt eljárás kódja
 
   tárolt eljárás kódja
 
end eljaras_neve;
 
end eljaras_neve;
</pre>
+
</syntaxhighlight>
  
 
==6. Hogyan kell tárolt eljárást létrehozni SQL Serveren?==
 
==6. Hogyan kell tárolt eljárást létrehozni SQL Serveren?==
  
MS SQL 2000: http://msdn.microsoft.com/en-us/library/aa258259(SQL.80).aspx
+
* MS SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa258259(SQL.80).aspx
 
+
* MS SQL Server 2005: http://msdn.microsoft.com/en-us/library/ms187926%28SQL.90%29.aspx
MS SQL 2005: http://msdn.microsoft.com/en-us/library/ms187926%28SQL.90%29.aspx
+
* MS SQL Server 2012: http://msdn.microsoft.com/en-us/library/ms187926(v=sql.110).aspx
 
+
* https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/06-MS%20SQL%20Server%20programoz%C3%A1s.pdf, 34. dia
  
<pre>
+
<syntaxhighlight lang="sql">
create procedure eljarars_neve
+
CREATE PROCEDURE eljaras_neve
@param1 nvarchar(50),
+
  @param1 nvarchar(50),
@param2 float,
+
  @param2 float,
@param3 int
+
  @param3 int
as
+
AS
   tárolt eljárás kódja
+
   sql_utasítások
</pre>
+
</syntaxhighlight>
  
 
==7. Definiáld a trigger fogalmát!==
 
==7. Definiáld a trigger fogalmát!==
117. sor: 132. sor:
 
==9. Csoportosítsd a DML triggereket Oracle szerveren (esemény, objektum, időbeliség)!==
 
==9. Csoportosítsd a DML triggereket Oracle szerveren (esemény, objektum, időbeliség)!==
  
 +
Objektum:
 
ON table_name
 
ON table_name
  
 +
Időbeliség:
 
BEFORE, AFTER
 
BEFORE, AFTER
  
 +
Esemény:
 
INSERT, UPDATE, DELETE
 
INSERT, UPDATE, DELETE
  
138. sor: 156. sor:
  
 
'''Általános Oracle szintaktika:'''
 
'''Általános Oracle szintaktika:'''
<pre>
+
<syntaxhighlight lang="sql">
 
create or replace trigger trignev
 
create or replace trigger trignev
 
{before|after} {insert or update or delete}
 
{before|after} {insert or update or delete}
148. sor: 166. sor:
 
   where sorszam = 1;
 
   where sorszam = 1;
 
end
 
end
</pre>
+
</syntaxhighlight>
  
 
==10. Csoportosítsd a DML triggereket SQL Serveren (esemény, objektum, időbeliség)!==
 
==10. Csoportosítsd a DML triggereket SQL Serveren (esemény, objektum, időbeliség)!==
155. sor: 173. sor:
 
ON { table | view }
 
ON { table | view }
  
 +
Időbeliség:
 
FOR, AFTER, INSTEAD OF
 
FOR, AFTER, INSTEAD OF
  
161. sor: 180. sor:
  
 
'''Általános MS SQL szintaktika:'''
 
'''Általános MS SQL szintaktika:'''
<pre>
+
<syntaxhighlight lang="sql">
 
create trigger
 
create trigger
 
on {tablanev|nezetnev}
 
on {tablanev|nezetnev}
167. sor: 186. sor:
 
as
 
as
 
   if columns_updated() begin ... end
 
   if columns_updated() begin ... end
</pre>
+
</syntaxhighlight>
  
 
-- [[PallosTamas|Velias]] - 2009.02.22.
 
-- [[PallosTamas|Velias]] - 2009.02.22.

A lap jelenlegi, 2016. március 20., 21:37-kori változata

← Vissza az előző oldalra – Informatikai technológiák laboratórium 1

1. Add meg az Oracle anonim blokk szerkezetét, jelöld be az opcionális részeket!

PL/SQL anonymous blokk szerkezete ([opcionális részek]):

[DECLARE]
BEGIN
  --statements
[EXCEPTION]
END;

Forrás: https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/05-Oracle%20Server%20programoz%C3%A1s.pdf, 32. dia
Bővebben: http://psoug.org/reference/anonymous_blocks.html

2. Hogyan lehet Oracle szerveren elkapni egy hibát?

BEGIN
  utasítások_sorozata1;
EXCEPTION
WHEN kivétel_név1 THEN
  utasítások_sorozata2;
WHEN kivétel_név2 THEN
  utasítások_sorozata3;
...
WHEN OTHERS THEN
  utasítások_sorozata4;
END;

Forrás: https://www.aut.bme.hu/Upload/Course/VIAUA369/hallgatoi_jegyzetek/05-Oracle%20Server%20programozás.pdf, 40. dia
Bővebben: http://psoug.org/reference/exception_handling.html
http://www.techonthenet.com/oracle/exceptions/when_others.php

Példa:

exception
  when no_data_found then
    /* hibakezelés a no_data_found típusú hibára */

3. Hogyan kell alkalmazás hibát dobni Oracle szerveren?

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm#sthref2006

raise_application_error(-20001, 'hibauzenet');

A függvény első paramétere a hibakód, negatív egész számnak kell lennie a -20000..-20999 tartományban. A második paraméter egy karaktersorozat, 2048 byte hosszúságig. (Egyébként van egy opcionális harmadik paraméter is, ami TRUE vagy FALSE lehet, alapértelmezett értéke FALSE. Ha ez az érték TRUE, akkor a hiba a stackbe kerül, ha FALSE, akkor a hiba minden korábbi hibát felülír.)

4. Hogyan kell alkalmazás hibát dobni SQL Serveren?

  • sys.messages táblában lévő előre definiált hibák küldése
  • Egyedi hibák
    RAISERROR ( { msg_id | msg_str } , severity, state [, argument [, ... n ] ] )
    • Severity
      • 0…18: Felhasználói
      • 19…25: csak sysadmin generálhatja
      • 20…25: súlyos hiba, kapcsolatot is lezárja
    • State
      • Több helyről küldhetjük ugyanazt a hibát
      • Helyek azonosítása
      • 1…127

Konkrétan:

raiserror('hibauzenet', 16, 1)
raiserror('hibauzenet2, valami szam: %d', 16, 1, 1234)

A függvény neve raiserror (egy „e”-vel), nem raiseerror! Hasonlít a C nyelv printf-jére, itt is adhatunk meg az üzenetbe behelyettesítendő paramétereket (a fenti példában ez a második sorban az 1234). A hibaüzenet utáni első paraméter a severity (súlyosság), értéke: 1-10 között csak hibaüzenet, de megy tovább a program; 11-19 között ha try blokkban keletkezik a hiba, akkor a catch-részbe ugrik a vezérlés, tehát ez már tényleg kivételt dob. A második paraméter a state (állapot), az itt megadott értéket adja vissza az error_state() függvény. Értékkészlete: 1-127. Minden raiserror-nál, ami ugyanolyan hibára vonatkozik, adjunk más értéket a state-nek, mert így könnyebb megtalálni, melyik raiserror dobta a hibát.

Források:

5. Hogyan kell tárolt eljárást létrehozni Oracle szerveren?

http://www.techonthenet.com/oracle/procedures.php


create or replace procedure eljaras_neve
(param1_bementi in varchar2, param2_kimeneti out varchar2)
is
  /* változók */
  valtozo1 number;
  valtozo2 int;
begin
  tárolt eljárás kódja
end eljaras_neve;

6. Hogyan kell tárolt eljárást létrehozni SQL Serveren?

CREATE PROCEDURE eljaras_neve
  @param1 nvarchar(50),
  @param2 float,
  @param3 int
AS
  sql_utasítások

7. Definiáld a trigger fogalmát!

A triggerek olyan speciális procedúrák egy adatbázisban, amelyek különböző eseményekhez köthetőek. DML Események: INSERT, UPDATE, DELETE. DDL trigger események pl. a CREATE, ALTER, DROP. Továbbá lehetnek rendszeresemények (Logon, Logoff stb.) is. Céljuk pl.:

  • Eseménykezelő tárolt eljárás
  • Származtatott értékek karbantartása
  • Naplózás
  • Statisztikák gyűjtése
  • Szerverek közti referenciális integritás

8. Adj meg 3 tipikus feladatot, aminek elvégzésére triggert szoktak írni!

  • Módosítások feltételhez kötése
  • Módosítások auditálása
  • Hozzáférés korlátozása
  • Redundáns mező értékének kiszámolása (konzisztencia megőrzése)

9. Csoportosítsd a DML triggereket Oracle szerveren (esemény, objektum, időbeliség)!

Objektum: ON table_name

Időbeliség: BEFORE, AFTER

Esemény: INSERT, UPDATE, DELETE

DML események

  • insert, update, delete
  • Táblához kötődik

objektumok

  • utasítás szintű
  • sor szintű

ütemezés

  1. utasítás előtti (utasítás szintű)
    1. sor módosítás előtti (sor szintű)
    2. adatmódosítás
    3. sor módisítás utána
    4. (minden sorra ez a 3)
  2. utasítás utána

Általános Oracle szintaktika:

create or replace trigger trignev
{before|after} {insert or update or delete}
on tablanev
[for each row]
[when feltétel]
begin
  update tábla set nev = :new.nev
  where sorszam = 1;
end

10. Csoportosítsd a DML triggereket SQL Serveren (esemény, objektum, időbeliség)!

Objektum: ON { table | view }

Időbeliség: FOR, AFTER, INSTEAD OF

Esemény: INSERT, UPDATE, DELETE

Általános MS SQL szintaktika:

create trigger
on {tablanev|nezetnev}
{for|after|instead of} {insert,update,delete}
as
  if columns_updated() begin ... end

-- Velias - 2009.02.22. -- FlamichTamas - 2009.03.29. -- tsw - 2009.03.29. -- FaPe - 2009.04.07. -- RudolfKing - 2011.03.21. -- Buj - 2012.03.27.