Adatbázisok szerver oldali programozása Labor, 2006.04.18.
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>
Dinamikus SQL
- Hozz létre egy csomagot, amiben a gyakorlat során elkészítendő feladatokat fogod megvalósítani!
- Írj egy tárolt eljárást, ami egy tábla sorait törli ki. Az eljárás bemenete a tábla neve és
a törlend( sorokat definiáló feltétel legyen. Amennyiben nincs megadva feltétel, az
eljárás a bemenetként kapott tábla összes sorát törölje. Az eljárást próbáld is ki!
CREATE OR REPLACE PACKAGE dynasql IS PROCEDURE deletefrom(tablename VARCHAR2, condition VARCHAR2); END dynasql;
CREATE OR REPLACE PACKAGE BODY dynasql IS PROCEDURE deletefrom(tablename VARCHAR2, condition VARCHAR2) IS query VARCHAR2(500); BEGIN query := 'DELETE FROM ' ||| tablename |||| ' WHERE ' || NVL(condition, '0=0'); DBMS_OUTPUT.PUT_LINE(query); EXECUTE IMMEDIATE query; END; END dynasql;
EXEC dynasql.deletefrom('exam', 'ex_id=6');
- Hozz létre egy típust, amiben tetszőleges számú tábla nevét tudod majd tárolni!
- Írj egy tárolt eljárást, aminek bemenő paramétere táblák neveinek tömbje, feladata
pedig, hogy kitörölje a bemenetként megkapott táblákat. A sikeres vagy sikertelen
törlésekről a kimenetre írj üzenetet. Dobj hibát, amennyiben nem lehet az összes
táblát kitörölni, mert esetleg a listából hiányzik egy olyan tábla, ami hivatkozik egy
listabeli táblára.
CREATE OR REPLACE PACKAGE dynasql IS TYPE tablalista IS TABLE OF VARCHAR2(30); PROCEDURE droptables(tables tablalista); END dynasql;
CREATE OR REPLACE PACKAGE BODY dynasql IS tablanemletezik EXCEPTION; tablanemtorolheto EXCEPTION; PRAGMA EXCEPTION_INIT(tablanemletezik, -00942); PRAGMA EXCEPTION_INIT(tablanemtorolheto, -02449); PROCEDURE droptables(tables tablalista) IS query VARCHAR2(500); torolve INT := 0; BEGIN FOR i IN tables.FIRST..tables.LAST LOOP FOR i IN tables.FIRST..tables.LAST LOOP BEGIN query := 'DROP TABLE ' | tables(i); EXECUTE IMMEDIATE query; torolve := torolve+1; DBMS_OUTPUT.PUT_LINE('Törölve: ' | tables(i)); EXCEPTION WHEN tablanemletezik THEN DBMS_OUTPUT.PUT_LINE('Nem létezik: ' | tables(i)); WHEN tablanemtorolheto THEN DBMS_OUTPUT.PUT_LINE('Nem törölhető: ' | tables(i)); END; END LOOP; END LOOP; IF torolve<tables.COUNT THEN RAISE_APPLICATION_ERROR(-20100, 'Nem sikerült minden táblát törölni'); END IF; END; END dynasql;
DECLARE t dynasql.tablalista; BEGIN t:=dynasql.tablalista('felkesz', 'anyag', 'felkesz_anyag'); dynasql.droptables(t); END;
-- Peti - 2006.04.18.