CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

32
CIS4368: Advanced Database Slide # 1 PL/SQL Dr. Peeter Kirs Spring, 2003 PL/SQL

Transcript of CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

Page 1: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 1

PL/SQL

Dr. Peeter Kirs Spring, 2003

PL/SQL

Page 2: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 2

PL/SQL

Dr. Peeter Kirs Spring, 2003

Procedural Language for SQL (PL/SQL) is an extension of Oracle SQL

The basic intent of PL/SQL is increase the expressiveness of SQL process query results in a tuple-oriented way develop modular database application programs reuse program code, and reduce the cost for maintaining and changing applications.

constants and variables can be declared, and variables can be used to store query results. Statements in a PL/SQL block include:

The basic construct of PL/SQL is a block

SQL statements Control structures (loops) Condition statements (if-then-else) Exception handling Calls of other PL/SQL blocks.

Page 3: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 3

PL/SQL

Dr. Peeter Kirs Spring, 2003

Each block builds a (named) program unit, and blocks can be nested.

The structure of a PL/SQL looks as follows:(brackets [ ] enclose optional parts)

[<Block header>][declare<Constants><Variables><Cursors><User defined exceptions>]begin<PL/SQL statements>[exception<Exception handling>]end;

Page 4: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 4

PL/SQL

Dr. Peeter Kirs Spring, 2003

Consider the following simple code:

Needed to display output

Our local variable of data type DATEGet today’s date and store it in our variable

Display the contents of the variableProgram Output

Page 5: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 5

PL/SQL

Dr. Peeter Kirs Spring, 2003

Numeric operations in PL/SQL:

Page 6: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 6

PL/SQL

Dr. Peeter Kirs Spring, 2003

Bind Variables:

Host variables: Declared in the SQL “Host Environment” Remain active for the length of the SQL Session Can be displayed with the SQL Print Command Can only be accessed in the program when prefaced with a colon (:)

Page 7: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 7

PL/SQL

Dr. Peeter Kirs Spring, 2003

Interactive Input:

Page 8: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 8

PL/SQL

Dr. Peeter Kirs Spring, 2003

Control Structures: IF-THEN:

Page 9: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 9

PL/SQL

Dr. Peeter Kirs Spring, 2003

Control Structures: IF-THEN-ELSE:

Page 10: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 10

PL/SQL

Dr. Peeter Kirs Spring, 2003

Control Structures: IF-THEN-ELSIF: (Note Spelling)

Page 11: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 11

PL/SQL

Dr. Peeter Kirs Spring, 2003

Control Structures: Basic Loop:

Page 12: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 12

PL/SQL

Dr. Peeter Kirs Spring, 2003

Control Structures: While:

Page 13: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 13

PL/SQL

Dr. Peeter Kirs Spring, 2003

Control Structures: For:

Page 14: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 14

PL/SQL

Dr. Peeter Kirs Spring, 2003

SQL in PL:

We must be careful about single record/field queries and multiple return queries

Page 15: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 15

PL/SQL

Dr. Peeter Kirs Spring, 2003

Single Return Queries:

The data type applied to field studentname is automatically applied

Page 16: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 16

PL/SQL

Dr. Peeter Kirs Spring, 2003

Multiple Record Queries:

Page 17: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 17

PL/SQL

Dr. Peeter Kirs Spring, 2003

Remember our problem about calculating a student grade?

/* This program calculates a grade */declare cursor studentgrade is select lastname, firstname, quiz1, quiz2, quiz3 from grades; studentlastname grades.lastname%type; studentfirstname grades.firstname%type; q1 grades.quiz1%type; q2 grades.quiz2%type; q3 grades.quiz3%type; average number; sgrade grades.grade%type; nblanks number; blanks char(5);

Variable Declarations:

Page 18: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 18

PL/SQL

Dr. Peeter Kirs Spring, 2003

Remember our problem about calculating a student grade?begin dbms_output.put_line('Student Name Grade'); dbms_output.put_line('------------------ -----'); open studentgrade; loop fetch studentgrade into studentlastname, studentfirstname, q1, q2, q3; exit when studentgrade%notfound; average := (q1 + q2 + q3)/3; nblanks := 20 - (length(trim(studentfirstname)) + length(trim(studentlastname))); if average >= 90 then sgrade := 'A'; elsif average >= 80 then sgrade := 'B'; elsif average >= 70 then sgrade := 'C'; elsif average >= 60 then sgrade := 'D'; else sgrade := 'F'; end if; dbms_output.put_line(trim(studentfirstname) || ' ' || trim(studentlastname) || lpad(' ',nblanks,' ') || sgrade); update grades set grade = sgrade; end loop; close studentgrade;end;

Page 19: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 19

PL/SQL

Dr. Peeter Kirs Spring, 2003

Remember our problem about calculating a student grade?

Page 20: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 20

PL/SQL

Dr. Peeter Kirs Spring, 2003

Exceptions:

Act as error handling routines

Page 21: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 21

PL/SQL

Dr. Peeter Kirs Spring, 2003

Types of Exceptions:

Exception NameNo_data_found

DescriptionSingle row select returned no data

Too_Many_rows Single row select returned multiple rows

Zero_Divide Attempt to divide by zeroValue_Error Arithmetic, Conversion, Truncation errorStorage_Error PL/SQL ran out of memory or memory corruptedLogin_Denied Invalid Username or passwordProgram_Error Run Time errorAccess_Into_Null Attempt to assign values to uninitialized object

Invalid_Cursor Illegal cursor operationRowtype_Mismatch Cursor variable involved in incompatible return

types

--- And Others ---

Page 22: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 22

PL/SQL

Dr. Peeter Kirs Spring, 2003

Procedures: Remember our Grading program?

We could have created it as stored Procedure:

Page 23: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 23

PL/SQL

Dr. Peeter Kirs Spring, 2003

To run the program:

Page 24: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 24

PL/SQL

Dr. Peeter Kirs Spring, 2003

Functions, which are called by procedures, can also be created and stored:

Page 25: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 25

PL/SQL

Dr. Peeter Kirs Spring, 2003

To call the function:

Page 26: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 26

PL/SQL

Dr. Peeter Kirs Spring, 2003

Triggers: A stored block which is implicitly called when an event occurs

• INSERT

A triggering event is based on a Data Manipulation Language statement such as:

• UPDATE• DELETE

Execution of the trigger is known as firing the trigger

Page 27: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 27

PL/SQL

Dr. Peeter Kirs Spring, 2003

Recall our problem about determining whether or not a student had enrolled for two classes at the same time Information about students in a class was found only in the table

enrollment Information about when a class met was found only in the table

class

If the information were in one table we could apply a constraint which would not allow a student to enroll in both classes:

Page 28: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 28

PL/SQL

Dr. Peeter Kirs Spring, 2003

However, even if we had created this table, it still would not stop a student from enrolling in two classes that meet at the same time Enrollment in a class is done by entering a record in table

enrollment (not table temp_table)

One way to stop dual enrollment is to set a trigger which tries to insert the record (from enrollment) into table temp_table (which contains the constraint) If the record can be inserted into temp_table, it will then be inserted

into table enrollment

If the record can NOT be inserted into temp_table, it will NOT be inserted into table enrollment

Page 29: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 29

PL/SQL

Dr. Peeter Kirs Spring, 2003

The trigger might appear as:

FOR EACH ROW is a row trigger which fires once for each row inserted:

:NEW refers to the new record to be inserted

Page 30: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 30

PL/SQL

Dr. Peeter Kirs Spring, 2003

Suppose we look up the Spring 2003 (semester = 102) schedule for Yao Ming (studentid = 21098765):

There is one other class that meets at the same time

Page 31: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 31

PL/SQL

Dr. Peeter Kirs Spring, 2003

If we now try and enroll Yao for the other class:

Page 32: CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.

CIS4368: Advanced Database Slide # 32

PL/SQL

Dr. Peeter Kirs Spring, 2003