Kivételkezelés 2. SQLCODE lehetséges értékei:

Hasonló dokumentumok
Tranzakciókezelés PL/SQL-ben

Együttes hozzárendelés

Összefoglaló. <variable_name> [IN OUT IN OUT] <data_type> [:=<default_value>] ... <label_name>: <statements>... GOTO <label_name>;...

Adatbázis Rendszerek II. 4. PLSQL Kurzorok, hibakezelés 53/1B IT MAN

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Haladó DBMS ismeretek 1

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

PL/SQL blokk. [címke] [DECLARE deklarációs utasítás(ok)] BEGIN végrehajtható utasítás(ok) [EXCEPTION kivételkezelő] END [név];

Triggerek. Olyan névvel ellátott adatbázisobjektumok, amelyek eseményorientált feldolgozást tesznek lehetővé

Összetett típusok Rekordtípus

PL/SQL (folytatás) Kurzorok, függvények, eljárások

A PL/SQL motor. A PL/SQL nyelvű egységek fordítását és futtatását végző rendszer. az adatbázis-kezelőben fejlesztőeszközben (pl.

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

SQL/PSM kurzorok rész

Adatbázis Rendszerek II. 6. PLSQL Triggerek 32/1B IT MAN

PL/SQL 1. rész. Procedural Language extension to SQL

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A 1-1

Hozzunk ki többet abból amink van. Fehér Lajos

Adatbázis használat I. 5. gyakorlat

Adatbázisok-I. előadás dr. Hajas Csilla (ELTE IK)

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

A trigger egy aktualizálási művelet esetén végrehajtandó programrészletet definiál. Alakja:

Adatbázisban tárolt kollekciók

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

Indexek és SQL hangolás

PL/SQL feladatok 8. gyakorlat

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Kalmár György Adatbázis alapú rendszerek

Database Systems II. ZH összefoglaló

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

B I T M A N B I v: T M A N

Adatbázisok webalkalmazásokban

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

B I T M A N B I v: T M A N

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Statistical Inference

8-9.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)

Adatbázis Rendszerek II. 2. Gyakorló környezet

B I T M A N B I v: T M A N

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Kliens oldali SQL-API

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

INDEXSTRUKTÚRÁK III.

Az indexelés újdonságai Oracle Database 12c R1 és 12c R2

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 2. Előadás: Tárolt eljárások

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

Create & validate a signature

SQL OO elemei aktív komponensek

Jegyz könyv. Adatbázis-rendszerek II. Beadandó feladat. Miskolci Egyetem

Széchenyi István Egyetem

Az SQL*Plus használata

Adatbázis kezelés Delphiben. SQL lekérdezések

Adatbázis-kezelés. Harmadik előadás

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Adatbázis Rendszerek II. 3. PLSQL alapok 92/1B IT MAN

Bevezetés: Relációs adatmodell

Készítette: Szabóné Nacsa Rozália

Informatikai képzés Információs rendszerek dr. Hajas Csilla (ELTE IK)

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

Tankönyvben: SQL/PSM Gyakorlaton: Oracle PL/SQL

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

16F628A megszakítás kezelése

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Célkitűzések Az Oracle10 g felépítésének, használatának alapszíntű megismerése

SQL DDL-2 (aktív elemek) triggerek

IBM WebSphere Adapters 7. változat 5. alváltozat. IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.

SQL. 1.rész. 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1

B I T M A N B I v: T M A N

Vektoros grafikát tároló adatbázisok. Katona Endre Térképi adatbázisok diasorozata alapján

Pénzügyi algoritmusok

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

Adatbázis rendszerek SQL nyomkövetés

Kifejezések. Kozsik Tamás. December 11, 2016

SQL/PSM tárolt modulok rész

Bevezetés: az SQL-be

Extrémen brutál, gyors talpaló PHP nyelvhez (database). v2.1

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 3. Előadás: Tárolt eljárások (folytatás) Nézetek

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Elemi alkalmazások fejlesztése IV.

Adatbáziskezelés php-ben MySQL adatbáziskezelı rendszert használva

Objektum-relációs adatbázisok. Felhasználói típusok (User-Defined Types) Objektum ID-k Beágyazott táblák (Nested Tables)

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A

Spatial a gyakorlatban

Exadata hibrid oszlopos adattömörítés automatizálása; DB 12c partition merge

2007. február 25. TARTALOM

Cashback 2015 Deposit Promotion teljes szabályzat

Adatok szűrése, rendezése

SQL parancsok feldolgozása

Vizuális programozás gyakorlat

Adatbázis rendszerek. Gyakorlati jegyzet. Készítette: Selling István

ios alkalmazásfejlesztés Koltai Róbert

Átírás:

Kivételkezelés

Kivételkezelés 1 Futási időben bekövetkező hibák beépített (futtató rendszer váltja ki): előre definiált nem előre definiált felhasználói Az előre definiált és a felhasználói kivételeknek van nevük Minden kivételnek van kódja és szövege Két beépített függvény: SQLCODE: a legutoljára bekövetkezett kivétel kódja SQLERRM[(k)]: a legutoljára bekövetkezett (ill. a k kódú) kivételhez tartozó szöveg (hibaüzenet)

Kivételkezelés 2 SQLCODE lehetséges értékei: 0, ha nem történt kivétel, 1, ha felhasználói kivétel történt, +100, ha a NO_DATA_FOUND beépített kivétel következett be, negatív szám, bármely más beépített kivétel esetén.

Kivételnév Hibakód Leírás ACCESS_INTO_NULL ORA-06530 Attempted to assign values to the attributes of an uninitialized object CASE_NOT_FOUND ORA-06592 None of the choices in the WHEN clauses of a CASE statement are selected, and there is no ELSE clause. COLLECTION_IS_NULL ORA-06531 Attempted to apply collection methods other than EXISTS to an uninitialized nested table or VARRAY CURSOR_ALREADY_OPEN ORA-06511 Attempted to open an already-open cursor DUP_VAL_ON_INDEX ORA-00001 Attempted to insert a duplicate value INVALID_CURSOR ORA-01001 Illegal cursor operation occurred. INVALID_NUMBER ORA-01722 Conversion of character string to number fails. LOGIN_DENIED ORA-01017 Logging on to the Oracle server with an invalid username or password NO_DATA_FOUND ORA-01403 Single row SELECT returned no data. NOT_LOGGED_ON ORA-01012 PL/SQL program issues a database call without being connected to the Oracle server. PROGRAM_ERROR ORA-06501 PL/SQL has an internal problem. ROWTYPE_MISMATCH ORA-06504 Host cursor variable and PL/SQL cursor variable involved in an assignment have incompatible return types. STORAGE_ERROR ORA-06500 PL/SQL ran out of memory, or memory is corrupted. SUBSCRIPT_BEYOND_COUNT ORA-06533 Referenced a nested table or VARRAY element by using an index number larger than the number of elements in the collection SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Referenced a nested table or VARRAY element by using an index number that is outside the legal range (for example, 1) SYS_INVALID_ROWID ORA-01410 The conversion of a character string into a universal ROWID fails because the character string does not represent a valid ROWID. TIMEOUT_ON_RESOURCE ORA-00051 Time-out occurred while the Oracle server was waiting for a resource. TOO_MANY_ROWS ORA-01422 Single-row SELECT returned more than one row. VALUE_ERROR ORA-06502 Arithmetic, conversion, truncation, or size-constraint error occurred. ZERO_DIVIDE ORA-01476 Attempted to divide by zero

PL/SQL blokk [címke] [DECLARE deklarációs utasítás(ok)] végrehajtható utasítás(ok) [ kivételkezelő] END [név];

Kivételkezelő Programegység végén: WHEN kivételnév [OR kivételnév] THEN utasítás [utasítás] [WHEN kivételnév [OR kivételnév] THEN utasítás [utasítás] ] [WHEN OTHERS THEN utasítás [utasítás] ]

Kivételkezelés lépései Ha bekövetkezik egy kivétel végrehajtható részben a futás félbeszakad a futtató rendszer megnézi, hogy van-e a programegység végén kivételkezelő, és annak valamely WHEN ága nevesíti-e a bekövetkezett kivételt ha igen, lefutnak a THEN utáni utasítások különben, ha van kivételkezelő, és abban WHEN OTHERS ág, akkor az ottani utasítások futnak le különben a kivétel továbbadódik az aktiváló környezetnek ha ilyen nincs, akkor UNHANDLED_ váltódik ki deklarációs részben vagy kivételkezelőben azonnal továbbadódik

CREATE OR REPLACE PROCEDURE select_item ( t_column VARCHAR2, t_name VARCHAR2 ) AUTHID DEFINER IS temp VARCHAR2(30); temp := t_column; SELECT COLUMN_NAME INTO temp FROM USER_TAB_COLS WHERE TABLE_NAME=UPPER(t_name) AND COLUMN_NAME=UPPER(t_column); temp := t_name; SELECT OBJECT_NAME INTO temp FROM USER_OBJECTS WHERE OBJECT_NAME = UPPER(t_name) AND OBJECT_TYPE = 'TABLE'; / WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('No Data found for SELECT on temp); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('Unexpected error');

Előre definiált kivételek kezelése A kivételkezelőben hivatkozunk a nevére DECLARE v_id hr.employees.employee_id%type; SELECT employee_id INTO v_id FROM hr.employees WHERE last_name= John ; WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE( Nincs egyetlen John sem. ); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE( Több John is van. ); /

Nem előre definiált kivételek kezelése Deklarációs részben deklarálunk egy kivételnevet összerendeljük egy kóddal A kivételkezelőben hivatkozunk a nevére (Megjegyzés: ORA-01400: cannot insert NULL) DECLARE beszur_kivetel ; PRAGMA _INIT(beszur_kivetel, -1400); INSERT INTO departments(department_id, department_name) VALUES (999, NULL); WHEN beszur_kivetel THEN DBMS_OUTPUT.PUT_LINE( Sikertelen beszúrás! ); DBMS_OUTPUT.PUT_LINE(SQLERRM); /

Felhasználói kivételek kezelése Deklarációs részben deklarálunk egy kivételnevet Végrehajtható részben kiváltjuk a kivételt (RAISE) A kivételkezelőben hivatkozunk a nevére VARIABLE elvart NUMBER EXECUTE :elvart := 130 DECLARE keves_dolgozo ; v_db PLS_INTEGER; SELECT COUNT(*) INTO v_db FROM hr.employees; IF v_db < :elvart THEN RAISE keves_dolgozo; END IF; WHEN keves_dolgozo THEN DBMS_OUTPUT.PUT_LINE( Több dolgozóra lenne szükség! ); /

A RAISE_APPLICATION_ERROR eljárás Három paramétere van: egy -20000 és -20999 közé eső szám (a kivétel kódja), egy maximum 2048 bájt hosszúságú sztring (a kivétel szövege), egy opcionális logikai érték TRUE: a kivétel az eddigi hibák vermének a tetejére kerül, FALSE: kiürül a verem, és csak ez a kód kerül bele (alapértelmezés). Az eljárás meghívásakor kiváltódik a megadott kódú felhasználói kivétel a megadott üzenettel. Előnyök: tárolt alprogramok esetén alkalmazásunk számára tudunk információt biztosítani a hibáról

CREATE FUNCTION get_fizetes (p_id HR.EMPLOYEES.EMPLOYEE_ID%TYPE) RETURN NUMBER IS v HR.EMPLOYEES.SALARY%TYPE; atlag v%type; tul_alacsony_fizu ; SELECT SALARY INTO v FROM HR.EMPLOYEES WHERE employee_id=p_id; SELECT AVG(SALARY) INTO atlag FROM HR.EMPLOYEES; IF v/atlag < 0.5 THEN RAISE tul_alacsony_fizu; END IF; RETURN v; WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20100, Nincs p_id azonosítójú alkalmazott! ); WHEN tul_alacsony_fizu THEN RAISE_APPLICATION_ERROR(-20101, A p_id azonosítójú alkalmazott fizetése túlságosan alacsony! ); END get_fizetes; / DECLARE hibas_alk_azon ; kis_penz ; PRAGMA _INIT (hibas_alk_azon, -20100); PRAGMA _INIT (kis_penz, -20101); FOR i IN (110, 210) LOOP DBMS_OUTPUT.PUT_LINE (i fizetése: get_fizetes(i)); WHEN hibas_alk_azon THEN DBMS_OUTPUT.PUT_LINE (SQLERRM); END LOOP; WHEN kis_penz THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); /

DROP TABLE employees_temp; CREATE TABLE employees_temp AS SELECT employee_id, salary, commission_pct FROM employees; DECLARE sal_calc NUMBER(8,2); INSERT INTO employees_temp (employee_id, salary, commission_pct) VALUES (301, 2500, 0); SELECT (salary / commission_pct) INTO sal_calc FROM employees_temp WHERE employee_id = 301; INSERT INTO employees_temp VALUES (302, sal_calc/100,.1); DBMS_OUTPUT.PUT_LINE('Row inserted.'); / WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Division by zero.');

DECLARE sal_calc NUMBER(8,2); INSERT INTO employees_temp (employee_id, salary, commission_pct) VALUES (301, 2500, 0); SELECT (salary / commission_pct) INTO sal_calc FROM employees_temp WHERE employee_id = 301; WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE ('Substituting 2500 for undefined number.'); sal_calc := 2500; INSERT INTO employees_temp VALUES (302, sal_calc/100,.1); DBMS_OUTPUT.PUT_LINE('Enclosing block: Row inserted.'); WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Enclosing block: Division by zero.'); /

DROP TABLE results; CREATE TABLE results ( res_name VARCHAR(20), res_answer VARCHAR2(3) ); CREATE UNIQUE INDEX res_name_ix ON results (res_name); INSERT INTO results (res_name, res_answer) VALUES ('SMYTHE', 'YES'); INSERT INTO results (res_name, res_answer) VALUES ('JONES', 'NO');

DECLARE name VARCHAR2(20) := 'SMYTHE'; answer VARCHAR2(3) := 'NO'; suffix NUMBER := 1; FOR i IN 1..5 LOOP -- Try transaction at most 5 times. DBMS_OUTPUT.PUT('Try #' i); -- sub-block begins SAVEPOINT start_transaction; -- transaction begins DELETE FROM results WHERE res_answer = 'NO'; INSERT INTO results (res_name,res_answer) VALUES (name,answer); COMMIT; DBMS_OUTPUT.PUT_LINE(' succeeded.'); EXIT; WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE(' failed; trying again.'); ROLLBACK TO start_transaction; -- Undo changes. suffix := suffix + 1; -- Try to fix problem. name := name TO_CHAR(suffix); -- sub-block ends END LOOP;