Ez a lap egy ellenőrzött változata
APL/SQL(Procedural Language/Structured Query Language) azOracle által azSQL kiterjesztéseként kifejlesztett procedurális programozási nyelv. Az Oracle adatbázis-kezelőt használva ezen a nyelven írhatunktriggereket és más tárolt eljárásokat. A nyelv alapja azAda programozási nyelv; természetesen a PL/SQL magában foglalja azSQL nyelvet, pontosabban annak SELECT, INSERT, DELETE, UPDATE illetve OPEN, FETCH, CLOSE utasításait.
A következő példában adott egyfizetesek tábla (benne a nevekkel és fizetésekkel) és egy fiz_modosit tábla (benne nevekkel és az új fizetésekkel). A merge paranccsal a következőket tudjuk megtenni:
- ha van egyezés a név alapján, akkor az új fizetésre módosítjuk a fizetést (update)
- ha van egyezés a név alapján és a fizetés 13000 vagy kevesebb, akkor töröljük a sort (delete)
- ha nincs egyezés a név alapján akkor új sort szúrunk be name és new_sal értékkel (insert)
Alaptáblák:
select*fromfizetesek;NAMESAL---------- ----------ADAM12000BOB13000BOBEK14000select*fromfiz_modosit;NAMENEW_SAL---------- ----------ADAM13000BOBEK15000MARRY16000
Ha a fiztesek táblát merge paranccsal változtatjuk a fiz_modosit tábla használatával, akkor a következőket várjuk:
- Bobek fizetése 15000 legyen (update)
- Adam sora törlődjön (kevesebb a fizetése, mint 13000) (delete)
- Marry kerüljön bele a fizetések táblába (insert)
mergeintofizetesekusingfiz_modositon(fizetesek.name=fiz_modosit.name)whenmatchedthenupdatesetsal=new_saldeletewheresal<=13000whennotmatchedtheninsert(fizetesek.name,fizetesek.sal)values(fiz_modosit.name,fiz_modosit.new_sal);-- 3 rows merged.select*fromfizetesek;NAMESAL---------- ----------BOB13000BOBEK15000MARRY16000
A három változás megtörtént. De felmerül kérdésként, hogy miért nem kerül törlésre Bob fizetése, hiszen megfelel a delete feltételnek (kisebb vagy egyenlő mint 13000). Azért nem kerül törlésre, mert a merge során csak azok a sorokkal történik változás, amelyek a merge során érintettek, azaz benne vannak a using után álló módosítótáblában. Például: Adam szerepelt ebben a táblában, ezért törlődött is a sor, de Bob nem (ezért nem történt vele semmi)
createorreplacetriggermy_table_beforebeforeinsertorupdateordeleteonmy_tableforeachrowbeginifinsertingor(updatingand:new.statusz<>:old.statusz)thenupdatemy_stat_tablestsetst.count=st.count+1wherest.statusz=:new.statusz;ifsql%notfoundtheninsertintomy_stat_tablevalues(:new.statusz,1);endif;endif;ifdeletingor(updatingand:new.statusz<>:old.statusz)thenupdatemy_stat_tablestsetst.count=st.count-1wherest.statusz=:old.statusz;endif;end;/
Megj.: a program végén lévő perjel akkor kell, ha az eljárást azSql*Plus használatával definiáljuk, ezzel jelezzük a PL/SQL blokk végét.
SQL_CURSORcrsr;varcharename[32];intideptno,empno,deptno;EXECSQLALLOCATE:crsr;ideptno=30;EXECSQLEXECUTEBEGINOPEN:crsrFORSELECTename,empno,deptnoFROMempWHEREdeptno=:ideptno;END;END-EXEC;EXECSQLFETCH:crsrINTO:ename,:empno,:deptno;
| Ez aprogramozási nyelvekkel és programozással kapcsolatos lap egyelőrecsonk (erősen hiányos).Segíts te is, hogy igazi szócikk lehessen belőle! |