Amikor elmesélték nekem, hogy van ez a kettő, akkor nem igazán értettem, hogy mi a különbség. A tapasztalat mondta meg, hogy végül is mire használjam őket.
Először egy gyors áttekintés:
Tárolt eljárások (Stored Procedure) alatt önálló függvényhívásokat értünk, mint pl.:
MS SQL:
exec mySP
-----------------------
ORACLE:
call mySP();
A neve után vagy adunk neki zárójelet, vagy nem. Elvileg működnie kell.
Tárolt függvények külsőre nagyon hasonlóak, DE:
1. Nem állhatnak önállóan!
Helytelen(A példa):
mySF()
Helyes(B példa):
select * from mySF()
vagy
MS SQL:
set @myvaltozo = mySF()
-----------------------------
ORACLE
myvaltozo := mySF();
2. Csak egy meghatározott értékkel térhetnek vissza!
Ez alatt azt kell érteni, hogy ha táblát is adnak vissza, akkor is tudni kell előre a tábla pontos szerkezetét mezőszámmal, típusokkal, szabályokkal/constraintekkel/ együtt. Az létrehozáskor beégetődik. "select * from tabla" esetén is figyelni kell, mert ott pontos mezőket ad vissza, és nem érzékeli, ha változott a tábla struktúrája. Ez utóbbi információ csak MS SQL alatt van számomra bizonyítva, ORACLE alatt nincs ilyen mély tapasztalatom.
Tárolt eljárásokban meghatározhatunk ki és bemenő paramétereket, de ezek nem lehetnek táblaváltozók, vagy egyéb komplex változók. Ha ilyen tábla változók visszaadására van szükség, akkor ideiglenes táblákat kell használni(temporary table). Ilyen táblák trükkjeiről majd egy másik posztban mesélek.
MS SQL alatt nem lehet tárolt eljárásokból a temptáblákhoz hozzáférni valamilyen mágikus okból... talán biztonsági probléma? Nem tudom. Oracle alatt ilyenről még nem hallottam.
Summárium
Szóval az én szájízem szerint a két dolgot a következőképpen használom.
Tárolt eljárásokat a programlogika első lépcsőjeként használom, tehát az adatbázishívásoknál tárolt eljárásokat hívok, emiatt
- nehezebbé válik az SQL injection típusú támadás a website ellen
- a mechanika szinte tiszta SQL alapon megy, szóval a webprogramozásban szinte csak megjelenítenem kell a kapott adatokat, mert
- a visszakapott táblákat program oldalon el tudom kapni, és ki tudom szedni, hogy melyik kell nekem (többnyire a legutolsó).
Tárolt függvényeket a select/update/delete kifejezéseimben szoktam használni, ezek
- sokszor segítenek egyszerűsíteni egy-egy kifejezést(kevesebb join, kevesebb szűrés a where-ben, és közérthetőbb, hogy mit csinál a kifejezés)
- ilyen esetekben azonban megfontolandó, hogy a kiszámolt értéket(függvény visszatérési értéke) nem célszerűbb -e előre kiszámoltatni, és feltüntetni mint mezőt
Remélem sikerült pár gondolatot felébreszteni a kedves olvasóban. Szívesen válaszolok minden felmerülő kérdésre.