SlideShare a Scribd company logo
3-1 Copyright © 2006, Oracle. All rights reserved.
Writing Control Structures
Working with Composite
Data Types
Using Explicit Cursors
3
Copyright © 2006, Oracle. All rights reserved.
Working with Composite
Data Types
3-3 Copyright © 2006, Oracle. All rights reserved.
Composite Data Types
• Can hold multiple values (unlike scalar types)
• Are of two types:
– PL/SQL records
– PL/SQL collections
– INDEX BY tables or associative arrays
– Nested table
– VARRAY
3-4 Copyright © 2006, Oracle. All rights reserved.
Composite Data Types
• Use PL/SQL records when you want to store
values of different data types but only one
occurrence at a time.
• Use PL/SQL collections when you want to store
values of the same data type.
3-5 Copyright © 2006, Oracle. All rights reserved.
PL/SQL Records
• Must contain one or more components (called
fields) of any scalar, RECORD, or INDEX BY table
data type
• Are similar to structures in most 3GL languages
(including C and C++)
• Are user defined and can be a subset of a row in a
table
• Treat a collection of fields as a logical unit
• Are convenient for fetching a row of data from a
table for processing
3-6 Copyright © 2006, Oracle. All rights reserved.
Creating a PL/SQL Record
Syntax:
TYPE type_name IS RECORD
(field_declaration[, field_declaration]…);
field_name {field_type | variable%TYPE
| table.column%TYPE | table%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]
identifier type_name;
1
2
field_declaration:
3-7 Copyright © 2006, Oracle. All rights reserved.
PL/SQL Record Structure
Example
100 King AD_PRES
employee_id number(6) last_name varchar2(25) job_id varchar2(10)
Field2 (data type) Field3 (data type)Field1 (data type)
Field2 (data type) Field3 (data type)Field1 (data type)
3-8 Copyright © 2006, Oracle. All rights reserved.
%ROWTYPE Attribute
• Declare a variable according to a collection of
columns in a database table or view.
• Prefix %ROWTYPE with the database table or view.
• Fields in the record take their names and data
types from the columns of the table or view.
Syntax:
DECLARE
identifier reference%ROWTYPE;
3-10 Copyright © 2006, Oracle. All rights reserved.
Advantages of Using %ROWTYPE
• The number and data types of the underlying
database columns need not be known—and in fact
might change at run time.
• The %ROWTYPE attribute is useful when retrieving a
row with the SELECT * statement.
3-11 Copyright © 2006, Oracle. All rights reserved.
INDEX BY Tables or Associative Arrays
• Are PL/SQL structures with two columns:
– Primary key of integer or string data type
– Column of scalar or record data type
• Are unconstrained in size. However, the size
depends on the values that the key data type can
hold.
3-12 Copyright © 2006, Oracle. All rights reserved.
Creating an INDEX BY Table
Syntax:
Declare an INDEX BY table to store the last names of
employees:
TYPE type_name IS TABLE OF
{column_type | variable%TYPE
| table.column%TYPE} [NOT NULL]
| table%ROWTYPE
[INDEX BY PLS_INTEGER | BINARY_INTEGER
| VARCHAR2(<size>)];
identifier type_name;
...
TYPE ename_table_type IS TABLE OF
employees.last_name%TYPE
INDEX BY PLS_INTEGER;
...
ename_table ename_table_type;
3-13 Copyright © 2006, Oracle. All rights reserved.
INDEX BY Table Structure
Unique key Value
... ...
1 Jones
5 Smith
3 Maduro
... ...
PLS_INTEGER Scalar
3-14 Copyright © 2006, Oracle. All rights reserved.
Using INDEX BY Table Methods
The following methods make INDEX BY tables easier
to use:
• EXISTS
• COUNT
• FIRST and LAST
• PRIOR
• NEXT
• DELETE
3-15 Copyright © 2006, Oracle. All rights reserved.
INDEX BY Table of Records
Define an INDEX BY table variable to hold an entire row
from a table.
Example
DECLARE
TYPE dept_table_type IS TABLE OF
departments%ROWTYPE
INDEX BY PLS_INTEGER;
dept_table dept_table_type;
-- Each element of dept_table is a record
3-16 Copyright © 2006, Oracle. All rights reserved.
Nested Tables
1
2
3
4
..
2 GB
Bombay
Sydney
Oxford
London
....
3-17 Copyright © 2006, Oracle. All rights reserved.
Bombay
Sydney
Oxford
London
....
VARRAY
Tokyo
1
2
3
4
..
10
3
Copyright © 2006, Oracle. All rights reserved.
Using Explicit Cursors
3-19 Copyright © 2006, Oracle. All rights reserved.
Cursors
Every SQL statement executed by the Oracle server
has an associated individual cursor:
• Implicit cursors: Declared and managed by
PL/SQL for all DML and PL/SQL SELECT
statements
• Explicit cursors: Declared and managed by the
programmer
3-20 Copyright © 2006, Oracle. All rights reserved.
Explicit Cursor Operations
Active set
Table
100 King AD_PRES
101 Kochhar AD_VP
102 De Haan AD_VP
. . .
. . .
. . .
139 Seo ST_CLERK
140 Patel ST_CLERK
. . .
3-21 Copyright © 2006, Oracle. All rights reserved.
Controlling Explicit Cursors
• Load the
current
row into
variables.
FETCH
• Test for
existing
rows.
EMPTY?
• Return to
FETCH if
rows are
found.
No
• Release the
active set.
CLOSE
Yes
• Create a
named
SQL area.
DECLARE
• Identify the
active set.
OPEN
3-22 Copyright © 2006, Oracle. All rights reserved.
Controlling Explicit Cursors
Fetch a row.
Close the cursor.
Cursor
pointer
Open the cursor.1
2
3
Cursor
pointer
Cursor
pointer
3-23 Copyright © 2006, Oracle. All rights reserved.
Cursor FOR Loops
Syntax:
• The cursor FOR loop is a shortcut to process
explicit cursors.
• Implicit open, fetch, exit, and close occur.
• The record is implicitly declared.
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;
3-24 Copyright © 2006, Oracle. All rights reserved.
Explicit Cursor Attributes
Obtain status information about a cursor.
Boolean Evaluates to TRUE if the cursor is
open
Evaluates to TRUE if the most recent
fetch does not return a row
Evaluates to TRUE if the most recent
fetch returns a row; complement of
%NOTFOUND
Evaluates to the total number of
rows returned so far
Boolean
Boolean
Number
%ISOPEN
%NOTFOUN
D
%FOUND
%ROWCOUN
T
Attribute Type Description
3-25 Copyright © 2006, Oracle. All rights reserved.
Cursors with Parameters
Syntax:
• Pass parameter values to a cursor when the
cursor is opened and the query is executed.
• Open an explicit cursor several times with a
different active set each time.
CURSOR cursor_name
[(parameter_name datatype, ...)]
IS
select_statement;
OPEN cursor_name(parameter_value,.....) ;
3-26 Copyright © 2006, Oracle. All rights reserved.
FOR UPDATE Clause
Syntax:
• Use explicit locking to deny access to other
sessions for the duration of a transaction.
• Lock the rows before the update or delete.
SELECT ...
FROM ...
FOR UPDATE [OF column_reference][NOWAIT | WAIT n];
3-27 Copyright © 2006, Oracle. All rights reserved.
WHERE CURRENT OF Clause
Syntax:
• Use cursors to update or delete the current row.
• Include the FOR UPDATE clause in the cursor query
to lock the rows first.
• Use the WHERE CURRENT OF clause to reference the
current row from an explicit cursor.
WHERE CURRENT OF cursor ;
UPDATE employees
SET salary = ...
WHERE CURRENT OF emp_cursor;
3-28 Copyright © 2006, Oracle. All rights reserved.
Class 3: Overview
This practice covers the following topics:
• Performing iterative steps by using the loop
structure
• Declaring INDEX BY tables
• Processing data by using INDEX BY tables
• Declaring a PL/SQL record
• Processing data by using a PL/SQL record
3-29 Copyright © 2006, Oracle. All rights reserved.
Class 3: Overview
This practice covers the following topics:
• Declaring and using explicit cursors to query rows
of a table
• Using a cursor FOR loop
• Applying cursor attributes to test the cursor status
• Declaring and using cursors with parameters
• Using the FOR UPDATE and WHERE CURRENT OF
clauses

More Related Content

PPT
07 Using Oracle-Supported Package in Application Development
rehaniltifat
 
PPT
06 Using More Package Concepts
rehaniltifat
 
PPT
1 - Introduction to PL/SQL
rehaniltifat
 
PPT
02 Writing Executable Statments
rehaniltifat
 
PPT
05 Creating Stored Procedures
rehaniltifat
 
PDF
PL/SQL Complete Tutorial. All Topics Covered
Danish Mehraj
 
PPTX
PL/SQL Fundamentals I
Nick Buytaert
 
PPT
09 Managing Dependencies
rehaniltifat
 
07 Using Oracle-Supported Package in Application Development
rehaniltifat
 
06 Using More Package Concepts
rehaniltifat
 
1 - Introduction to PL/SQL
rehaniltifat
 
02 Writing Executable Statments
rehaniltifat
 
05 Creating Stored Procedures
rehaniltifat
 
PL/SQL Complete Tutorial. All Topics Covered
Danish Mehraj
 
PL/SQL Fundamentals I
Nick Buytaert
 
09 Managing Dependencies
rehaniltifat
 

What's hot (20)

PPT
Oracle sql joins
redro
 
PPTX
4. plsql
Amrit Kaur
 
PPT
PL/SQL Introduction and Concepts
Bharat Kalia
 
PPT
04 Handling Exceptions
rehaniltifat
 
PPTX
PLSQL Tutorial
Quang Minh Đoàn
 
PPTX
pl/sql online Training|sql online Training | iTeknowledge
Masood Khan
 
PPT
10 Creating Triggers
rehaniltifat
 
ODP
Ms sql-server
Md.Mojibul Hoque
 
PPT
11 Understanding and Influencing the PL/SQL Compilar
rehaniltifat
 
PPT
Plsql
fika sweety
 
PPTX
DDL And DML
pnp @in
 
PPT
Sql views
arshid045
 
PPT
PLSQL Cursors
spin_naresh
 
PPTX
SQL Operators.pptx
RUBAB79
 
PPTX
5. stored procedure and functions
Amrit Kaur
 
PPT
Subqueries -Oracle DataBase
Salman Memon
 
PDF
Sql commands
Prof. Dr. K. Adisesha
 
PPTX
Packages in PL/SQL
Pooja Dixit
 
PPT
Advanced Sql Training
bixxman
 
PPTX
What is SQL Server?
CPD INDIA
 
Oracle sql joins
redro
 
4. plsql
Amrit Kaur
 
PL/SQL Introduction and Concepts
Bharat Kalia
 
04 Handling Exceptions
rehaniltifat
 
PLSQL Tutorial
Quang Minh Đoàn
 
pl/sql online Training|sql online Training | iTeknowledge
Masood Khan
 
10 Creating Triggers
rehaniltifat
 
Ms sql-server
Md.Mojibul Hoque
 
11 Understanding and Influencing the PL/SQL Compilar
rehaniltifat
 
DDL And DML
pnp @in
 
Sql views
arshid045
 
PLSQL Cursors
spin_naresh
 
SQL Operators.pptx
RUBAB79
 
5. stored procedure and functions
Amrit Kaur
 
Subqueries -Oracle DataBase
Salman Memon
 
Sql commands
Prof. Dr. K. Adisesha
 
Packages in PL/SQL
Pooja Dixit
 
Advanced Sql Training
bixxman
 
What is SQL Server?
CPD INDIA
 
Ad

Viewers also liked (7)

PDF
Big Data Hadoop Training Course
RMS Software Technologies
 
PDF
Designpatternscard
kyutae.kang
 
PPT
Case study what you can take to the bank(primary functions)
rehaniltifat
 
DOC
Transcript of Presentation(Simple & Compound Interest) for Audience
rehaniltifat
 
PPT
08 Dynamic SQL and Metadata
rehaniltifat
 
PPT
Remote DBA Experts 11g Features
Remote DBA Experts
 
PPTX
Turbocharge SQL Performance in PL/SQL with Bulk Processing
Steven Feuerstein
 
Big Data Hadoop Training Course
RMS Software Technologies
 
Designpatternscard
kyutae.kang
 
Case study what you can take to the bank(primary functions)
rehaniltifat
 
Transcript of Presentation(Simple & Compound Interest) for Audience
rehaniltifat
 
08 Dynamic SQL and Metadata
rehaniltifat
 
Remote DBA Experts 11g Features
Remote DBA Experts
 
Turbocharge SQL Performance in PL/SQL with Bulk Processing
Steven Feuerstein
 
Ad

Similar to 03 Writing Control Structures, Writing with Compatible Data Types Using Explicit Cursors (20)

PPT
Less07 schema
Imran Ali
 
PPT
Les20[1]Working with Composite Datatypes
siavosh kaviani
 
PPTX
Less08_Schema Advanced Databases and Management.pptx
MurtazaMughal13
 
PPTX
Introduction to SQL, SQL*Plus
Chhom Karath
 
PPT
Les09.ppt
PrathameshSingh15
 
PPT
Cursores.ppt
Alan737817
 
PPT
Creating and Managing Tables -Oracle Data base
Salman Memon
 
PPT
DDL. data defination language for creating database
SHAKIR325211
 
PDF
sql-commands.pdf
Prof. Dr. K. Adisesha
 
PDF
Sql commands
Prof. Dr. K. Adisesha
 
PPT
Sequences and indexes
Balqees Al.Mubarak
 
PPTX
SQL: Structured Query Language
Rohit Bisht
 
PPTX
Lab1 select statement
Balqees Al.Mubarak
 
PPTX
SQL Commands
Sachidananda M H
 
DOC
3963066 pl-sql-notes-only
Ashwin Kumar
 
PPT
Les13[1]Other Database Objects
siavosh kaviani
 
DOC
Oracle notes
Prashant Dadmode
 
PPT
chap13.ppt
MuhammadAbubakar114879
 
PDF
Sql tutorial
Rumman Ansari
 
PPT
Sql oracle
Md.Abu Noman Shuvo
 
Less07 schema
Imran Ali
 
Les20[1]Working with Composite Datatypes
siavosh kaviani
 
Less08_Schema Advanced Databases and Management.pptx
MurtazaMughal13
 
Introduction to SQL, SQL*Plus
Chhom Karath
 
Cursores.ppt
Alan737817
 
Creating and Managing Tables -Oracle Data base
Salman Memon
 
DDL. data defination language for creating database
SHAKIR325211
 
sql-commands.pdf
Prof. Dr. K. Adisesha
 
Sql commands
Prof. Dr. K. Adisesha
 
Sequences and indexes
Balqees Al.Mubarak
 
SQL: Structured Query Language
Rohit Bisht
 
Lab1 select statement
Balqees Al.Mubarak
 
SQL Commands
Sachidananda M H
 
3963066 pl-sql-notes-only
Ashwin Kumar
 
Les13[1]Other Database Objects
siavosh kaviani
 
Oracle notes
Prashant Dadmode
 
Sql tutorial
Rumman Ansari
 
Sql oracle
Md.Abu Noman Shuvo
 

Recently uploaded (20)

PPTX
The Future of AI & Machine Learning.pptx
pritsen4700
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
PPTX
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
PPTX
AI in Daily Life: How Artificial Intelligence Helps Us Every Day
vanshrpatil7
 
PDF
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
PPTX
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
PDF
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
PDF
AI-Cloud-Business-Management-Platforms-The-Key-to-Efficiency-Growth.pdf
Artjoker Software Development Company
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
PDF
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
PDF
Brief History of Internet - Early Days of Internet
sutharharshit158
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PDF
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
PDF
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
PPTX
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
The Future of AI & Machine Learning.pptx
pritsen4700
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
Dev Dives: Automate, test, and deploy in one place—with Unified Developer Exp...
AndreeaTom
 
AI in Daily Life: How Artificial Intelligence Helps Us Every Day
vanshrpatil7
 
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
AI-Cloud-Business-Management-Platforms-The-Key-to-Efficiency-Growth.pdf
Artjoker Software Development Company
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
Brief History of Internet - Early Days of Internet
sutharharshit158
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 

03 Writing Control Structures, Writing with Compatible Data Types Using Explicit Cursors

  • 1. 3-1 Copyright © 2006, Oracle. All rights reserved. Writing Control Structures Working with Composite Data Types Using Explicit Cursors
  • 2. 3 Copyright © 2006, Oracle. All rights reserved. Working with Composite Data Types
  • 3. 3-3 Copyright © 2006, Oracle. All rights reserved. Composite Data Types • Can hold multiple values (unlike scalar types) • Are of two types: – PL/SQL records – PL/SQL collections – INDEX BY tables or associative arrays – Nested table – VARRAY
  • 4. 3-4 Copyright © 2006, Oracle. All rights reserved. Composite Data Types • Use PL/SQL records when you want to store values of different data types but only one occurrence at a time. • Use PL/SQL collections when you want to store values of the same data type.
  • 5. 3-5 Copyright © 2006, Oracle. All rights reserved. PL/SQL Records • Must contain one or more components (called fields) of any scalar, RECORD, or INDEX BY table data type • Are similar to structures in most 3GL languages (including C and C++) • Are user defined and can be a subset of a row in a table • Treat a collection of fields as a logical unit • Are convenient for fetching a row of data from a table for processing
  • 6. 3-6 Copyright © 2006, Oracle. All rights reserved. Creating a PL/SQL Record Syntax: TYPE type_name IS RECORD (field_declaration[, field_declaration]…); field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr] identifier type_name; 1 2 field_declaration:
  • 7. 3-7 Copyright © 2006, Oracle. All rights reserved. PL/SQL Record Structure Example 100 King AD_PRES employee_id number(6) last_name varchar2(25) job_id varchar2(10) Field2 (data type) Field3 (data type)Field1 (data type) Field2 (data type) Field3 (data type)Field1 (data type)
  • 8. 3-8 Copyright © 2006, Oracle. All rights reserved. %ROWTYPE Attribute • Declare a variable according to a collection of columns in a database table or view. • Prefix %ROWTYPE with the database table or view. • Fields in the record take their names and data types from the columns of the table or view. Syntax: DECLARE identifier reference%ROWTYPE;
  • 9. 3-10 Copyright © 2006, Oracle. All rights reserved. Advantages of Using %ROWTYPE • The number and data types of the underlying database columns need not be known—and in fact might change at run time. • The %ROWTYPE attribute is useful when retrieving a row with the SELECT * statement.
  • 10. 3-11 Copyright © 2006, Oracle. All rights reserved. INDEX BY Tables or Associative Arrays • Are PL/SQL structures with two columns: – Primary key of integer or string data type – Column of scalar or record data type • Are unconstrained in size. However, the size depends on the values that the key data type can hold.
  • 11. 3-12 Copyright © 2006, Oracle. All rights reserved. Creating an INDEX BY Table Syntax: Declare an INDEX BY table to store the last names of employees: TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE} [NOT NULL] | table%ROWTYPE [INDEX BY PLS_INTEGER | BINARY_INTEGER | VARCHAR2(<size>)]; identifier type_name; ... TYPE ename_table_type IS TABLE OF employees.last_name%TYPE INDEX BY PLS_INTEGER; ... ename_table ename_table_type;
  • 12. 3-13 Copyright © 2006, Oracle. All rights reserved. INDEX BY Table Structure Unique key Value ... ... 1 Jones 5 Smith 3 Maduro ... ... PLS_INTEGER Scalar
  • 13. 3-14 Copyright © 2006, Oracle. All rights reserved. Using INDEX BY Table Methods The following methods make INDEX BY tables easier to use: • EXISTS • COUNT • FIRST and LAST • PRIOR • NEXT • DELETE
  • 14. 3-15 Copyright © 2006, Oracle. All rights reserved. INDEX BY Table of Records Define an INDEX BY table variable to hold an entire row from a table. Example DECLARE TYPE dept_table_type IS TABLE OF departments%ROWTYPE INDEX BY PLS_INTEGER; dept_table dept_table_type; -- Each element of dept_table is a record
  • 15. 3-16 Copyright © 2006, Oracle. All rights reserved. Nested Tables 1 2 3 4 .. 2 GB Bombay Sydney Oxford London ....
  • 16. 3-17 Copyright © 2006, Oracle. All rights reserved. Bombay Sydney Oxford London .... VARRAY Tokyo 1 2 3 4 .. 10
  • 17. 3 Copyright © 2006, Oracle. All rights reserved. Using Explicit Cursors
  • 18. 3-19 Copyright © 2006, Oracle. All rights reserved. Cursors Every SQL statement executed by the Oracle server has an associated individual cursor: • Implicit cursors: Declared and managed by PL/SQL for all DML and PL/SQL SELECT statements • Explicit cursors: Declared and managed by the programmer
  • 19. 3-20 Copyright © 2006, Oracle. All rights reserved. Explicit Cursor Operations Active set Table 100 King AD_PRES 101 Kochhar AD_VP 102 De Haan AD_VP . . . . . . . . . 139 Seo ST_CLERK 140 Patel ST_CLERK . . .
  • 20. 3-21 Copyright © 2006, Oracle. All rights reserved. Controlling Explicit Cursors • Load the current row into variables. FETCH • Test for existing rows. EMPTY? • Return to FETCH if rows are found. No • Release the active set. CLOSE Yes • Create a named SQL area. DECLARE • Identify the active set. OPEN
  • 21. 3-22 Copyright © 2006, Oracle. All rights reserved. Controlling Explicit Cursors Fetch a row. Close the cursor. Cursor pointer Open the cursor.1 2 3 Cursor pointer Cursor pointer
  • 22. 3-23 Copyright © 2006, Oracle. All rights reserved. Cursor FOR Loops Syntax: • The cursor FOR loop is a shortcut to process explicit cursors. • Implicit open, fetch, exit, and close occur. • The record is implicitly declared. FOR record_name IN cursor_name LOOP statement1; statement2; . . . END LOOP;
  • 23. 3-24 Copyright © 2006, Oracle. All rights reserved. Explicit Cursor Attributes Obtain status information about a cursor. Boolean Evaluates to TRUE if the cursor is open Evaluates to TRUE if the most recent fetch does not return a row Evaluates to TRUE if the most recent fetch returns a row; complement of %NOTFOUND Evaluates to the total number of rows returned so far Boolean Boolean Number %ISOPEN %NOTFOUN D %FOUND %ROWCOUN T Attribute Type Description
  • 24. 3-25 Copyright © 2006, Oracle. All rights reserved. Cursors with Parameters Syntax: • Pass parameter values to a cursor when the cursor is opened and the query is executed. • Open an explicit cursor several times with a different active set each time. CURSOR cursor_name [(parameter_name datatype, ...)] IS select_statement; OPEN cursor_name(parameter_value,.....) ;
  • 25. 3-26 Copyright © 2006, Oracle. All rights reserved. FOR UPDATE Clause Syntax: • Use explicit locking to deny access to other sessions for the duration of a transaction. • Lock the rows before the update or delete. SELECT ... FROM ... FOR UPDATE [OF column_reference][NOWAIT | WAIT n];
  • 26. 3-27 Copyright © 2006, Oracle. All rights reserved. WHERE CURRENT OF Clause Syntax: • Use cursors to update or delete the current row. • Include the FOR UPDATE clause in the cursor query to lock the rows first. • Use the WHERE CURRENT OF clause to reference the current row from an explicit cursor. WHERE CURRENT OF cursor ; UPDATE employees SET salary = ... WHERE CURRENT OF emp_cursor;
  • 27. 3-28 Copyright © 2006, Oracle. All rights reserved. Class 3: Overview This practice covers the following topics: • Performing iterative steps by using the loop structure • Declaring INDEX BY tables • Processing data by using INDEX BY tables • Declaring a PL/SQL record • Processing data by using a PL/SQL record
  • 28. 3-29 Copyright © 2006, Oracle. All rights reserved. Class 3: Overview This practice covers the following topics: • Declaring and using explicit cursors to query rows of a table • Using a cursor FOR loop • Applying cursor attributes to test the cursor status • Declaring and using cursors with parameters • Using the FOR UPDATE and WHERE CURRENT OF clauses

Editor's Notes

  • #4: Composite Data Types You have learned that variables of scalar data type can hold only one value, whereas a variable of composite data type can hold multiple values of scalar data type or composite data type. There are two types of composite data types: PL/SQL records: Records are used to treat related but dissimilar data as a logical unit. A PL/SQL record can have variables of different types. For example, you can define a record to hold employee details. This involves storing an employee number as NUMBER , a first name and last name as VARCHAR2 , and so on. By creating a record to store employee details, you create a logical collective unit. This makes data access and manipulation easier. PL/SQL collections: Collections are used to treat data as a single unit. Collections are of three types: INDEX BY tables or associative arrays Nested table VARRAY Why Use Composite Data Types? You have all the related data as a single unit. You can easily access and modify the data. Data is easier to manage, relate, and transport if it is composite. An analogy is having a single bag for all your laptop components rather than a separate bag for each component.
  • #5: Composite Data Types (continued) If both PL/SQL records and PL/SQL collections are composite types, how do you choose which one to use? Use PL/SQL records when you want to store values of different data types that are logically related. If you create a record to hold employee details, indicate that all the values stored are related because they provide information about a particular employee. Use PL/SQL collections when you want to store values of the same data type. Note that this data type can also be of the composite type (such as records). You can define a collection to hold the first names of all employees. You may have stored n names in the collection; however, name 1 is not related to name 2. The relation between these names is only that they are employee names. These collections are similar to arrays in programming languages such as C, C++, and Java.
  • #6: PL/SQL Records A record is a group of related data items stored in fields , each with its own name and data type. Each record defined can have as many fields as necessary. Records can be assigned initial values and can be defined as NOT NULL . Fields without initial values are initialized to NULL . The DEFAULT keyword can also be used when defining fields. You can define RECORD types and declare user-defined records in the declarative part of any block, subprogram, or package. You can declare and reference nested records. One record can be the component of another record.
  • #7: Creating a PL/SQL Record PL/SQL records are user-defined composite types. To use them: 1. Define the record in the declarative section of a PL/SQL block. The syntax for defining the record is shown in the slide. 2. Declare (and optionally initialize) the internal components of this record type. In the syntax: type_name Is the name of the RECORD type (This identifier is used to declare records.) field_name Is the name of a field within the record field_type Is the data type of the field (It represents any PL/SQL data type except REF CURSOR . You can use the %TYPE and %ROWTYPE attributes.) expr Is the field_type or an initial value The NOT NULL constraint prevents assigning nulls to those fields. Be sure to initialize the NOT NULL fields. REF CURSOR is covered in appendix C (“ REF Cursors”).
  • #8: PL/SQL Record Structure Fields in a record are accessed with the name of the record. To reference or initialize an individual field, use the dot notation: record_name.field_name For example, you reference the job_id field in the emp_record record as follows: emp_record.job_id You can then assign a value to the record field: emp_record.job_id := &apos;ST_CLERK&apos;; In a block or subprogram, user-defined records are instantiated when you enter the block or subprogram. They cease to exist when you exit the block or subprogram.
  • #9: %ROWTYPE Attribute You have learned that %TYPE is used to declare a variable of a column type. The variable has the same data type and size as the table column. The benefit of %TYPE is that you do not have to change the variable if the column is altered. Also, if the variable is used in any calculations, you need not worry about its precision. The %ROWTYPE attribute is used to declare a record that can hold an entire row of a table or view. The fields in the record take their names and data types from the columns of the table or view. The record can also store an entire row of data fetched from a cursor or cursor variable. The slide shows the syntax for declaring a record. In the syntax: In the following example, a record is declared using %ROWTYPE as a data type specifier: DECLARE emp_record employees%ROWTYPE; ... identifier Is the name chosen for the record as a whole reference Is the name of the table, view, cursor, or cursor variable on which the record is to be based (The table or view must exist for this reference to be valid.)
  • #10: %ROWTYPE Attribute (continued) The emp_record record has a structure consisting of the following fields, each representing a column in the employees table. Note: This is not code but simply the structure of the composite variable. (employee_id NUMBER(6), first_name VARCHAR2(20), last_name VARCHAR2(20), email VARCHAR2(20), phone_number VARCHAR2(20), hire_date DATE, salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4)) To reference an individual field, use dot notation: record_name.field_name For example, you reference the commission_pct field in the emp_record record as follows: emp_record.commission_pct You can then assign a value to the record field: emp_record.commission_pct:= .35; Assigning Values to Records You can assign a list of common values to a record by using the SELECT or FETCH statement. Make sure that the column names appear in the same order as the fields in your record. You can also assign one record to another if both have the same corresponding data types. A user-defined record and a %ROWTYPE record never have the same data type.
  • #11: Advantages of Using %ROWTYPE The advantages of using the %ROWTYPE attribute are listed in the slide. Use the %ROWTYPE attribute when you are not sure about the structure of the underlying database table. The main advantage of using %ROWTYPE is that it simplifies maintenance. Using %ROWTYPE ensures that the data types of the variables declared with this attribute change dynamically when the underlying table is altered. If a DDL statement changes the columns in a table, then the PL/SQL program unit is invalidated. When the program is recompiled, it will automatically reflect the new table format. The %ROWTYPE attribute is particularly useful when you want to retrieve an entire row from a table. In the absence of this attribute, you would be forced to declare a variable for each of the columns retrieved by the select statement.
  • #12: INDEX BY Tables or Associative Arrays INDEX BY tables are composite types (collections) and are user defined. INDEX BY tables can store data using a primary key value as the index, where the key values are not sequential. INDEX BY tables are sets of key-value pairs. (You can imagine data stored in two columns, although the key and value pairs are not exactly stored in columns.) INDEX BY tables have only two columns: A column of integer or string type that acts as the primary key. The key can be numeric, either BINARY_INTEGER or PLS_INTEGER . The BINARY_INTEGER and PLS_INTEGER keys require less storage than NUMBER . They are used to represent mathematical integers compactly and to implement arithmetic operations by using machine arithmetic. Arithmetic operations on these data types are faster than NUMBER arithmetic. The key can also be of type VARCHAR2 or one of its subtypes. The examples in this course use the PLS_INTEGER data type for the key column. A column of scalar or record data type to hold values. If the column is of scalar type, it can hold only one value. If the column is of record type, it can hold multiple values. The INDEX BY tables are unconstrained in size. However, the key in the PLS_INTEGER column is restricted to the maximum value that a PLS_INTEGER can hold. Note that the keys can be both positive and negative. The keys in INDEX BY tables are not in sequence.
  • #13: Creating an INDEX BY Table There are two steps involved in creating an INDEX BY table. 1. Declare a TABLE data type. 2. Declare a variable of that data type. In the syntax:
  • #14: INDEX BY Table Structure Like the size of a database table, the size of an INDEX BY table is unconstrained. That is, the number of rows in an INDEX BY table can increase dynamically so that your INDEX BY table grows as new rows are added. INDEX BY tables can have one column and a unique identifier to that column, neither of which can be named. The column can belong to any scalar or record data type, but the primary key must belong to the types PLS_INTEGER or BINARY_INTEGER . You cannot initialize an INDEX BY table in its declaration. An INDEX BY table is not populated at the time of declaration. It contains no keys or values. An explicit executable statement is required to populate the INDEX BY table.
  • #15: Using INDEX BY Table Methods An INDEX BY table method is a built-in procedure or function that operates on a PL/SQL table and is called by using dot notation. Syntax: table_name.method_name [ ( parameters ) ]
  • #16: INDEX BY Table of Records At any particular time, an INDEX BY table declared as a table of scalar data type can store the details of only one column in a database table. There is often a need to store all the columns retrieved by a query. The INDEX BY table of records offers a solution to this. Because only one table definition is needed to hold information about all the fields of a database table, the table of records greatly increases the functionality of INDEX BY tables. Referencing a Table of Records In the example in the slide, you can refer to fields in the dept_table record because each element of the table is a record. Syntax: table(index).field Example: dept_table(15).location_id := 1700; location_id represents a field in dept_table .
  • #17: Nested Tables The functionality of nested tables is similar to that of INDEX BY tables; however, there are differences in the nested table implementation. The nested table is a valid data type in a schema-level table, but an INDEX BY table is not. The key type for nested tables is not PLS_INTEGER . The key cannot be a negative value (unlike in the INDEX BY table). Though we are referring to the first column as key, there is no key in a nested table. There is a column with numbers in sequence that is considered as the key column. Elements can be deleted from anywhere in a nested table, leaving a sparse table with nonsequential keys. The rows of a nested table are not in any particular order. When you retrieve values from a nested table, the rows are given consecutive subscripts starting from 1. Nested tables can be stored in the database (unlike INDEX BY tables). Syntax: TYPE type _ name IS TABLE OF {column _ type | variable%TYPE | table.column%TYPE} [NOT NULL] | table.%ROWTYPE In Oracle Database 10 g , nested tables can be compared for equality. You can check if an element exists in a nested table and also if a nested table is a subset of another.
  • #18: VARRAY A variable-size array ( VARRAY) is similar to a PL/SQL table, except that a VARRAY is constrained in size. VARRAY is valid in a schema-level table. Items of VARRAY type are called VARRAY s. VARRAY s have a fixed upper bound. You have to specify the upper bound when you declare them. This is similar to arrays in the C language. The maximum size of a VARRAY is 2 GB, as in nested tables. The distinction between a nested table and a VARRAY is the physical storage mode. The elements of a VARRAY are stored contiguously in memory and not in the database. You can create a VARRAY type in the database by using SQL. Example: TYPE location_type IS VARRAY(3) OF locations.city%TYPE; offices location_type; The size of this VARRAY is restricted to 3. You can initialize a VARRAY by using constructors. If you try to initialize the VARRAY with more than three elements, a “Subscript outside of limit” error message is displayed.
  • #20: Cursors The Oracle server uses work areas (called private SQL areas ) to execute SQL statements and to store processing information. You can use explicit cursors to name a private SQL area and to access its stored information. The Oracle server implicitly opens a cursor to process each SQL statement that is not associated with an explicitly declared cursor. Using PL/SQL, you can refer to the most recent implicit cursor as the SQL cursor.
  • #21: Explicit Cursor Operations You declare explicit cursors in PL/SQL when you have a SELECT statement that returns multiple rows. You can process each row returned by the SELECT statement. The set of rows returned by a multiple-row query is called the active set . Its size is the number of rows that meet your search criteria. The diagram in the slide shows how an explicit cursor “points” to the current row in the active set . This enables your program to process the rows one at a time. Explicit cursor functions: Can do row-by-row processing beyond the first row returned by a query Keep track of which row is currently being processed Enable the programmer to manually control explicit cursors in the PL/SQL block
  • #22: Controlling Explicit Cursors Now that you have a conceptual understanding of cursors, review the steps to use them. 1. In the declarative section of a PL/SQL block, declare the cursor by naming it and defining the structure of the query to be associated with it. 2. Open the cursor. The OPEN statement executes the query and binds any variables that are referenced. Rows identified by the query are called the active set and are now available for fetching. 3. Fetch data from the cursor. In the flow diagram shown in the slide, after each fetch you test the cursor for any existing row. If there are no more rows to process, you must close the cursor. 4. Close the cursor. The CLOSE statement releases the active set of rows. It is now possible to reopen the cursor to establish a fresh active set.
  • #23: Controlling Explicit Cursors (continued) A PL/SQL program opens a cursor, processes rows returned by a query, and then closes the cursor. The cursor marks the current position in the active set. 1. The OPEN statement executes the query associated with the cursor, identifies the active set, and positions the cursor at the first row. 2. The FETCH statement retrieves the current row and advances the cursor to the next row until either there are no more rows or until a specified condition is met. 3. The CLOSE statement releases the cursor.
  • #24: Cursor FOR Loops You have learned to fetch data from cursors by using simple loops. You now learn to use a cursor FOR loop, which processes rows in an explicit cursor. It is a shortcut because the cursor is opened, a row is fetched once for each iteration in the loop, the loop exits when the last row is processed, and the cursor is closed automatically. The loop itself is terminated automatically at the end of the iteration where the last row is fetched. In the syntax: record_name Is the name of the implicitly declared record cursor_name Is a PL/SQL identifier for the previously declared cursor Guidelines Do not declare the record that controls the loop; it is declared implicitly. Test the cursor attributes during the loop, if required. Supply the parameters for a cursor, if required, in parentheses following the cursor name in the FOR statement.
  • #25: Explicit Cursor Attributes As with implicit cursors, there are four attributes for obtaining status information about a cursor. When appended to the cursor variable name, these attributes return useful information about the execution of a cursor manipulation statement. Note: You cannot reference cursor attributes directly in a SQL statement.
  • #26: Cursors with Parameters You can pass parameters to a cursor in a cursor FOR loop. This means that you can open and close an explicit cursor several times in a block, returning a different active set on each occasion. For each execution, the previous cursor is closed and reopened with a new set of parameters. Each formal parameter in the cursor declaration must have a corresponding actual parameter in the OPEN statement. Parameter data types are the same as those for scalar variables, but you do not give them sizes. The parameter names are for references in the query expression of the cursor. In the syntax: The parameter notation does not offer greater functionality; it simply allows you to specify input values easily and clearly. This is particularly useful when the same cursor is referenced repeatedly. cursor_name Is a PL/SQL identifier for the declared cursor parameter_name Is the name of a parameter datatype Is the scalar data type of the parameter select_statement Is a SELECT statement without the INTO clause
  • #27: FOR UPDATE Clause If there are multiple sessions for a single database, there is the possibility that the rows of a particular table were updated after you opened your cursor. You see the updated data only when you reopen the cursor. Therefore, it is better to have locks on the rows before you update or delete rows. You can lock the rows with the FOR UPDATE clause in the cursor query. In the syntax: The FOR UPDATE clause is the last clause in a select statement, even after ORDER BY (if it exists). When querying multiple tables, you can use the FOR UPDATE clause to confine row locking to particular tables. FOR UPDATE OF col_name(s) locks rows only in tables that contain col_name(s) . column_reference Is a column in the table against which the query is performed (A list of columns may also be used.) NOWAIT Returns an Oracle server error if the rows are locked by another session.
  • #28: WHERE CURRENT OF Clause The WHERE CURRENT OF clause is used in conjunction with the FOR UPDATE clause to refer to the current row in an explicit cursor. The WHERE CURRENT OF clause is used in the UPDATE or DELETE statement, whereas the FOR UPDATE clause is specified in the cursor declaration. You can use the combination for updating and deleting the current row from the corresponding database table. This enables you to apply updates and deletes to the row currently being addressed, without the need to explicitly reference the row ID. You must include the FOR UPDATE clause in the cursor query so that the rows are locked on OPEN . In the syntax: cursor Is the name of a declared cursor (The cursor must have been declared with the FOR UPDATE clause.)
  • #30: Practice 7: Overview In this practice, you apply your knowledge of cursors to process a number of rows from a table and populate another table with the results using a cursor FOR loop. You also write a cursor with parameters.