Kivételkezelés ----------------- set serveroutput on begin FOR err_num IN 1..9999 LOOP DBMS_OUTPUT.PUT_LINE(SQLERRM(-err_num)); END LOOP; end; / INVALID_CURSOR -1001 INVALID_NUMBER -1722 karakterlánc sikertelen számmá konvertálása NO_DATA_FOUND -100 select .. into… SELECT utasitas nem ad vissza sort TOO_MANY_ROWS -1422 egy sort kellett volna visszaadnia egy SELECT-nek, de többet kaptunk VALUE_ERROR -6502 ZERO_DIVIDE -1476 - Felhasználói kivételek - a DECLARE szakaszban: kivételnév EXCEPTION; - végrehajtható szegmensben RAISE utasítással váltható ki; DECLARE kivetelnev EXCEPTION; PRAGMA EXCEPTION_INIT(kivetelnev, kód); BEGIN RAISE kivetelnev; EXCEPTION WHEN kivetelnev [OR kivetelnev….] THEN ut(ok) [WHEN kivetelnev…..] ……….. [WHEN OTHERS THEN ut(ok)] END; / RAISE_APPLICATION_ERROR( kód, üzenet[, ]) SQLCODE SQLERRM SQLERRM(kód) DECLARE A NUMBER NOT NULL:=1; B NUMBER; BEGIN A:=B; EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('HOPPÁ!'); END; / DECLARE X EMP.ENAME%TYPE; BEGIN SELECT ENAME INTO X FROM EMP WHERE job='&x'; DBMS_OUTPUT.PUT_LINE(x); EXCEPTION WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN RAISE_APPLICATION_ERROR(-20001,'Nem tudtam egyértelműen azonosítani a dolgozót'); END; / /* 'president' 0 adat 'PRESIDENT' 1 adat (sor) 'MANAGER' több adat (sor) */ Példa: DECLARE v_ber EMP.sal%TYPE; v_nev EMP.ename%TYPE; BEGIN v_ber := 5000; SELECT ename INTO v_nev FROM EMP WHERE sal = v_ber; DBMS_OUTPUT.PUT_LINE(v_nev); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Nincs ilyen fizetés'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Több embernek is ez a fizetése'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Egyéb hiba'); END;/ Példa: DECLARE nincs_vevo EXCEPTION; BEGIN DBMS_OUTPUT.PUT_LINE('Ez vegrehajtodik'); RAISE nincs_vevo; DBMS_OUTPUT.PUT_LINE('Ez nem hajtodik vegre'); EXCEPTION WHEN nincs_vevo THEN DBMS_OUTPUT.PUT_LINE('Nincs ilyen vevo'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Egyéb hiba'); END; Triggerek CREATE [OR REPLACE] TRIGGER név { BEFORE | AFTER | INSTEAD OF } { DELETE | INSERT | UPDATE [OF oszlopok] } [ OR { DELETE | INSERT | UPDATE [OF oszlopok] } ] ON tábla [ REFERENCING [OLD AS régi] [NEW AS új] ] [ FOR EACH ROW ] [WHEN (feltétel)] PL/SQL programblokk; - Utasítás szintű trigger Példa: CREATE TABLE tmp ( szam NUMBER(20) ); CREATE OR REPLACE TRIGGER kiírás BEFORE INSERT ON tmp BEGIN DBMS_OUTPUT.PUT_LINE('Új sort fogunk beszúrni'); END; CREATE OR REPLACE TRIGGER kiiras2 AFTER INSERT ON tmp BEGIN DBMS_OUTPUT.PUT_LINE('Új sort szúrtunk be'); END; INSERT INTO tmp VALUES(1122); DROP TABLE tmp; - Sor szintű trigger Példa: CREATE OR REPLACE TRIGGER nem_csokken AFTER UPDATE OF ber ON munkatars FOR EACH ROW WHEN (OLD.ber > NEW.ber) UPDATE munkatars SET ber = :OLD.ber WHERE partner_id = :NEW.partner_id; UPDATE munkatars SET ber = 1 WHERE partner_id = 1; CREATE TRIGGER NESZE AFTER INSERT OR UPDATE OR DELETE ON dept BEGIN DBMS_OUTPUT.PUT_LINE(CASE WHEN INSERTING THEN 'Beszúrtunk' WHEN UPDATING THEN 'Módosítottunk' WHEN DELETING THEN 'Töröltünk' END); END; / SET SERVEROUT ON INSERT INTO dept VALUES (80,'reszl1','loc1'); INSERT INTO dept VALUES (81,'reszl2','loc2'); DELETE FROM dept WHERE deptno=80 OR deptno=81; SELECT DESCRIPTION FROM user_triggers; SELECT line, text FROM user_source WHERE UPPER(TYPE)='TRIGGER' AND UPPER(NAME)='NESZE'; DROP TRIGGER nesze; CREATE TRIGGER minimálbér AFTER UPDATE OF sal ON emp REFERENCING OLD AS régi NEW AS új FOR EACH ROW WHEN (régi.sal>új.sal AND új.sal<500) begin UPDATE emp SET sal=:régi.sal WHERE empno=:régi.empno; End; / alter trigger tnev enable; set serveroutput on CREATE OR REPLACE TRIGGER mitcsinaltunk AFTER INSERT OR UPDATE OR DELETE ON dept BEGIN DBMS_OUTPUT.PUT_LINE(CASE WHEN INSERTING THEN 'Beszúrtunk.' WHEN UPDATING THEN 'Módosítottunk.' WHEN DELETING THEN 'Töröltünk.' END); END; / show errors INSERT INTO dept VALUES (80, 'reszl1', 'loc1'); INSERT INTO dept VALUES (81, 'reszl2', 'loc2'); DELETE FROM dept WHERE deptno = 80 or deptno = 81; select description from user_triggers; select line, text FROM user_source where upper(type)='TRIGGER' and UPPER(name) ='MITCSINALTUNK'; DROP TRIGGER mitcsinaltunk; set serveroutput on CREATE OR REPLACE TRIGGER rakerdez AFTER INSERT OR UPDATE OR DELETE ON dept BEGIN DBMS_OUTPUT.PUT_LINE(CASE WHEN INSERTING THEN 'Beszúrtunk.' WHEN UPDATING THEN 'Módosítottunk.' WHEN DELETING THEN 'Töröltünk.' END); END; / show errors INSERT INTO dept VALUES (80, 'reszl1', 'loc1'); INSERT INTO dept VALUES (81, 'reszl2', 'loc2'); DELETE FROM dept WHERE deptno = 80 or deptno = 81; select description from user_triggers; select line, text FROM user_source where upper(type)='TRIGGER' and UPPER(name) ='RAKERDEZ'; DROP TRIGGER rakerdez; CREATE OR REPLACE TRIGGER dml_trg AFTER UPDATE OF o1 ON t1 FOR EACH ROW WHEN (NEW.o1 >= 1000) DECLARE v_local VARCHAR2(20); BEGIN v_local := :new.o1; END; / CREATE OR REPLACE TRIGGER dml_trg2 BEFORE INSERT OR DELETE OR UPDATE ON t2 BEGIN null; END; / CREATE OR REPLACE TRIGGER dml_trg3 INSTEAD OF UPDATE ON v1 FOR EACH ROW -- enelkul is sortrigger lesz az instead of miatt BEGIN null; END; / CREATE OR REPLACE TRIGGER db_trg AFTER SERVERERROR OR LOGON OR STARTUP OR SUSPEND ON DATABASE DECLARE -- A PL/SQL blokknak lehet deklarációs része is i number; BEGIN null; END ; / CREATE OR REPLACE TRIGGER db_trg2 BEFORE LOGOFF OR SHUTDOWN ON DATABASE BEGIN null; END ; / CREATE OR REPLACE TRIGGER any_ddl_trg BEFORE DDL ON DATABASE BEGIN null; END ; / CREATE OR REPLACE TRIGGER spec_ddl_trg BEFORE ALTER OR ANALYZE OR ASSOCIATE STATISTICS OR AUDIT OR CREATE OR DROP OR GRANT ON DATABASE BEGIN null; END ; / CREATE OR REPLACE TRIGGER sajat_ddl_trg BEFORE DDL ON nikovits.SCHEMA BEGIN null; END ; / CREATE OR REPLACE TRIGGER sajat_logon_trg AFTER LOGON ON SCHEMA BEGIN null; END ; / CREATE OR REPLACE TRIGGER any_logon_trg AFTER LOGON ON DATABASE BEGIN null; END ; /