SlideShare a Scribd company logo
1
Agenda
 Summary of last class
 Loops

Simple Loops

WHILE Loops

FOR Loops
 Records
 Cursors
2
Records
 User-defined composite types
 Provides a way to treat separate but logically related
variables as a unit
 Similar to “structures” in C
 Use the dot notation to refer to fields within a record
 v_StudentInfo.FirstName := ‘John’;
 In order to copy one record to another record, both records must
be of the same record type
3
Records
 Syntax:
DECLARE
TYPE t_StudentRecord IS RECORD(
Student_ID NUMBER(5),
FirstName VARCHAR2(20),
LastName VARCHAR2(20) );
v_StudentInfo t_StudentRecord;
BEGIN
-- Process data here
EXCEPTION
-- Error handling would go here
END;
/
Use the dot notation to refer
to fields within a record.
Example:
v_StudentInfo.FirstName := ‘John’;
4
Records
 To declare a record with the same
structure (i.e. fields & field types) as a
database row, use %ROWTYPE
 Syntax:
DECLARE
v_StudentInfo student%ROWTYPE;
BEGIN
-- Process data here
EXCEPTION
-- Error handling would go here
END;
/
NOTE:
Any NOT NULL constraints
that are defined for a column
within the table will not be
applicable to the declared
record when %ROWTYPE is
used.
5
Cursors
 A pointer to the context area
 Context area contains:
 Number of rows processed by the statement
 A pointer to the parsed representation of the statement
 In the case of a query, the set of rows returned by the
query (i.e. the active set, active recordset)
 Follows standard declaration and scoping
 Naming Convention: c_CursorName
 Cursor Types:
 Explicit: user-defined
 Implicit: system-defined
6
Explicit Cursors
 To use explicit cursors…
 Declare the cursor
 Open the cursor
 Fetch the results into PL/SQL variables
 Close the cursor
7
Declaring Cursors
DECLARE
v_StudentID students.id%TYPE;
v_FirstName students.first_name%TYPE;
v_LastName students.last_name%TYPE;
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = ‘History’;
BEGIN
-- open cursor, fetch records & then close cursor here
END;
/
8
OPEN Cursor
DECLARE
v_StudentID students.id%TYPE;
v_FirstName students.first_name%TYPE;
v_LastName students.last_name%TYPE;
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = ‘History’;
BEGIN
OPEN c_HistoryStudents;
-- fetch records & then close cursor here
END;
/
9
FETCH Records
DECLARE
v_StudentID students.id%TYPE;
v_FirstName students.first_name%TYPE;
v_LastName students.last_name%TYPE;
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = ‘History’;
BEGIN
OPEN c_HistoryStudents;
LOOP
FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName;
EXIT WHEN c_HistoryStudents%NOTFOUND;
-- do something with the values that are now in the variables
END LOOP
-- close cursor here
END;/
10
Close Cursor
DECLARE
v_StudentID students.id%TYPE;
v_FirstName students.first_name%TYPE;
v_LastName students.last_name%TYPE;
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = ‘History’;
BEGIN
OPEN c_HistoryStudents;
LOOP
FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName;
DBMS_OUTPUT.PUT_LINE(v_StudentID, v_FirstName, v_LastName);
EXIT WHEN c_HistoryStudents%NOTFOUND;
-- do something with the values that are now stored in the variables
END LOOP
CLOSE c_HistoryStudents;
END; /
11
Cursor Attributes
 Cursors have four attributes…
 %FOUND

TRUE if the previous FETCH returned a row

Otherwise, FALSE
 %NOTFOUND

TRUE if the previous FETCH did NOT return a row

Otherwise, FALSE
 %ISOPEN

TRUE if the cursor is open,

Otherwise, FALSE
 %ROWCOUNT

Returns the # of rows that have been fetched by the cursor
so far
12
Cursor Fetch Loop: WHILE Loop
DECLARE
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = 'History';
v_StudentData c_HistoryStudents%ROWTYPE;
BEGIN
OPEN c_HistoryStudents;
FETCH c_HistoryStudents INTO v_StudentData;
WHILE c_HistoryStudents%FOUND LOOP
INSERT INTO registered_students (student_id, department, course)
VALUES (v_StudentData.ID, 'HIS', 301);
INSERT INTO temp_table (num_col, char_col)
VALUES (v_StudentData.ID, v_StudentData.first_name || ' ' ||
v_StudentData.last_name);
FETCH c_HistoryStudents INTO v_StudentData;
END LOOP;
CLOSE c_HistoryStudents;
END;/
13
Take Home Exercise #1
 Write an anonymous PL/SQL block that…
 Defines a cursor that points to a record set that contains
the sailors’ names, reservation date and boat id where
the boat color is red
 Opens the cursor
 Uses a simple loop to fetch each record in the active set
 Displays each last name, reservation date and boat id for
each record to the output screen
 Schema
Sailor (sid, sname, rating, age)
Boat (bid, bname, color)
Reservation(sid, bid, day)
14
Cursor with Bind Variable(s)
DECLARE
v_StudentID students.id%TYPE;
v_FirstName students.first_name%TYPE;
v_LastName students.last_name%TYPE;
v_Major students.major%TYPE;
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = v_Major;
BEGIN
v_Major := ‘History’;
OPEN c_HistoryStudents;
LOOP
FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName;
EXIT WHEN c_HistoryStudents%NOTFOUND;
-- do something with the values that are now stored in the variables
END LOOP
CLOSE c_HistoryStudents;
END; /
15
Bind Variables
 What are bind variables?
 Variables that are referenced in the cursor
declaration
 They must be declared BEFORE the cursor is
declared

i.e. variable must be declared before it can be used

The values of bind variables are examined ONLY
when the cursor is opened (at run time)
16
Explicit Cursors with Bind
Variables
 To use explicit cursors with bind variables…
 Declare bind variables
 Then declare the cursor
 Assign values to bind variables
 Open the cursor
 Fetch the results into PL/SQL variables
 Close the cursor
17
Take Home Exercise #2
 Modify your answer for Class Exercise #1
such that…
 It uses bind variables for color of boat instead
of hard-coding the values in the WHERE clause
 The FETCH is done inside of a WHILE loop
instead of inside of a simple loop.
18
Implicit Cursors
 Used for INSERT, UPDATE, DELETE and SELECT…
INTO queries
 In SQL%NOTFOUND, SQL is called the implicit cursor
 PL/SQL opens & closes implicit cursors, which is also
called SQL cursor
 You don’t declare the implicit cursor
 If the WHERE clause fails…

For SELECT…INTO statement, then NO_DATA_FOUND error
is raised instead of SQL%NOTFOUND

For UPDATEs and DELETEs, SQL%NOTFOUND is set to
TRUE
19
Example of Implicit Cursor
BEGIN
UPDATE rooms
SET number_seats = 100
WHERE room_id = 99980;
-- If the previous UPDATE statement didn't match any rows,
-- insert a new row into the rooms table.
IF SQL%NOTFOUND THEN
INSERT INTO rooms (room_id, number_seats)
VALUES (99980, 100);
END IF;
END;
/
20
Example of Implicit Cursor
BEGIN
UPDATE rooms
SET number_seats = 100
WHERE room_id = 99980;
-- If the previous UPDATE statement didn't match any rows,
-- insert a new row into the rooms table.
IF SQL%ROWCOUNT = 0 THEN
INSERT INTO rooms (room_id, number_seats)
VALUES (99980, 100);
END IF;
END;
21
-- Example of SELECT…INTO and NO_DATA_FOUND
set serveroutput on
DECLARE
-- Record to hold room information.
v_RoomData rooms%ROWTYPE;
BEGIN
-- Retrieve information about room ID -1.
SELECT *
INTO v_RoomData
FROM rooms
WHERE room_id = -1;
-- The following statement will never be executed, since
-- control passes immediately to the exception handler.
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('SQL%NOTFOUND is true!');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND raised!');
END;
/
22
SHOW ERRORS
 To display error message
 SQL> SHOW ERRORS;
23
Summary of last class
 Cursors
 A pointer to the context area (active set)
 Name begins with c_
 Defined within the DECLARE section
 Types: Explicit vs. Implicit

Explicit: (1) Declare, (2) Open, (3) Fetch & (4) Close
 Bind variables

Variables that are referenced in the cursor declaration

Must be defined BEFORE the cursor

Values examined ONLY at run time
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = ‘History’;
24
Take Home Exercise #1
DECLARE
CURSOR c_Reservations IS
SELECT s.sname, r.day, r.bid
FROM Sailor S, Reserve R, Boat B
WHERE R.sid = s.sid
AND R.bid = b.bid
AND B.color = ‘red’;
v_Reservation c_Reservations%ROWTYPE;
BEGIN
OPEN c_Reservations;
LOOP
FETCH c_Reservations INTO v_Reservation;
EXIT WHEN c_Reservations%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_Reservation.sname||’ ‘||v_Reservation.day||’
v_Reservation.bid);
END LOOP;
CLOSE c_Reservations;
END;/
Reserve
sid bid day
22 101 10/10/98
22 102 10/10/98
22 103 10/8/98
22 104 10/7/98
31 102 11/10/98
31 103 11/6/98
31 104 11/12/98
64 101 9/5/98
64 102 9/8/98
74 103 9/8/98
Boat
bid bname color
101 Interlake blue
102 Interlake red
103 Clipper green
104 Marine red
Sailor
sid sname rating age
22 Dustin 7 45.0
29 Brutus 1 33.0
31 Lubber 8 55.5
32 Andy 8 25.5
58 Rusty 10 35.0
64 Horatio 7 35.0
71 Zorba 10 16.0
74 Horatio 9 35.0
85 Art 3 25.5
95 Bob 3 63.5
25
Cursor Attributes
 Cursors have four attributes…
 %FOUND

TRUE if the previous FETCH returned a row

Otherwise, FALSE
 %NOTFOUND

TRUE if the previous FETCH did NOT return a row

Otherwise, FALSE
 %ISOPEN

TRUE if the cursor is open,

Otherwise, FALSE
 %ROWCOUNT

Returns the # of rows that have been fetched by the cursor
so far
26
Implicit Cursors
 Used for INSERT, UPDATE, DELETE and SELECT…
INTO queries
 In SQL%NOTFOUND, SQL is called the implicit cursor
 PL/SQL opens & closes implicit cursors, which is also
called SQL cursor
 You don’t declare the implicit cursor
 If the WHERE clause fails…

For SELECT…INTO statement, then NO_DATA_FOUND error
is raised instead of SQL%NOTFOUND

For UPDATEs and DELETEs, SQL%NOTFOUND is set to
TRUE
27
Exceptions & Exception Handling
 What are exceptions & exception handlers?
 The method by which the program reacts & deals
with runtime errors
 How do they work?
 When a runtime error occurs, an exception is
raised
 Then control is passed to the exception handler
(i.e. the EXCEPTION section)
 Once control is passed to the exception handler,
there is no way to return to the executable section
28
Declaring (Explicit) Exceptions
 How are explicit exceptions declared?
 Defined within the DECLARE section
 Defined using the keyword data type EXCEPTION
 Name starts with e_
Example:
DECLARE
e_TooManyStudents EXCEPTION;
v_CurrentStudents NUMBER(3);
v_MaxStudentsNUMBER(3);
BEGIN
-- process data here
EXCEPTION
-- handle exceptions here
END;/
29
Raising Exceptions
 How are exceptions used?
 Within the executable section

Test a condition

If the condition evaluates to true, then use the
keyword RAISE to raise an exception

Can use the RAISE keyword with either predefined
exceptions or user-defined exceptions
30
Raising Exceptions
DECLARE
e_TooManyStudents EXCEPTION;
v_CurrentStudents NUMBER(3);
v_MaxStudents NUMBER(3);
BEGIN
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
IF v_CurrentStudents > v_MaxStudents THEN
RAISE e_TooManyStudents;
END IF;
EXCEPTION
-- handle exceptions here
END;/
31
Handling Exceptions
 Syntax
DECLARE
e_TooManyStudents EXCEPTION;
BEGIN
-- process data here
EXCEPTION
WHEN exception_Name1 THEN
statements;
WHEN exception_Name2 THEN
statements;
WHEN OTHERS THEN
statements;
END;/
 An exception can be handled by at most one
handler!
32
Handling Exceptions
DECLARE
e_TooManyStudents EXCEPTION;
v_CurrentStudents NUMBER(3);
v_MaxStudents NUMBER(3);
BEGIN
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
IF v_CurrentStudents > v_MaxStudents THEN
RAISE e_TooManyStudents;
END IF;
EXCEPTION
WHEN e_TooManyStudents THEN
INSERT INTO log_table (info)
VALUES ('History 101 has ' || v_CurrentStudents ||
'students: max allowed is ' || v_MaxStudents);
WHEN OTHERS THEN
INSERT INTO log_table (info) VALUES ('Another error occurred');
END;/
33
Handling Exceptions
 Built-in Functions

SQLCODE
 Returns the error code associated with the error
 Returns a value of 1 for user-defined exception
 Returns a value of 0 if no error with the last executed
statement

SQLERRM
 Returns the text of the error message
 Maximum length of an Oracle message is 512 characters
 Returns “User-defined Exception” for user-defined exception

RAISE_APPLICATION_ERROR
 RAISE_APPLICATION_ERROR(error#, error_message);
 Valid error #s: -20,000 and –20,999
 Error_Message MUST be less than 512 characters
34
Key Concepts (thus far)
 PL/SQL Block
 IF-THEN-ELSE
 CASE
 Loops
 Simple Loops
 WHILE Loops
 FOR Loops
 Records
 Explicit
 Implicit
 Cursors
 Explicit
 Implicit
 Exception Handling
 Naming
Conventions
35
Key Concepts: PL/SQL Block
 Basic building block/unit of PL/SQL programs

Three possible sections of a block

Declarative section (optional)

Executable section (required)
 Delimiters : BEGIN, END

Exception handling (optional)
 A block performs a logical unit of work in the
program
 Blocks can be nested
36
Key Concepts: IF-THEN-ELSE &
CASE
IF boolean_expression1 THEN
sequence_of_statements;
[ELSIF boolean_expression2
THEN
sequence_of_statements]
[ELSE
sequence_of_statements]
END IF;
Either specify test case after CASE
keyword & OR specify test after
WHEN keyword
CASE
WHEN boolean_expression1 THEN
sequence_of_statements;
WHEN boolean_expression2 THEN
sequence_of_statements;
ELSE
sequence_of_statements;
END CASE;
37
Key Concepts: PL/SQL Loops
 Used to execute a sequence of statements repeatedly
 When the number of iterations is unknown

Simple loops: executes at least once

WHILE loops: executes while the condition is true
 When the number of iterations is known in advance
 Numeric FOR Loops: executes a specific number of times
SIMPLE LOOP
LOOP
sequence_of_statements;
EXIT WHEN condition;
END LOOP;
WHILE LOOP
WHILE condition LOOP
sequence_of_statements;
END LOOP;
FOR LOOP
FOR loop_Counter IN IN [REVERSE] low..high
LOOP sequence_of_statements;
END LOOP;
38
Key Concepts: Records
 Records
 Explicit

Name begins with t_

Once declared, can be used to declare other variables

TYPE t_StudentRecord IS RECORD(
Student_ID NUMBER(5),
FirstName VARCHAR2(20),
LastName VARCHAR2(20));
v_StudentInfo t_StudentRecord;
 Implicit

%ROWTYPE
 Declares a record with the same structure as
v_StudentInfo student%ROWTYPE
 Use dot notation to refer to fields within record
39
Key Concepts: Cursors
 Cursors
 A pointer to the context area (active set)
 Name begins with c_
 Types: Explicit vs. Implicit

Explicit: (1) Declare, (2) Open, (3) Fetch & (4) Close
 Bind variables

Variables that are referenced in the cursor declaration

Must be defined BEFORE the cursor

Values examined ONLY at run time
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = ‘History’;
40
Key Concepts: Cursors
 Explicit for SELECT statement
 Implicit for all other DML statements
 Used for INSERT, UPDATE, DELETE and SELECT…INTO queries
 PL/SQL opens & closes implicit cursors, which is called SQL
cursor
 If the WHERE clause fails…

For SELECT…INTO statement, then NO_DATA_FOUND error is
raised instead of SQL%NOTFOUND

For UPDATEs and DELETEs, SQL%NOTFOUND is set to TRUE
 Four attributes: %FOUND, %NOTFOUND, %ISOPEN,
%ROWCOUNT
41
Key Concepts: Exceptions &
Exception Handling
 The method by which the program reacts & deals
with runtime errors
 When a runtime error occurs, an exception is
raised & control passes to the EXCEPTION section
 Once control is passed to the exception handler,
there is no way to return to the executable section
 User-defined exceptions
 Defined using the keyword data type EXCEPTION
 Use the keyword RAISE to raise an exception
42
Key Concepts: Exceptions &
Exception Handling
 Pre-defined exceptions
 NO_DATA_FOUND

no data found in SELECT…INTO
 TOO_MANY_ROWS

SELECT…INTO produces more than one row
 INVALID_CURSOR

Cursor already closed
 CURSOR_ALREADY_OPEN

Cursor already open
 ZERO_DIVIDE

Division by zero
 INVALID_NUMBER

Data is not numeric
 (see book for others)
43
Key Concepts: Exceptions &
Exception Handling
 Built-in Functions

SQLCODE
 Returns the error code associated with the error
 Returns a value of 1 for user-defined exception
 Returns a value of 0 if no error with the last executed statement

SQLERRM
 Returns the text of the error message
 Maximum length of an Oracle message is 512 characters
 Returns “User-defined Exception” for user-defined exception

RAISE_APPLICATION_ERROR
 RAISE_APPLICATION_ERROR(error#, error_message);
 Valid error #s: -20,000 and –20,999
 Error_Message MUST be less than 512 characters
 Used in procedures and functions
44
Key Concepts: Exceptions &
Exception Handling
 Syntax
DECLARE
e_TooManyStudents EXCEPTION;
BEGIN
-- process data here
EXCEPTION
WHEN exception_Name1 THEN
statements;
WHEN exception_Name2 THEN
statements;
WHEN OTHERS THEN
statements;
END;/
 An exception can be handled by at most one handler!
45
Key Concepts: Naming
Conventions
Item Naming Convention Note
primary keys *_pk * = tablename
*_fk1
*_fk2
*_fk#
*_u1 * = tablename
*_u2 * = tablename
*_u# # represents a sequential number
*_ck1 * = tablename
*_ck2 * = tablename
*_ck# # represents a sequential number
sequences *_sequence * = field name
script files *.sql * can be any name you choose
spooled files *.lst * can be any name you choose (e.g. TEST.LST)
cursors c_
exceptions e_
records t_ Explicit records
variables v_
foreign keys * = tablename; # = a sequential number
unique keys
checks
46
SQL Statements
DML in PL / SQL
 The DML statements permitted are:
 Select
 Insert
 Update
 Delete
47
DML in PL / SQL
Select
 SELECT statement in PL/SQL retrieves
data from a database table into:
 PL/SQL record
 set of PL/SQL variables
 Using SELECT in PL/SQL should only
return one row
 When you need to retrieve more than
one row from a table use a cursor
48
DML in PL / SQL
Select Syntax
SELECT { * | select_list_item }
INTO { PL/SQL_record | variables}
FROM table_reference
WHERE where_clause
 each variable must be compatible with its
associated select list item
 count of variables must be same as
number of items in list
 record should contain fields that
correspond to the select list in type and
count
49
select.sql
DECLARE
v_StudentRecord students%ROWTYPE;
v_Department classes.department%TYPE;
v_Course classes.course%TYPE;
BEGIN
SELECT *
INTO v_StudentRecord
FROM students
WHERE id = 10000;
SELECT department, course
INTO v_Department, v_Course
FROM classes
WHERE room_id = 99997;
END;
50
DML in PL / SQL
Insert
 The INSERT statement inserts data into a
database table
 There are two variations of the INSERT
command
 add one row to a table using the specified
VALUES list
 add one or several rows when the insert
command uses a SELECT statement
51
DML in PL / SQL
Insert Syntax
INSERT INTO table_reference
[(column_names)]
{VALUES (expression) | select_statement}
 use column names when the values

are listed in a different order than as defined
during table creation

Only a portion of the columns of the table
are used during insert
 table definition remains unchanged after
the new row is inserted
52
DML in PL / SQL
Insert
 The word VALUES must precede the
list of data to be inserted
 Regarding the values in the list:
 a character string must be in single
quotes
 numbers can stand by themselves
 dates must be in single quotes

In the default Oracle date format

Converted using TO_DATE function (this is
the suggested method)
53
Insert
Using Built-in Functions
 You can modify the contents of the values
before they are entered into a column of a
table
 by a VALUES list
 from a SELECT statement
 Use any of the built-in functions supported
by PL/SQL
 character
 date functions
 numeric
 conversion
54
insert.sql
DECLARE
v_StudentID students.id%TYPE;
BEGIN
SELECT student_sequence.NEXTVAL
INTO v_StudentID
FROM dual;
INSERT INTO students (id, first_name, last_name)
VALUES (v_StudentID, 'Timothy', 'Taller');
INSERT INTO students (id, first_name, last_name)
VALUES (student_sequence.NEXTVAL, 'Patrick', 'Poll');
END;
55
DML in PL / SQL
Insert with Select
 It is also possible to insert rows into a
table using the results of a SELECT
statement
 The results of a SELECT statement
 can return one or several rows based on
the WHERE clause
 can be a mix of columns from one or
more tables
56
DML in PL / SQL
Update
 Requires setting specific values for
each column you wish to change
 Specifying which row or rows to
modify using a WHERE clause
 You can use built-in functions in
setting a value for the update
57
Update in PL / SQL
Embedded SELECT
 It is possible to set values in an
UPDATE by embedding a SELECT
statement right in the middle of it
 SELECT has its own WHERE clause
 UPDATE has its own WHERE clause to
affect the rows
 You must be certain that the SELECT
will return no more than one row
58
Embedded SELECT
BEGIN
UPDATE comfort set Midnight =
(SELECT temperature
FROM weather
WHERE city = ‘MANCHESTER’)
WHERE city = ‘WALPOLE’
AND SampleDate = TO_DATE (’22-DEC-1999’, ‘DD-MON-YYYY’);
END;
59
DML in PL / SQL
Delete
 Removing a row or rows from a table
 WHERE clause is necessary to
removing only the rows you intend
 DELETE without the where clause will
delete all of the rows of a table
60
delete.sql
DECLARE
v_StudentCutoff NUMBER;
BEGIN
v_StudentCutoff := 10;
DELETE FROM classes
WHERE current_students < v_StudentCutoff;
DELETE FROM students
WHERE current_credits = 0
AND major = 'Economics';
END;
61
DML in PL / SQL
Truncate
 Another command for deleting records
from a table is the TRUNCATE command
TRUNCATE TABLE students;
 Does not operate the same as DELETE
 deletes all rows from a table
 cannot be rolled back
 records are unrecoverable
 does not run any DELETE triggers
 does not record any information in a snapshot
log
62
DML in PL / SQL
WHERE Clause
 The SELECT, UPDATE, and DELETE
statements all include the WHERE clause
 Defines the active set (set of rows):
 returned by a SELECT query
 Acted upon by an UPDATE or DELETE
 Consists of conditions, joined together by
the boolean operators AND, OR, and NOT
 Conditions usually take the form of
comparisons using the relational operators
(such as: =, <>, >, >=, <, <=)
63
DML in PL / SQL
WHERE Clause with Cursor
 The UPDATE, and DELETE statements
both include a WHERE clause with a
special syntax
 the WHERE CURRENT OF is used with a
cursor definition
 often processing done in a fetch loop
modifies the rows that have been
retrieved by a cursor
64
DML in PL / SQL
WHERE Clause with Cursor
 This method consists of two parts:
 the FOR UPDATE clause in the cursor
declaration
 the WHERE CURRENT OF clause in an
UPDATE or DELETE statement
65
forupdat.sql
DECLARE
v_NumCredits classes.num_credits%TYPE;
CURSOR c_RegisteredStudents IS
SELECT *
FROM students
WHERE id IN (SELECT student_id
FROM registered_students
WHERE department= 'HIS'
AND course = 101)
FOR UPDATE OF current_credits;
66
forupdat.sql (cont.)
BEGIN
FOR v_StudentInfo IN c_RegisteredStudents LOOP
SELECT num_credits
INTO v_NumCredits
FROM classes
WHERE department = 'HIS'
AND course = 101;
UPDATE students
SET current_credits = current_credits + v_NumCredits
WHERE CURRENT OF c_RegisteredStudents;
END LOOP;
COMMIT;
END;
67
DML in PL / SQL
Synonyms
 It is possible to create a synonym for
a:
 table
 view

sequence

stored

procedure

function

package
68
DML in PL / SQL
Synonyms
 The syntax for creating a synonym is:
CREATE SYNONYM synonym_name FOR
reference;
 Where:
 synonym_name – name of your synonym
 reference – schema object being referenced
69
Pseudocolums
Currval and Nextval
 CURRVAL and NEXTVAL are used with
sequences
 A sequence is an Oracle object used
to generate unique numbers
 Once created, you can access it with
its name by:
 sequence.CURRVAL
 sequence.NEXTVAL
70
Pseudocolums
Currval and Nextval
 Sequence values can be used in:
 SELECT list of a query
 VALUES clause of an INSERT
 SET clause of an UPDATE
 Sequence values cannot be used in:
 WHERE clause
 PL/SQL statement

More Related Content

PPTX
PL_SQL - II.pptx
PPTX
PDF
Cursors
PPTX
PL/SQL___________________________________
PPT
PPT
PPT
PL/SQL Stored Procedures And Cursors.ppt
PPT
PL_SQL - II.pptx
Cursors
PL/SQL___________________________________
PL/SQL Stored Procedures And Cursors.ppt

Similar to PLplsql study aboutmsnsjskakajsjslajwvsbsns (20)

PDF
Lecture Notes Unit5 chapter19 Cursor in Pl/SQL
PPT
Cursors in oracle
PPT
PPTX
Day 6.pptx
PPT
PLSQL Cursors
PPTX
PPT Lecture 2.3.4 Cursortttttttttttttttttttttttttttttttts.pptx
PPT
Les21[1]Writing Explicit Cursors
PPT
Procedures andcursors
PPT
Cursores explicitos
DOCX
Conditional Control
PPT
Basic cursors in oracle
PDF
4. plsql 1
PPTX
PL/SQL - CURSORS
PPTX
Stored procedures by thanveer danish melayi
PPTX
BBarters_PL_SQL gives cdemo details.pptx
PPTX
PLSQL_cur.pptx presentation uploadtttees
PPT
KMUTNB - Internet Programming 6/7
PPT
03 Writing Control Structures, Writing with Compatible Data Types Using Expli...
PPTX
Crime record management system project.pptx
PDF
Pl sql programme
Lecture Notes Unit5 chapter19 Cursor in Pl/SQL
Cursors in oracle
Day 6.pptx
PLSQL Cursors
PPT Lecture 2.3.4 Cursortttttttttttttttttttttttttttttttts.pptx
Les21[1]Writing Explicit Cursors
Procedures andcursors
Cursores explicitos
Conditional Control
Basic cursors in oracle
4. plsql 1
PL/SQL - CURSORS
Stored procedures by thanveer danish melayi
BBarters_PL_SQL gives cdemo details.pptx
PLSQL_cur.pptx presentation uploadtttees
KMUTNB - Internet Programming 6/7
03 Writing Control Structures, Writing with Compatible Data Types Using Expli...
Crime record management system project.pptx
Pl sql programme
Ad

Recently uploaded (20)

PDF
SMART SIGNAL TIMING FOR URBAN INTERSECTIONS USING REAL-TIME VEHICLE DETECTI...
PDF
COURSE DESCRIPTOR OF SURVEYING R24 SYLLABUS
PDF
PREDICTION OF DIABETES FROM ELECTRONIC HEALTH RECORDS
PDF
Artificial Superintelligence (ASI) Alliance Vision Paper.pdf
PPT
Total quality management ppt for engineering students
PPT
Introduction, IoT Design Methodology, Case Study on IoT System for Weather Mo...
PDF
86236642-Electric-Loco-Shed.pdf jfkduklg
PPTX
Current and future trends in Computer Vision.pptx
PDF
Visual Aids for Exploratory Data Analysis.pdf
PPTX
Information Storage and Retrieval Techniques Unit III
PDF
Automation-in-Manufacturing-Chapter-Introduction.pdf
PDF
BIO-INSPIRED HORMONAL MODULATION AND ADAPTIVE ORCHESTRATION IN S-AI-GPT
PPTX
introduction to high performance computing
PDF
Soil Improvement Techniques Note - Rabbi
PDF
Exploratory_Data_Analysis_Fundamentals.pdf
PDF
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
PPTX
CURRICULAM DESIGN engineering FOR CSE 2025.pptx
PPT
introduction to datamining and warehousing
PPTX
Artificial Intelligence
PDF
PPT on Performance Review to get promotions
SMART SIGNAL TIMING FOR URBAN INTERSECTIONS USING REAL-TIME VEHICLE DETECTI...
COURSE DESCRIPTOR OF SURVEYING R24 SYLLABUS
PREDICTION OF DIABETES FROM ELECTRONIC HEALTH RECORDS
Artificial Superintelligence (ASI) Alliance Vision Paper.pdf
Total quality management ppt for engineering students
Introduction, IoT Design Methodology, Case Study on IoT System for Weather Mo...
86236642-Electric-Loco-Shed.pdf jfkduklg
Current and future trends in Computer Vision.pptx
Visual Aids for Exploratory Data Analysis.pdf
Information Storage and Retrieval Techniques Unit III
Automation-in-Manufacturing-Chapter-Introduction.pdf
BIO-INSPIRED HORMONAL MODULATION AND ADAPTIVE ORCHESTRATION IN S-AI-GPT
introduction to high performance computing
Soil Improvement Techniques Note - Rabbi
Exploratory_Data_Analysis_Fundamentals.pdf
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
CURRICULAM DESIGN engineering FOR CSE 2025.pptx
introduction to datamining and warehousing
Artificial Intelligence
PPT on Performance Review to get promotions
Ad

PLplsql study aboutmsnsjskakajsjslajwvsbsns

  • 1. 1 Agenda  Summary of last class  Loops  Simple Loops  WHILE Loops  FOR Loops  Records  Cursors
  • 2. 2 Records  User-defined composite types  Provides a way to treat separate but logically related variables as a unit  Similar to “structures” in C  Use the dot notation to refer to fields within a record  v_StudentInfo.FirstName := ‘John’;  In order to copy one record to another record, both records must be of the same record type
  • 3. 3 Records  Syntax: DECLARE TYPE t_StudentRecord IS RECORD( Student_ID NUMBER(5), FirstName VARCHAR2(20), LastName VARCHAR2(20) ); v_StudentInfo t_StudentRecord; BEGIN -- Process data here EXCEPTION -- Error handling would go here END; / Use the dot notation to refer to fields within a record. Example: v_StudentInfo.FirstName := ‘John’;
  • 4. 4 Records  To declare a record with the same structure (i.e. fields & field types) as a database row, use %ROWTYPE  Syntax: DECLARE v_StudentInfo student%ROWTYPE; BEGIN -- Process data here EXCEPTION -- Error handling would go here END; / NOTE: Any NOT NULL constraints that are defined for a column within the table will not be applicable to the declared record when %ROWTYPE is used.
  • 5. 5 Cursors  A pointer to the context area  Context area contains:  Number of rows processed by the statement  A pointer to the parsed representation of the statement  In the case of a query, the set of rows returned by the query (i.e. the active set, active recordset)  Follows standard declaration and scoping  Naming Convention: c_CursorName  Cursor Types:  Explicit: user-defined  Implicit: system-defined
  • 6. 6 Explicit Cursors  To use explicit cursors…  Declare the cursor  Open the cursor  Fetch the results into PL/SQL variables  Close the cursor
  • 7. 7 Declaring Cursors DECLARE v_StudentID students.id%TYPE; v_FirstName students.first_name%TYPE; v_LastName students.last_name%TYPE; CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = ‘History’; BEGIN -- open cursor, fetch records & then close cursor here END; /
  • 8. 8 OPEN Cursor DECLARE v_StudentID students.id%TYPE; v_FirstName students.first_name%TYPE; v_LastName students.last_name%TYPE; CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = ‘History’; BEGIN OPEN c_HistoryStudents; -- fetch records & then close cursor here END; /
  • 9. 9 FETCH Records DECLARE v_StudentID students.id%TYPE; v_FirstName students.first_name%TYPE; v_LastName students.last_name%TYPE; CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = ‘History’; BEGIN OPEN c_HistoryStudents; LOOP FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName; EXIT WHEN c_HistoryStudents%NOTFOUND; -- do something with the values that are now in the variables END LOOP -- close cursor here END;/
  • 10. 10 Close Cursor DECLARE v_StudentID students.id%TYPE; v_FirstName students.first_name%TYPE; v_LastName students.last_name%TYPE; CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = ‘History’; BEGIN OPEN c_HistoryStudents; LOOP FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName; DBMS_OUTPUT.PUT_LINE(v_StudentID, v_FirstName, v_LastName); EXIT WHEN c_HistoryStudents%NOTFOUND; -- do something with the values that are now stored in the variables END LOOP CLOSE c_HistoryStudents; END; /
  • 11. 11 Cursor Attributes  Cursors have four attributes…  %FOUND  TRUE if the previous FETCH returned a row  Otherwise, FALSE  %NOTFOUND  TRUE if the previous FETCH did NOT return a row  Otherwise, FALSE  %ISOPEN  TRUE if the cursor is open,  Otherwise, FALSE  %ROWCOUNT  Returns the # of rows that have been fetched by the cursor so far
  • 12. 12 Cursor Fetch Loop: WHILE Loop DECLARE CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = 'History'; v_StudentData c_HistoryStudents%ROWTYPE; BEGIN OPEN c_HistoryStudents; FETCH c_HistoryStudents INTO v_StudentData; WHILE c_HistoryStudents%FOUND LOOP INSERT INTO registered_students (student_id, department, course) VALUES (v_StudentData.ID, 'HIS', 301); INSERT INTO temp_table (num_col, char_col) VALUES (v_StudentData.ID, v_StudentData.first_name || ' ' || v_StudentData.last_name); FETCH c_HistoryStudents INTO v_StudentData; END LOOP; CLOSE c_HistoryStudents; END;/
  • 13. 13 Take Home Exercise #1  Write an anonymous PL/SQL block that…  Defines a cursor that points to a record set that contains the sailors’ names, reservation date and boat id where the boat color is red  Opens the cursor  Uses a simple loop to fetch each record in the active set  Displays each last name, reservation date and boat id for each record to the output screen  Schema Sailor (sid, sname, rating, age) Boat (bid, bname, color) Reservation(sid, bid, day)
  • 14. 14 Cursor with Bind Variable(s) DECLARE v_StudentID students.id%TYPE; v_FirstName students.first_name%TYPE; v_LastName students.last_name%TYPE; v_Major students.major%TYPE; CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = v_Major; BEGIN v_Major := ‘History’; OPEN c_HistoryStudents; LOOP FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName; EXIT WHEN c_HistoryStudents%NOTFOUND; -- do something with the values that are now stored in the variables END LOOP CLOSE c_HistoryStudents; END; /
  • 15. 15 Bind Variables  What are bind variables?  Variables that are referenced in the cursor declaration  They must be declared BEFORE the cursor is declared  i.e. variable must be declared before it can be used  The values of bind variables are examined ONLY when the cursor is opened (at run time)
  • 16. 16 Explicit Cursors with Bind Variables  To use explicit cursors with bind variables…  Declare bind variables  Then declare the cursor  Assign values to bind variables  Open the cursor  Fetch the results into PL/SQL variables  Close the cursor
  • 17. 17 Take Home Exercise #2  Modify your answer for Class Exercise #1 such that…  It uses bind variables for color of boat instead of hard-coding the values in the WHERE clause  The FETCH is done inside of a WHILE loop instead of inside of a simple loop.
  • 18. 18 Implicit Cursors  Used for INSERT, UPDATE, DELETE and SELECT… INTO queries  In SQL%NOTFOUND, SQL is called the implicit cursor  PL/SQL opens & closes implicit cursors, which is also called SQL cursor  You don’t declare the implicit cursor  If the WHERE clause fails…  For SELECT…INTO statement, then NO_DATA_FOUND error is raised instead of SQL%NOTFOUND  For UPDATEs and DELETEs, SQL%NOTFOUND is set to TRUE
  • 19. 19 Example of Implicit Cursor BEGIN UPDATE rooms SET number_seats = 100 WHERE room_id = 99980; -- If the previous UPDATE statement didn't match any rows, -- insert a new row into the rooms table. IF SQL%NOTFOUND THEN INSERT INTO rooms (room_id, number_seats) VALUES (99980, 100); END IF; END; /
  • 20. 20 Example of Implicit Cursor BEGIN UPDATE rooms SET number_seats = 100 WHERE room_id = 99980; -- If the previous UPDATE statement didn't match any rows, -- insert a new row into the rooms table. IF SQL%ROWCOUNT = 0 THEN INSERT INTO rooms (room_id, number_seats) VALUES (99980, 100); END IF; END;
  • 21. 21 -- Example of SELECT…INTO and NO_DATA_FOUND set serveroutput on DECLARE -- Record to hold room information. v_RoomData rooms%ROWTYPE; BEGIN -- Retrieve information about room ID -1. SELECT * INTO v_RoomData FROM rooms WHERE room_id = -1; -- The following statement will never be executed, since -- control passes immediately to the exception handler. IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('SQL%NOTFOUND is true!'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND raised!'); END; /
  • 22. 22 SHOW ERRORS  To display error message  SQL> SHOW ERRORS;
  • 23. 23 Summary of last class  Cursors  A pointer to the context area (active set)  Name begins with c_  Defined within the DECLARE section  Types: Explicit vs. Implicit  Explicit: (1) Declare, (2) Open, (3) Fetch & (4) Close  Bind variables  Variables that are referenced in the cursor declaration  Must be defined BEFORE the cursor  Values examined ONLY at run time CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = ‘History’;
  • 24. 24 Take Home Exercise #1 DECLARE CURSOR c_Reservations IS SELECT s.sname, r.day, r.bid FROM Sailor S, Reserve R, Boat B WHERE R.sid = s.sid AND R.bid = b.bid AND B.color = ‘red’; v_Reservation c_Reservations%ROWTYPE; BEGIN OPEN c_Reservations; LOOP FETCH c_Reservations INTO v_Reservation; EXIT WHEN c_Reservations%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_Reservation.sname||’ ‘||v_Reservation.day||’ v_Reservation.bid); END LOOP; CLOSE c_Reservations; END;/ Reserve sid bid day 22 101 10/10/98 22 102 10/10/98 22 103 10/8/98 22 104 10/7/98 31 102 11/10/98 31 103 11/6/98 31 104 11/12/98 64 101 9/5/98 64 102 9/8/98 74 103 9/8/98 Boat bid bname color 101 Interlake blue 102 Interlake red 103 Clipper green 104 Marine red Sailor sid sname rating age 22 Dustin 7 45.0 29 Brutus 1 33.0 31 Lubber 8 55.5 32 Andy 8 25.5 58 Rusty 10 35.0 64 Horatio 7 35.0 71 Zorba 10 16.0 74 Horatio 9 35.0 85 Art 3 25.5 95 Bob 3 63.5
  • 25. 25 Cursor Attributes  Cursors have four attributes…  %FOUND  TRUE if the previous FETCH returned a row  Otherwise, FALSE  %NOTFOUND  TRUE if the previous FETCH did NOT return a row  Otherwise, FALSE  %ISOPEN  TRUE if the cursor is open,  Otherwise, FALSE  %ROWCOUNT  Returns the # of rows that have been fetched by the cursor so far
  • 26. 26 Implicit Cursors  Used for INSERT, UPDATE, DELETE and SELECT… INTO queries  In SQL%NOTFOUND, SQL is called the implicit cursor  PL/SQL opens & closes implicit cursors, which is also called SQL cursor  You don’t declare the implicit cursor  If the WHERE clause fails…  For SELECT…INTO statement, then NO_DATA_FOUND error is raised instead of SQL%NOTFOUND  For UPDATEs and DELETEs, SQL%NOTFOUND is set to TRUE
  • 27. 27 Exceptions & Exception Handling  What are exceptions & exception handlers?  The method by which the program reacts & deals with runtime errors  How do they work?  When a runtime error occurs, an exception is raised  Then control is passed to the exception handler (i.e. the EXCEPTION section)  Once control is passed to the exception handler, there is no way to return to the executable section
  • 28. 28 Declaring (Explicit) Exceptions  How are explicit exceptions declared?  Defined within the DECLARE section  Defined using the keyword data type EXCEPTION  Name starts with e_ Example: DECLARE e_TooManyStudents EXCEPTION; v_CurrentStudents NUMBER(3); v_MaxStudentsNUMBER(3); BEGIN -- process data here EXCEPTION -- handle exceptions here END;/
  • 29. 29 Raising Exceptions  How are exceptions used?  Within the executable section  Test a condition  If the condition evaluates to true, then use the keyword RAISE to raise an exception  Can use the RAISE keyword with either predefined exceptions or user-defined exceptions
  • 30. 30 Raising Exceptions DECLARE e_TooManyStudents EXCEPTION; v_CurrentStudents NUMBER(3); v_MaxStudents NUMBER(3); BEGIN SELECT current_students, max_students INTO v_CurrentStudents, v_MaxStudents FROM classes WHERE department = 'HIS' AND course = 101; IF v_CurrentStudents > v_MaxStudents THEN RAISE e_TooManyStudents; END IF; EXCEPTION -- handle exceptions here END;/
  • 31. 31 Handling Exceptions  Syntax DECLARE e_TooManyStudents EXCEPTION; BEGIN -- process data here EXCEPTION WHEN exception_Name1 THEN statements; WHEN exception_Name2 THEN statements; WHEN OTHERS THEN statements; END;/  An exception can be handled by at most one handler!
  • 32. 32 Handling Exceptions DECLARE e_TooManyStudents EXCEPTION; v_CurrentStudents NUMBER(3); v_MaxStudents NUMBER(3); BEGIN SELECT current_students, max_students INTO v_CurrentStudents, v_MaxStudents FROM classes WHERE department = 'HIS' AND course = 101; IF v_CurrentStudents > v_MaxStudents THEN RAISE e_TooManyStudents; END IF; EXCEPTION WHEN e_TooManyStudents THEN INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents || 'students: max allowed is ' || v_MaxStudents); WHEN OTHERS THEN INSERT INTO log_table (info) VALUES ('Another error occurred'); END;/
  • 33. 33 Handling Exceptions  Built-in Functions  SQLCODE  Returns the error code associated with the error  Returns a value of 1 for user-defined exception  Returns a value of 0 if no error with the last executed statement  SQLERRM  Returns the text of the error message  Maximum length of an Oracle message is 512 characters  Returns “User-defined Exception” for user-defined exception  RAISE_APPLICATION_ERROR  RAISE_APPLICATION_ERROR(error#, error_message);  Valid error #s: -20,000 and –20,999  Error_Message MUST be less than 512 characters
  • 34. 34 Key Concepts (thus far)  PL/SQL Block  IF-THEN-ELSE  CASE  Loops  Simple Loops  WHILE Loops  FOR Loops  Records  Explicit  Implicit  Cursors  Explicit  Implicit  Exception Handling  Naming Conventions
  • 35. 35 Key Concepts: PL/SQL Block  Basic building block/unit of PL/SQL programs  Three possible sections of a block  Declarative section (optional)  Executable section (required)  Delimiters : BEGIN, END  Exception handling (optional)  A block performs a logical unit of work in the program  Blocks can be nested
  • 36. 36 Key Concepts: IF-THEN-ELSE & CASE IF boolean_expression1 THEN sequence_of_statements; [ELSIF boolean_expression2 THEN sequence_of_statements] [ELSE sequence_of_statements] END IF; Either specify test case after CASE keyword & OR specify test after WHEN keyword CASE WHEN boolean_expression1 THEN sequence_of_statements; WHEN boolean_expression2 THEN sequence_of_statements; ELSE sequence_of_statements; END CASE;
  • 37. 37 Key Concepts: PL/SQL Loops  Used to execute a sequence of statements repeatedly  When the number of iterations is unknown  Simple loops: executes at least once  WHILE loops: executes while the condition is true  When the number of iterations is known in advance  Numeric FOR Loops: executes a specific number of times SIMPLE LOOP LOOP sequence_of_statements; EXIT WHEN condition; END LOOP; WHILE LOOP WHILE condition LOOP sequence_of_statements; END LOOP; FOR LOOP FOR loop_Counter IN IN [REVERSE] low..high LOOP sequence_of_statements; END LOOP;
  • 38. 38 Key Concepts: Records  Records  Explicit  Name begins with t_  Once declared, can be used to declare other variables  TYPE t_StudentRecord IS RECORD( Student_ID NUMBER(5), FirstName VARCHAR2(20), LastName VARCHAR2(20)); v_StudentInfo t_StudentRecord;  Implicit  %ROWTYPE  Declares a record with the same structure as v_StudentInfo student%ROWTYPE  Use dot notation to refer to fields within record
  • 39. 39 Key Concepts: Cursors  Cursors  A pointer to the context area (active set)  Name begins with c_  Types: Explicit vs. Implicit  Explicit: (1) Declare, (2) Open, (3) Fetch & (4) Close  Bind variables  Variables that are referenced in the cursor declaration  Must be defined BEFORE the cursor  Values examined ONLY at run time CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = ‘History’;
  • 40. 40 Key Concepts: Cursors  Explicit for SELECT statement  Implicit for all other DML statements  Used for INSERT, UPDATE, DELETE and SELECT…INTO queries  PL/SQL opens & closes implicit cursors, which is called SQL cursor  If the WHERE clause fails…  For SELECT…INTO statement, then NO_DATA_FOUND error is raised instead of SQL%NOTFOUND  For UPDATEs and DELETEs, SQL%NOTFOUND is set to TRUE  Four attributes: %FOUND, %NOTFOUND, %ISOPEN, %ROWCOUNT
  • 41. 41 Key Concepts: Exceptions & Exception Handling  The method by which the program reacts & deals with runtime errors  When a runtime error occurs, an exception is raised & control passes to the EXCEPTION section  Once control is passed to the exception handler, there is no way to return to the executable section  User-defined exceptions  Defined using the keyword data type EXCEPTION  Use the keyword RAISE to raise an exception
  • 42. 42 Key Concepts: Exceptions & Exception Handling  Pre-defined exceptions  NO_DATA_FOUND  no data found in SELECT…INTO  TOO_MANY_ROWS  SELECT…INTO produces more than one row  INVALID_CURSOR  Cursor already closed  CURSOR_ALREADY_OPEN  Cursor already open  ZERO_DIVIDE  Division by zero  INVALID_NUMBER  Data is not numeric  (see book for others)
  • 43. 43 Key Concepts: Exceptions & Exception Handling  Built-in Functions  SQLCODE  Returns the error code associated with the error  Returns a value of 1 for user-defined exception  Returns a value of 0 if no error with the last executed statement  SQLERRM  Returns the text of the error message  Maximum length of an Oracle message is 512 characters  Returns “User-defined Exception” for user-defined exception  RAISE_APPLICATION_ERROR  RAISE_APPLICATION_ERROR(error#, error_message);  Valid error #s: -20,000 and –20,999  Error_Message MUST be less than 512 characters  Used in procedures and functions
  • 44. 44 Key Concepts: Exceptions & Exception Handling  Syntax DECLARE e_TooManyStudents EXCEPTION; BEGIN -- process data here EXCEPTION WHEN exception_Name1 THEN statements; WHEN exception_Name2 THEN statements; WHEN OTHERS THEN statements; END;/  An exception can be handled by at most one handler!
  • 45. 45 Key Concepts: Naming Conventions Item Naming Convention Note primary keys *_pk * = tablename *_fk1 *_fk2 *_fk# *_u1 * = tablename *_u2 * = tablename *_u# # represents a sequential number *_ck1 * = tablename *_ck2 * = tablename *_ck# # represents a sequential number sequences *_sequence * = field name script files *.sql * can be any name you choose spooled files *.lst * can be any name you choose (e.g. TEST.LST) cursors c_ exceptions e_ records t_ Explicit records variables v_ foreign keys * = tablename; # = a sequential number unique keys checks
  • 46. 46 SQL Statements DML in PL / SQL  The DML statements permitted are:  Select  Insert  Update  Delete
  • 47. 47 DML in PL / SQL Select  SELECT statement in PL/SQL retrieves data from a database table into:  PL/SQL record  set of PL/SQL variables  Using SELECT in PL/SQL should only return one row  When you need to retrieve more than one row from a table use a cursor
  • 48. 48 DML in PL / SQL Select Syntax SELECT { * | select_list_item } INTO { PL/SQL_record | variables} FROM table_reference WHERE where_clause  each variable must be compatible with its associated select list item  count of variables must be same as number of items in list  record should contain fields that correspond to the select list in type and count
  • 49. 49 select.sql DECLARE v_StudentRecord students%ROWTYPE; v_Department classes.department%TYPE; v_Course classes.course%TYPE; BEGIN SELECT * INTO v_StudentRecord FROM students WHERE id = 10000; SELECT department, course INTO v_Department, v_Course FROM classes WHERE room_id = 99997; END;
  • 50. 50 DML in PL / SQL Insert  The INSERT statement inserts data into a database table  There are two variations of the INSERT command  add one row to a table using the specified VALUES list  add one or several rows when the insert command uses a SELECT statement
  • 51. 51 DML in PL / SQL Insert Syntax INSERT INTO table_reference [(column_names)] {VALUES (expression) | select_statement}  use column names when the values  are listed in a different order than as defined during table creation  Only a portion of the columns of the table are used during insert  table definition remains unchanged after the new row is inserted
  • 52. 52 DML in PL / SQL Insert  The word VALUES must precede the list of data to be inserted  Regarding the values in the list:  a character string must be in single quotes  numbers can stand by themselves  dates must be in single quotes  In the default Oracle date format  Converted using TO_DATE function (this is the suggested method)
  • 53. 53 Insert Using Built-in Functions  You can modify the contents of the values before they are entered into a column of a table  by a VALUES list  from a SELECT statement  Use any of the built-in functions supported by PL/SQL  character  date functions  numeric  conversion
  • 54. 54 insert.sql DECLARE v_StudentID students.id%TYPE; BEGIN SELECT student_sequence.NEXTVAL INTO v_StudentID FROM dual; INSERT INTO students (id, first_name, last_name) VALUES (v_StudentID, 'Timothy', 'Taller'); INSERT INTO students (id, first_name, last_name) VALUES (student_sequence.NEXTVAL, 'Patrick', 'Poll'); END;
  • 55. 55 DML in PL / SQL Insert with Select  It is also possible to insert rows into a table using the results of a SELECT statement  The results of a SELECT statement  can return one or several rows based on the WHERE clause  can be a mix of columns from one or more tables
  • 56. 56 DML in PL / SQL Update  Requires setting specific values for each column you wish to change  Specifying which row or rows to modify using a WHERE clause  You can use built-in functions in setting a value for the update
  • 57. 57 Update in PL / SQL Embedded SELECT  It is possible to set values in an UPDATE by embedding a SELECT statement right in the middle of it  SELECT has its own WHERE clause  UPDATE has its own WHERE clause to affect the rows  You must be certain that the SELECT will return no more than one row
  • 58. 58 Embedded SELECT BEGIN UPDATE comfort set Midnight = (SELECT temperature FROM weather WHERE city = ‘MANCHESTER’) WHERE city = ‘WALPOLE’ AND SampleDate = TO_DATE (’22-DEC-1999’, ‘DD-MON-YYYY’); END;
  • 59. 59 DML in PL / SQL Delete  Removing a row or rows from a table  WHERE clause is necessary to removing only the rows you intend  DELETE without the where clause will delete all of the rows of a table
  • 60. 60 delete.sql DECLARE v_StudentCutoff NUMBER; BEGIN v_StudentCutoff := 10; DELETE FROM classes WHERE current_students < v_StudentCutoff; DELETE FROM students WHERE current_credits = 0 AND major = 'Economics'; END;
  • 61. 61 DML in PL / SQL Truncate  Another command for deleting records from a table is the TRUNCATE command TRUNCATE TABLE students;  Does not operate the same as DELETE  deletes all rows from a table  cannot be rolled back  records are unrecoverable  does not run any DELETE triggers  does not record any information in a snapshot log
  • 62. 62 DML in PL / SQL WHERE Clause  The SELECT, UPDATE, and DELETE statements all include the WHERE clause  Defines the active set (set of rows):  returned by a SELECT query  Acted upon by an UPDATE or DELETE  Consists of conditions, joined together by the boolean operators AND, OR, and NOT  Conditions usually take the form of comparisons using the relational operators (such as: =, <>, >, >=, <, <=)
  • 63. 63 DML in PL / SQL WHERE Clause with Cursor  The UPDATE, and DELETE statements both include a WHERE clause with a special syntax  the WHERE CURRENT OF is used with a cursor definition  often processing done in a fetch loop modifies the rows that have been retrieved by a cursor
  • 64. 64 DML in PL / SQL WHERE Clause with Cursor  This method consists of two parts:  the FOR UPDATE clause in the cursor declaration  the WHERE CURRENT OF clause in an UPDATE or DELETE statement
  • 65. 65 forupdat.sql DECLARE v_NumCredits classes.num_credits%TYPE; CURSOR c_RegisteredStudents IS SELECT * FROM students WHERE id IN (SELECT student_id FROM registered_students WHERE department= 'HIS' AND course = 101) FOR UPDATE OF current_credits;
  • 66. 66 forupdat.sql (cont.) BEGIN FOR v_StudentInfo IN c_RegisteredStudents LOOP SELECT num_credits INTO v_NumCredits FROM classes WHERE department = 'HIS' AND course = 101; UPDATE students SET current_credits = current_credits + v_NumCredits WHERE CURRENT OF c_RegisteredStudents; END LOOP; COMMIT; END;
  • 67. 67 DML in PL / SQL Synonyms  It is possible to create a synonym for a:  table  view  sequence  stored  procedure  function  package
  • 68. 68 DML in PL / SQL Synonyms  The syntax for creating a synonym is: CREATE SYNONYM synonym_name FOR reference;  Where:  synonym_name – name of your synonym  reference – schema object being referenced
  • 69. 69 Pseudocolums Currval and Nextval  CURRVAL and NEXTVAL are used with sequences  A sequence is an Oracle object used to generate unique numbers  Once created, you can access it with its name by:  sequence.CURRVAL  sequence.NEXTVAL
  • 70. 70 Pseudocolums Currval and Nextval  Sequence values can be used in:  SELECT list of a query  VALUES clause of an INSERT  SET clause of an UPDATE  Sequence values cannot be used in:  WHERE clause  PL/SQL statement