9.GYAKORLAT (ADATBÁZISOK)
9.-10.-11.gyakorlatok témaköre: Oracle
PL/SQL
Az Oracle PL/SQL-hez az alábbi informatikai
alapismeretekre van szükség:
- a szabvány SQL és az Oracle SQL
ismerete, sqldeveloper használata,
- az eljárásorientált
és az objektumorientált programozási
nyelvek alap-
eszközeinek fogalmi szintű ismerete,
- programozási gyakorlat
(például C, C++ vagy Java)
programozási nyelven.
Áttekintés - PL/SQL
gyakorlatok
témakörei:
--- 09.gyakorlat (Oracle DB PL/SQL Lang.Ref. 1-5.fej)
1.1. PROGRAMEGYSÉGEK: BLOKK, [TÁROLT] ALPROGRAMOK
1.2. PROGRAMOK TESZTELÉSE,
ELJÁRÁSHÍVÁS,
FÜGGVÉNYHÍVÁS
I/O: DBMS_OUTPUT CSOMAG
PUT_LINE ELJÁRÁS HASZNÁLATA
DBMS_RANDOM CSOMAG VALUE
FÜGGVÉNY HASZNÁLATA
1.3. BLOKK-1 DEKLARÁCIÓS RÉSZ-1:
VÁLTOZÓK DEKLARÁLÁSA
BLOKK-2 VÉGREHAJTHATÓ RÉSZ-1:
ÉRTÉKADÁS, SELECT INTO
1.4. BLOKK-1 DEKLARÁCIÓS RÉSZ-2:
ALPROGRAMOK DEKLARÁLÁSA
BLOKK-2 VÉGREHAJTHATÓ RÉSZ-2:
VEZÉRLŐ UTASÍTÁSOK
1.5. KÜLSŐ ÉS BELSŐ VÁLTOZÓK HASZNÁLATA
--- 10.gyakorlat (Oracle DB PL/SQL Lang.Ref. 6.fej )
2.1. VÉGREHAJTHATÓ RÉSZ-3: SQL DML
ÉS TRANZ.KEZ. UTASÍTÁSOK
2.2. KURZOROK ÁTEKINTÉSE, IMPLICIT ÉS EXPLICIT KURZOROK
2.3. A LEKÉRDEZÉS EREDMÉNYHALMAZAINAK FELDOLGOZÁSA
2.4. KURZOR-VÁLTOZÓK,
KURZOR-ATTRIBÚTUMOK, KIFEJEZÉSEK
2.5. FOR UPDATE MÓDOSÍTHATÓ KURZOROK
--- 11.gyakorlat (Oracle DB PL/SQL Lang.Ref. 8-11.fej)
3.1. BLOKK-3 HIBA- ÉS KIVÉTELKEZELŐ
RÉSZ
3.2. TÁROLT ALPROGRAMOK
3.3. CSOMAGOK
3.4. TRIGGEREK
3.5. A REKURZÍV ELJUT FELADAT PL/SQL PROGRAMMAL
- PL/SQL
elsajátításához segédletek:
Az egyetlen megengedett
segédlet, amit a ZH írás alatt
használhatunk:
PL/SQL
doksi: Oracle
Database Rel.12.2 - PL/SQL
Language Reference
>> a
doksiból nézünk példákat:
List
of Examples (PL/SQL Lang.Ref.12.2)
- További
segédanyagok a PL/SQL
feldolgozásához:
>> SQL/PSM, PL/SQL: 08.adatb.ea.pdf
(korábbi BSc-2008 AB1EA/HajasCs.)
>> Oracle
PL/SQL: Oracle
Junior EA
>> Oracle
PL/SQL.pdf
>> Oracle PL/SQL
segédanyagok: eduPLSQL
mappában => innen lásd
például:
>> plsql_progr.pdf
-- Forrás Tankönyvtár: PL/SQL
programozás Oracle-ben
1.1. PROGRAMEGYSÉGEK:
BLOKK, [TÁROLT] ALPROGRAMOK
- blokk, alprogram (eljárás,
függvény)
- tárolt eljárás,
tárolt
függvény
- csomagok
-- -- -- -- -- --
-- PL/SQL blokk felépítése
[<< label >> -- (címke,
opcionális) ]
[DECLARE --
(BLOKK-1 Deklarációs rész,
opcionális)
-- változók, alprogramok
deklarálása ]
BEGIN --
(BLOKK-2 Végrehajtható rész,
kötelező)
-- végrehajtható
utasítások, például van
NULL;
[EXCEPTION -- (BLOKK-3 Kivételkezelő rész,
opcionális
-- hiba- és kivételkezelés
(lásd később 11.gyak) ]
END;
/
-- Blokk típusok
a.) Névtelen blokk
[DECLARE]
BEGIN
-- végrehajtható
utasítások;
[EXCEPTION]
END;
b.) Procedure/Eljárás
[CREATE OR REPLACE] PROCEDURE név
IS
BEGIN
-- végrehajtható
utasítások;
[EXCEPTION]
END;
c.) Function/Függvény
[CREATE OR REPLACE] FUNCTION név
RETURN adattípus
IS
BEGIN
-- végrehajtható
utasítások;
RETURN érték;
[EXCEPTION]
END;
-- -- -- -- -- -- részletek később lesz a
11.gyakorlaton
PL/SQL eljárások
és
függvények: 8.fej.
PL/SQL Alprogramok
>> 8.1.
Alprogramokról áttekintés:
Miért van szükség alprogramokra,
előnyök
-- Példák
procedurákra/függvényekre: pl-proc-fv.txt
további példák később...
>> példa2-17
Változók hatásköre,
láthatósága, élettartalma
(2.fej. Alapok)
>> példa4-1
Megnézzük az IF-THEN
utasításnál az
eljárást (4.fej.
Utasítások)
>> 8.5.fej.
Példák példa8-1
PL/SQL eljárásra és példa8-2
PL/SQL függvényre
>>
8.7.fej. Paraméterátadás; 8.9.fej.Túlterhelés
példa8-26
túlterhelésre példa
1.2. PROGRAMOK TESZTELÉSE,
ELJÁRÁSHÍVÁS,
FÜGGVÉNYHÍVÁS
a.) ELJÁRÁSHÍVÁS:
I/O: DBMS_OUTPUT
CSOMAG PUT_LINE
ELJÁRÁS HASZNÁLATA
- Input/Output PL/SQL-ben nincs I/O
utasítás, általában a be-
és kimenet (I/O)
SQL utasításokkal
történik, az
adatokat az adatbázis tábláiban
tároljuk,
és
ott módosítjuk vagy onnan
lekérdezzük ezeket a
táblákat.
- Minden más PL/SQL I/O pl. képernyőre
való
kíiírás az Oracle Database
által
biztosított PL/SQL csomagokkal
történik.
- DBMS_OUTPUT csomag link: DBMS_OUTPUT.html (PL/SQL
Packages)
DBMS_OUTPUT.PUT_LINE (item IN VARCHAR2)
eljárásra példa:
-- Tesztelés:
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('Szia Világ!');
END;
/
- PL/SQL feladat: Írjuk át a
fenti programot: Szia ....! (nevet bekérni) ehhez:
- Ismétlés: Felhasználói
változó,
Példatár 4.fej.pdf
(Interaktív környezet)
>> innen
felhasználói
(helyettesítő változók
használata SQL
utasításokban
volt 7.gyak.
INSERT 2.feladatát, de most
bekérjük az új sorhoz az
értékeket,
&dkod
(numerikus), '&dnev'
(karaktersorozat) típusú helyettesítő
változókba.
b.) FÜGGVÉNYHÍVÁS:
DBMS_RANDOM CSOMAG VALUE
FÜGGVÉNY HASZNÁLATA
- DBMS_RANDOM csomag link: DBMS_RANDOM.html (PL/SQL
Packages)
DBMS_RANDOM.VALUE(AlsóHatár,
FelsőHatár) függvény
használata.
-- Tesztelés:
SELECT DBMS_RANDOM.VALUE(0, 10000) from dual;
- SQL DDL feladat: 8.gyak.
Készítsünk
egy
dolg3
nevű nézettáblát
a dolgozo
tábla (dkod, dnev,
fizetes, jutalek) oszlopaihoz vegyünk fel
egy új nyeremény
nevű oszlopot, amit úgy töltsünk fel
adatokkal, hogy
0
és 10000
közötti véletlen egész
számot százasokra kerekítve adjunk
hozzá a jutalékhoz, ha a
jutalék ismeretlen, akkor tekintsük 0
értéknek.
1.3. BLOKK-1 DEKLARÁCIÓS
RÉSZ-1:
VÁLTOZÓK DEKLARÁLÁSA
BLOKK-2 VÉGREHAJTHATÓ RÉSZ-1:
ÉRTÉKADÁS, SELECT INTO
PL/SQL
alapok, PL/SQL
blokk >> 2.fej.
PL/SQL alapok -> 2.6.rész
[1_deklarációs_rész] 2_végrehajtható_rész [3_kivételkezelő_rész]
SET SERVEROUTPUT ON;
>> példa-2-24
deklarációk-és-értékadás,
típusok, %TYPE, %ROWTYPE
-- Az itt szereplő
példák
kipróbálásához hozzunk
létre
szinonimákat:
create or replace synonym
departments for hr.departments;
create or replace synonym
employees for hr.employees;
--
Egészítsük ki:
például legyen DATE típusú
változó is,
illetve
nézzünk
%TYPE és
%ROWTYPE használatára további
példákat!
[ opcionális,
részletek: 3.fej. PL/SQL adattípusok,
[ 5.fej. Kollekciók ]]
>> példa-2-25
Értékadás
változónak a SELECT INTO
utasítással
-- Itt
a 2-25
példa futtatásához át kell
tenni az end;-et
a legvégére!
SELECT
INTO-t akkor használjuk, ha a
lekérdezés pontosan egy sort
ad! Ha a
lekérdezés
nem ad vissza sort vagy több sorral tér
vissza,
akkor kurzort kell
használni, ez lesz a köv.10.gyakorlat
tananyaga,
illetve a
11.gyakorlaton a
hiba- és kivételkezelésnél
is visszatérünk!
1.4. BLOKK-1 DEKLARÁCIÓS
RÉSZ-2: ALPROGRAMOK DEKLARÁLÁSA
BLOKK-2 VÉGREHAJTHATÓ RÉSZ-2:
VEZÉRLŐ UTASÍTÁSOK
Feltételes
utasítások,
ciklusok >> 4.fej.
PL/SQL vezérlő utasítások
>> példa-4-4 if-then-elsif
utasítás
!!! Ebben a
példában
figyeljük meg a deklarációs
részben az
eljárást,
írjuk
át az itt szereplő eljárást CREATE OR
REPLACE PROCEDURE-re!
>> példa-4-6
egyszerű case utasítás, és itt
írjuk át grade
:= 'B' ->
'&B'
írjuk át
helyettesítési
változóra: a
felhasználó adja meg az
értékét!
>> példa-4-10
alap LOOP ciklus utasítás EXIT WHEN
kilépés a ciklusból
>> példa-4-15
FOR ciklus utasítás
>> példa-4-28
WHILE ciklus utasítás
1.5. KÜLSŐ ÉS BELSŐ VÁLTOZÓK HASZNÁLATA
Változóhasználat, vezérlési szerkezetek a PL/SQL-ben: Példatár 8.fej.pdf
>> innen egy példa: 1a_valtozok_pelda_Oracle_Peldatar_8fej.txt
PL/SQL
FELADATSOR --1
--
A
DBMS_OUTPUT.PUT_LINE() képernyőre való
kiíráshoz állítsuk
be:
SET SERVEROUTPUT ON
-- -- -- --
-- 1.)
/* Az első
feladat képernyőre
kiírás: Írjuk ki PL/SQL
blokkból: 'Szia Világ!'
*/
-- -- -- --
-- 2.)
/* Írjuk ki KING
fizetését és
jutalékát
(olvasás táblából
változókba), ha
ismert,
hogy pontosan egy
KING nevű dolgozó szerepel a
táblában (SELECT INTO).
SELECT INTO csak
akkor működik, ha a
lekérdezés pontosan egy sort
ad,
erre a feladatra
visszatérünk a 11.gyakorlaton a
hiba- és kivételkezelésnél.
*/
-- -- -- --
-- 3.)
/* Írjunk meg egy függvényt, amelyik
eldönti
egy számról, hogy prím-e.
igen/nem
-> 1/0 értékeket adja vissza a
függvény
*/
CREATE OR REPLACE FUNCTION prim(n integer) RETURN number IS
-- Tesztelés:
SELECT prim(101) from dual;
SELECT prim(108) from dual;
SELECT prim(26388279066623) from dual;
-- -- -- --
-- 4.)
/* Írjunk meg egy procedúrát, amelyik
kiírja az n-edik Fibonacchi számot
fib_1 = 0, fib_2 = 1, fib_3 = 1, fib_4
= 2, . . .
fib_i = a megelőző kettő
összege
*/
CREATE OR REPLACE PROCEDURE fib(n integer) IS
-- Tesztelés:
SET SERVEROUTPUT ON
BEGIN
fib(10);
END;
/
-- vagy lehet így is
set serveroutput on
execute fib(10);
-- -- -- --
-- 5.)
/* Írjunk meg egy függvényt, amelyik
visszaadja
két szám legnagyobb közös
osztóját
*/
CREATE OR REPLACE FUNCTION lnko(p1 integer, p2 integer) RETURN number IS
-- Tesztelés:
SELECT lnko(3570,7293) FROM dual;
-- -- -- --
-- 6.)
/* Írjunk meg egy függvényt, amelyik
visszaadja n faktoriálisát
*/
CREATE OR REPLACE FUNCTION faktor(n integer) RETURN integer IS
-- Tesztelés:
SELECT faktor(10) FROM dual;
-- -- -- --
-- 7.)
/* Írjunk meg egy függvényt, amelyik
megadja, hogy hányszor fordul elő
egy karakterláncban
-> p1 egy
másik részkarakterlánc -> p2
*/
CREATE OR REPLACE FUNCTION hanyszor(p1 VARCHAR2, p2 VARCHAR2) RETURN
integer IS
-- Tesztelés:
SELECT hanyszor ('ab c ab ab de ab fg', 'ab') FROM dual;
-- -- -- --
-- 8.)
/* Írjunk meg egy függvényt, amelyik
visszaadja a paraméterként szereplő '+'-szal
elválasztott számok
összegét.
*/
CREATE OR REPLACE FUNCTION osszeg(p_char VARCHAR2) RETURN number IS
-- Tesztelés:
SELECT osszeg('1 + 4 + 13 + -1 + 0') FROM dual;
GYAKORLÁS:
Fejezze be önállóan
a fenti
feladatokból a hiányzó feladatokat,
és gyakoroljon
oldja meg önállóan
az Oracle
Példatár Feladatok.pdf
8.fejezet 8.1-8.9.feladatait!
[Megjegyzés: Az Oracle
Példatár ezeket a táblákat
használja: cr_dept_emp.txt
az emp és dept
táblák helyett használjuk itt is a dolgozo,
osztaly tábláinkat!]