CIS4368: Advanced DatabaseSlide # 1 PL/SQL Dr. Peeter KirsSpring, 2003 PL/SQL.
-
Upload
anne-williams -
Category
Documents
-
view
218 -
download
1
Transcript of 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
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.
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;
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
CIS4368: Advanced Database Slide # 5
PL/SQL
Dr. Peeter Kirs Spring, 2003
Numeric operations in 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 (:)
CIS4368: Advanced Database Slide # 7
PL/SQL
Dr. Peeter Kirs Spring, 2003
Interactive Input:
CIS4368: Advanced Database Slide # 8
PL/SQL
Dr. Peeter Kirs Spring, 2003
Control Structures: IF-THEN:
CIS4368: Advanced Database Slide # 9
PL/SQL
Dr. Peeter Kirs Spring, 2003
Control Structures: IF-THEN-ELSE:
CIS4368: Advanced Database Slide # 10
PL/SQL
Dr. Peeter Kirs Spring, 2003
Control Structures: IF-THEN-ELSIF: (Note Spelling)
CIS4368: Advanced Database Slide # 11
PL/SQL
Dr. Peeter Kirs Spring, 2003
Control Structures: Basic Loop:
CIS4368: Advanced Database Slide # 12
PL/SQL
Dr. Peeter Kirs Spring, 2003
Control Structures: While:
CIS4368: Advanced Database Slide # 13
PL/SQL
Dr. Peeter Kirs Spring, 2003
Control Structures: For:
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
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
CIS4368: Advanced Database Slide # 16
PL/SQL
Dr. Peeter Kirs Spring, 2003
Multiple Record Queries:
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:
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;
CIS4368: Advanced Database Slide # 19
PL/SQL
Dr. Peeter Kirs Spring, 2003
Remember our problem about calculating a student grade?
CIS4368: Advanced Database Slide # 20
PL/SQL
Dr. Peeter Kirs Spring, 2003
Exceptions:
Act as error handling routines
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 ---
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:
CIS4368: Advanced Database Slide # 23
PL/SQL
Dr. Peeter Kirs Spring, 2003
To run the program:
CIS4368: Advanced Database Slide # 24
PL/SQL
Dr. Peeter Kirs Spring, 2003
Functions, which are called by procedures, can also be created and stored:
CIS4368: Advanced Database Slide # 25
PL/SQL
Dr. Peeter Kirs Spring, 2003
To call the function:
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
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:
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
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
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
CIS4368: Advanced Database Slide # 31
PL/SQL
Dr. Peeter Kirs Spring, 2003
If we now try and enroll Yao for the other class:
CIS4368: Advanced Database Slide # 32
PL/SQL
Dr. Peeter Kirs Spring, 2003