10.GYAKORLAT (ADATBÁZISOK)
Témakör: Oracle PL/SQL
témakör - 2.gyakorlata: Oracle
Példatár 9.fej.pdf
SQL DML utasítások PL/SQL programban, kurzorok, kurzorattribútumok
- 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
2.rész: DML utasítások programban, kurzorok
>> 6.fej.
Static SQL/Cursors
-- Ismétlés: 1-2.feladatok, 9.gyakorlatról, lásd példa-2-25 2.6.2 SELECT INTO
>> példa-6-1
6.1.1 DML és TCL utasítások a programban, implicit
kurzor
>> példa-6-4
6.2.1.4 Implicit kurzor attribútumok SQL%ROWCOUNT
>> példa-6-6
6.2.2.3 Fetching, explicit kurzorok deklarálása
és használata
>> példa-6-11 6.2.2.6 Paraméteres explicit kurzorok
>> példa-6-17
6.2.2.7.4 Explicit kurzor attribútumok, c%ROWCOUNT
>> példa-6-18-példa-6-20 6.3.2. FOR LOOP utasítás Implicit kurzor, Explicit kurzor
>> példa-6-41
6.6.6.3 FOR UPDATE
kurzor módosításhoz -
hibák javítása:
-- Ne adjon ki COMMIT
utasítást a FOR UPDATE
módosításra megnyitott
kurzor
lekérdezési ciklusán belül,
mert a ciklus második
lépésében a
FETCH nem
működik olyan kurzorra, amely már nem
érvényes (hiba).
--
Módosítható kurzort
használjunk, ha a sorok értékeit
módosítani vagy
a sorokat
törölni szeretnénk, ekkor
a kurzorban a FOR UPDATE
záredékot használjunk.
Módosítás esetén a FETCH
által utoljára lehívott,
azaz
aktuális sor azonosítása a CURRENT
OF
kurzor záradékkal történik.
-- A végén
zárja be a
kurzort. (Javítsuk ki a fenti hibákat,
próbáljuk ki.)
-- Figyelem! Ennek a
demó
példa lefuttatásánál a
PL/SQL blokk előtti
drop
table emp; create table emp as select * from hr.employees;
felülírja
az Oracle Példatár feladatainál
használt korábbi emp
táblát,
-- ezért emp
helyett emp_temp táblát célszerűbb
használjunk, vagy utána
az Oracle Példatár
feladataihoz: cr_dept_emp.txt
scriptet újra lefuttatjuk.
[Megj.: A
feladatsorban viszont
a korábbi táblákban
dolgozunk: createDolg]
PL/SQL
FELADATSOR --2:
-- A feladatokat most is a
saját
Dolgozo-Osztaly táblákra kell
megírni, ehhez
a
táblákat létrehozó script,
mint a DML-hez volt: createDolg
(no
constraint)
-- A képernyőre való kiíráshoz a
DBMS_OUTPUT.PUT_LINE() használatához,
a PL/SQL blokk előtt állítsuk be: SET SERVEROUTPUT ON
-- -- -- --
-- 1.)
/* SELECT ... INTO v1
Írjunk meg egy függvényt, amelyik visszaadja egy
adott fizetési kategóriába tartozó
dolgozók átlagfizetését, lásd példa-2-25 2.6.2 SELECT INTO
*/
CREATE OR REPLACE FUNCTION kat_atlag(n integer) RETURN number IS
Tesztelés:
SELECT kat_atlag(2) FROM dual;
-- -- -- --
-- 2.)
/* SELECT ... INTO v1, v2
Írjunk meg egy procedúrát, amelyik kiírja
azon dolgozók számát és
átlagfizetését,
akiknek a belépési dátuma a paraméterül megadott nevű napon (pl. 'Hétfő') volt.
*/
CREATE OR REPLACE PROCEDURE nap_atl(d varchar2) IS
...
set serveroutput on
call nap_atl('Csütörtök'); -- példa output: Dolgozók száma: 4, Átlag fiz: 2481,25
Tippek:
1. to_char(hiredate, 'Day', 'nls_date_language=hungarian')
2. vigyázzunk a to_char által visszaadott nap
névre, a végén szóközök lehetnek
-- -- -- --
-- 3.)
/* Insert, Delete, Update
Adjuk meg egy főnök
azonosítóját, és
töröljük a
közvetlen beosztottjait, és
írassuk ki hány beosztottja volt,
lásd példa-6-4 implicit kurzor attribútumok.
-- -- --
--4.)
/* Insert, Delete, Update
Írjunk meg egy procedúrát, amelyik megnöveli
azoknak a dolgozóknak a fizetését,
akiknek a fizetési kategóriája ugyanaz, mint a
procedúra paramétere.
A növelés
mértéke a dolgozó osztályában előforduló legkisebb fizetés legyen.
A procedúra a módosítás után
írja ki a módosított (új) fizetések
átlagát
két tizedesjegyre kerekítve.
*/
CREATE OR REPLACE PROCEDURE kat_novel(p_kategoria NUMBER) IS
...
set serveroutput on
execute kat_novel(2);
-- -- -- --
-- 5.)
/* Cursor, több
sort
visszaadó
lekérdezés, kurzor
használata, lásd példa-6-6
Írjuk ki a dolgozók
nevét
és fizetését!
*/
-- -- -- --
-- 6.)
/* Cursor, több soros select, kurzor attribútumok, lásd példa-6-17
Írjuk ki a 3. 5.
és 8. legnagyobb
fizetésű dolgozó nevét,
fizetését!
*/
-- -- -- --
-- 7.)
/* Cursor, több soros select, felh.változók: &num_valt,
'&char_valt'
Írjuk ki azon
dolgozók nevét
és fizetését, akik fizetése
nagyobb mint
egy olyan
szám, amelyet a
felhasználó fog majd futás
közben megadni!
*/
-- -- -- --
-- 8.)
/* Cursor, több soros select, felh.változók: &num_valt,
'&char_valt'
Írjuk ki azon
dolgozók nevét,
fizetését és
osztálykódját, akik a
felhasználó által
megadott
osztályon dolgoznak! A felhasználó
által
megadott betű legyen A, R, S,
vagyis az onev (Accounting,
...) kezdőbetűje a 10, 20,
30-as
osztály esetén.
*/
-- -- -- --
-- 9.)
/* Cursor, több soros select, paraméteres kurzor, lásd példa-6-11
Írjunk meg egy procedúrát, amelyik veszi a
paraméterül megadott osztály dolgozóit
ábécé szerinti sorrendben, és kiírja
a foglalkozásaikat egy karakterláncban összefűzve.
*/
CREATE OR REPLACE PROCEDURE print_foglalkozas(o_nev varchar2) IS
...
set serveroutput on
call print_foglalkozas('ACCOUNTING');
-- példa output: MANAGER-PRESIDENT-CLERK
-- -- -- --
-- 10.)
/* Az előző feladatot most függvényként írjuk meg, majd hívjuk meg a beadandóhoz.
Írjunk meg egy függvényt, amelyik veszi a paraméterül megadott osztály dolgozóit
ábécé szerinti sorrendben, és visszaadja a foglalkozásaikat egy karakterláncban
összefűzve.
*/
CREATE OR REPLACE FUNCTION get_foglalkozas(o_nev varchar2) RETURN varchar2 IS
...
SELECT get_foglalkozas('ACCOUNTING') FROM dual;
-- példa output: MANAGER-PRESIDENT-CLERK
További PL/SQL gyakorló feladatok az Oracle Példatárból
Fejezze be önállóan a fenti
feladatokból a hiányzó feladatokat, a köv.gyakorlaton
folytatjuk az Oracle
Példatár Feladatok.pdf
9.fejezet feladatait a köv.órán folytatjuk.
[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 a korábbi dolgozo, osztaly tábláinkat!]
+1.) 9.3. Feladat: Hozzunk létre a
dolgozo táblából egy dolg_temp
táblát, majd
írjunk PL/SQL programot,
amely megnöveli ebben a felhasználó által
megadott
foglalkozású dolgozók fizetését 1000 USD-ral.
+2.) 9.5. Feladat: Hozzunk létre a dolgozo
táblából egy dolg_temp táblát, majd
írjunk PL/SQL programot,
amely megnöveli ebben a felhasználó által
megadott
százalékértékkel minden, az
átlagfizetésnél alacsonyabb fizetéssel
rendelkező
dolgozó fizetését.
+3.) 9.6. Feladat: Hozzunk létre a dolgozo
táblából egy dolg_temp táblát, majd
írjunk PL/SQL programot,
amely foglalkozásonként megnöveli ebben a legkisebb
fizetésű dolgozók
bérét a foglalkozási csoportjukban legnagyobb
fizetés és
az ugyanitt számított
átlagfizetés különbségének
20%-ával.
+4.) 9.8. Feladat: Hozzunk létre a dolgozo
táblából egy dolg_temp táblát, majd
írjunk PL/SQL programot, amely megnöveli ebben azoknak a főnököknek a
fizetését, akiknek egynél több beosztottjuk van.
A növelés
mértéke: annyiszor N USD, ahány beosztottjuk van.
Az N értékét
a felhasználó adja
meg. A fizetés csökkenő értéke szerint
rendezve listázza
a főnököket.
+5.) 9.9. Feladat: Hozzunk létre a dolgozo
táblából egy dolg_temp táblát, majd
írjunk PL/SQL programot, amely megnöveli ebben azoknak a dolgozóknak
a fizetését, akiknek
az azonosítója páros és
fizetésük kisebb, mint e csoport
átlagfizetése. A
növelés e fizetéskülönbség 20%-a.