43
PL/SQL SECTIUNE 6

PL/SQL SECTIUNE 6 - Wikispacesctimbg.wikispaces.com/...PLSQL.pdf/.../S6_PLSQL.pdf · a SELECT statement in PL/SQL must return exactly one row. Sau returneaza mai multe linii si nu

  • Upload
    vudien

  • View
    225

  • Download
    3

Embed Size (px)

Citation preview

PL/SQL

SECTIUNE 6

Entering an incorrect username and/or

password

Forgetting to include the @ in an email

address

Entering a credit card number incorrectly

Entering an expiration date that has

passed

Ex: o cerere care nu returneza nicio linie

a SELECT statement in PL/SQL must return exactly one row.

Sau returneaza mai multe linii si

nu este declarat cursor explicit

Rezolvarea exceptiilor

For example, employee_id 100 already exists in the EMPLOYEES table. A user tries to

add a new employee and mistakenly types an employee id of 100. The program then tries

to INSERT this new employee and violates a primary key constraint. This is an example of

a user action errors causing a data error

C7

Diapozitiv 4

C7 Atentie care exceptie apare prima!Carmen; 06.05.2009

“Predefined exception” means an exception to which Oracle has already given a name, for

example NO_DATA_FOUND and TOO_MANY_ROWS. “User-defined exception” means

an exception which does not have a predefined name; we must give our own names to

these by declaring them within the block

C8

C13

Diapozitiv 9

C8 IF...... THEN RAISE....END IF;Carmen; 06.05.2009

C13 Exceptiile se comporta ca niste variabile; verifica vizibilitatea si scopulscope= the portion of a program in wich the variable is declared and is accessiblevizibilitate= unde poate fi accesata fara prefixare

Erorile de sintaxa nu fac obiectul exceptiilorCarmen; 06.05.2009

Partial List of Pre-Defined Exceptions

C9

Diapozitiv 11

C9 to fetch data from a cursor it has been closedCarmen; 06.05.2009

(ORA-nnnnn)

ETAPE

Ex: se incearca inserarea unei valori NULL intr-o coloana cu constrangerea NOT NULLCod

eroare: ORA-1400; the EXCEPTION section can refer to exceptions only by name, not by

number (i.e. we cannot code WHEN ORA-01400 THEN ….). There is no predefined PL/SQL

name for the ORA-1400 exception, so we need to create our own name for it.

C10

Diapozitiv 13

C10 Nu exista nume de exceptie pentru incalcarea restrictiei NOT NULLCarmen; 06.05.2009

Sunt corecte constructiile de forma :

1. WHEN nume_exceptie THEN NULL;

2. WHEN ……… THEN BEGIN……. END;

C22

Diapozitiv 14

C22 atentie la ordinea parametrilor formali din apelul proceduriiCarmen; 06.05.2009

why is the SQLCODE for NO_DATA_FOUND +100 instead of -01403?

Answer: some of these error codes are used in other (non-Oracle) databases, and +100 is an

internationally-agreed code when no rows are returned from a query.

SQLCODE and SQLERRM are often used in a WHEN OTHERS handler. Someone (often the

Database Administrator) would be responsible for reading the ERROR_LOG table and taking

suitable action.

why can’t we use SQLCODE or SQLERRM directly in a SQL statement? Answer: because

that SQL statement (the INSERT INTO error_log in the slide) could also raise an exception,

which would change the values of SQLCODE and SQLERRM.

situations where the Oracle server would execute a statement successfully (and therefore not

raise an exception automatically) but there is still an “error” from the user’s viewpoint. Possible

examples:

A DML UPDATE or DELETE statement modifies no rows

A SELECT statement successfully reads a row which should not exist yet

A Stock Clerk has been identified as a manager, but our business rules state that clerks cannot

be managers. (an UPDATE or DELETE DML statement is treated as successful by the server even if it

modifies no rows. Therefore the Oracle server will not automatically raise an exception in this case. If we

want to raise an exception, we must do it ourselves )

when any kind of exception is raised, the rest of the executable section is not executed.

Therefore in the slide example, if the UPDATE modifies no rows, the COMMIT will not be

executed.

Instead of using IF SQL%NOTFOUND THEN … we could have coded:

IF SQL%ROWCOUNT = 0 THEN ...

C23

Diapozitiv 20

C23 Asigura consistenta datelor.(ROLLBACK/ COMMIT/)Carmen; 06.05.2009

Poate fi apelata

atat in sectiunea

executabila cat si

in sectiunea de

exceptieC11

C12

Diapozitiv 22

C11 Atentie la numarul erorii, verificati sa apartina intervaluluiCarmen; 06.05.2009

C12 DESCRIBE RAISE_APPLICATION_ERROR

procedura predefinita pentru particularizarea mesajelorCarmen; 06.05.2009

C1

Diapozitiv 23

C1 Note that an error raised by RAISE_APPLICATION_ERROR is an unhandled exception which is propagated back to the calling environment. The whole idea is to allow the calling application to display a business-meaningful error message to the user. If the exception was handled successfully within the PL/SQL block, the application would not see the error at all. Carmen; 04.05.2009

In this example, when an invalid last name is entered, the user-defined exception e_name is

raised using its error number -20999. Because the EXCEPTION_INIT pragma was used to define

the error name e_name and its error code –20999, when the error code is raised, the exception

handler for e_name is run and the exception is not propagated to the calling environment

a cursor is a type of variable,

and is subject to the same

scoping rules as more

“obvious” variables. emp_curs

was declared in the inner block,

and therefore cannot be

referenced by the CLOSE

statement in the outer block

Atentie la regula de omonimie!

Etichetarea blocurilor si prefixarea variabilelor

C2

Diapozitiv 27

C2 Exceptia se comporta ca o variabilaCarmen; 04.05.2009

C25

Diapozitiv 28

C25 Daca exceptia ar fi fost definita in inner block, ar fi rezultat o eroare; nu ar fi fost recunoscuta in outer blockExemplu slide 30Carmen; 06.05.2009

C3

Diapozitiv 29

C3 Answer: the SELECT raises a NO_DATA_FOUND exception in the inner block. This is propagated to the outer block which handles it successfully using WHEN OTHERS. Only Message 4 will be displayedCarmen; 04.05.2009

Scope – The portion of a program in which the variable is declared

and is accessible.

Visibility – The portion of the program where the variable can be

accessed without using a qualifier.

Qualifier – A label given to a block

C4

Diapozitiv 30

C4 Answer: a compile-time error will occur and the block will not be executed at all, so nothing is displayed. Why? Because e_myexcep is a variable. It is declared within the inner block and is out of scope and cannot be referenced in the outer block.Carmen; 04.05.2009