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