Adatbázisok szerver oldali programozása Labor, 2006.05.16.

A VIK Wikiből

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.