PL/SQL Tutorial PDF
What is PL/SQL?
PL/SQL stands for Procedural Language/Structured Query
Language. It is a powerful extension of SQL (Structured Query Language) used in
Oracle Database development. PL/SQL allows developers to write procedural code
that can be executed on the Oracle server, enabling them to perform complex
data manipulation and business logic operations efficiently.
Advantages of PL/SQL
PL/SQL architecture consists of three main components:
1. PL/SQL Engine: Responsible
for processing and executing PL/SQL code. It resides on the Oracle server.
2. SQL Engine: Handles SQL
queries and DML operations. It is responsible for data retrieval and
3. Database Buffer Cache:
Stores frequently accessed data, reducing the need for disk I/O.
PL/SQL Basic Syntax
PL/SQL Block Structure
A PL/SQL block is the basic unit of code execution. It
begins with the DECLARE keyword (optional), followed by
the BEGIN keyword, and ends with the END; keyword.
It may contain variable declarations, SQL queries, procedural logic, and
Variables in PL/SQL are declared using the DECLARE keyword,
followed by the variable name, data type, and optional initial value.
Executing PL/SQL Code
PL/SQL code can be executed using tools like SQL*Plus, SQL
Developer, or embedded within other programs and applications.
Comments in PL/SQL
Comments can be added to PL/SQL code using the -- for
single-line comments and /* */ for multi-line comments.
Data Types and Variables
PL/SQL Data Types
PL/SQL supports various data types, including numeric,
character, date, Boolean, and composite types like records and collections.
Variables are declared using the DECLARE keyword,
specifying the variable name, data type, and optional initial value.
Constants are declared using the CONSTANT keyword
and cannot be changed once assigned a value.
The IF-THEN-ELSE statement allows conditional execution of
code. It checks a condition, and if it evaluates to true, the code within the
IF block is executed. Otherwise, the code within the ELSE block (if present) is
The CASE statement is used for multiple conditional checks.
It evaluates different conditions and executes the code associated with the
first matching condition.
LOOP statements are used for iterative execution. There are
three types of loops in PL/SQL: LOOP, WHILE, and FOR.
The LOOP statement creates an infinite loop, the WHILE loop
executes code as long as the condition is true, and the FOR loop
is used to iterate over a specific range or collection.
The WHILE loop executes a block of code
repeatedly as long as the specified condition evaluates to true.
The FOR loop iterates over a specified
range or collection, executing a block of code for each iteration.
The EXIT statement is used to prematurely
exit a loop before its natural completion based on a specific condition.
Implicit cursors are automatically created by the Oracle
server for single-row queries. They handle query processing without requiring
explicit cursor declarations.
Explicit cursors are user-defined and used for processing
multi-row queries. They provide more control over query processing and are used
in conjunction with the OPEN, FETCH, and CLOSE statements.
Cursor attributes provide information about the status of a
cursor. Common attributes include %FOUND, %NOTFOUND, %ROWCOUNT,
PL/SQL Exception Handling
Exception handling in PL/SQL is done using the EXCEPTION block.
It allows developers to catch and handle errors gracefully, preventing the
program from terminating abruptly.
Developers can define their own custom exceptions using
the EXCEPTION keyword, allowing them to raise and handle
The RAISE_APPLICATION_ERROR function is
used to raise user-defined exceptions with custom error messages and error
PL/SQL Procedures and Functions
Procedures in PL/SQL are named blocks of code that can be
called multiple times. They can have input and output parameters and return no
Functions in PL/SQL are similar to procedures, but they
return a single value. They are used for calculations and computations.
Parameters in Procedures and Functions
Procedures and functions can have input parameters, output
parameters, or both, allowing them to accept and return data.
Invoking Procedures and Functions
Procedures and functions are invoked using their names with
appropriate parameter values. Procedures may use CALL or just
the procedure name, while functions are called within SQL expressions.
The package specification defines the public interface of a
package. It contains declarations of procedures, functions, variables, and
cursors that can be accessed from outside the package.
The package body contains the implementation of the
procedures and functions declared in the package specification. It also
includes private data and code that is not accessible outside the package.
To use a package, you need to declare it in your PL/SQL block
or program. You can then access the procedures and functions defined in the
Triggers in PL/SQL
What are Triggers?
Triggers in PL/SQL are named blocks of code that are
automatically executed in response to specific database events, such as INSERT,
UPDATE, DELETE, or database startup/shutdown. They are used to enforce business
rules, data validation, and maintaining data integrity.
Types of Triggers
There are two types of triggers in PL/SQL: Row-Level
Triggers (which fire for each affected row) and Statement-Level
Triggers (which fire once for each triggering event).
Triggers are created using the CREATE TRIGGER statement,
specifying the trigger name, event (e.g., INSERT, UPDATE, DELETE), timing
(BEFORE or AFTER), and the table or view it applies to.
Triggers are executed automatically when the specified event
occurs. They can access the old and new values of the affected rows to perform
actions based on the changes.
Introduction to Collections
PL/SQL collections are composite data types used to store
multiple elements of the same or different data types. They provide a
convenient way to manipulate bulk data.
Nested tables are one-dimensional arrays with no fixed size.
They can be sparse, and their size can vary during runtime.
Associative Arrays (Index-by Tables)
Associative arrays are collections that use a user-defined
key to access elements. They behave like arrays with a unique index for each
VARRAYs (Variable-Size Arrays)
VARRAYs are one-dimensional arrays with a fixed size defined at compile-time. They behave like arrays with a specific number of elements.
Dynamic SQL in PL/SQL
EXECUTE IMMEDIATE Statement
The EXECUTE IMMEDIATE statement allows
developers to execute dynamically generated SQL statements at runtime. It is
useful when the SQL statement is unknown during compilation.
Using Bind Variables
Bind variables are used to pass values into dynamically
executed SQL statements securely, preventing SQL injection attacks.
Working with Dynamic Queries
Dynamic SQL enables developers to build and execute SQL
statements based on user input or other runtime factors. However, it requires
careful handling to avoid security risks.
Advanced PL/SQL Concepts
Bulk Processing with BULK COLLECT
BULK COLLECT is used to fetch multiple rows of data from a
query into collections in a single operation. It significantly improves the
performance of data retrieval and manipulation.
The FORALL statement performs bulk operations on
collections. It is used with the BULK COLLECT feature to efficiently process
large amounts of data.
PRAGMA Autonomous_Transaction allows a PL/SQL block to
execute as a separate transaction independent of the main transaction. It is
useful when you need to commit or rollback specific operations within a block.
PL/SQL Debugging and Profiling
DBMS_OUTPUT.PUT_LINE is a built-in procedure used for printing debugging information during PL/SQL code execution. It helps developers understand the flow of the program and identify issues.
Using SQL Developer Debugger
Oracle SQL Developer provides a debugging feature that
allows developers to set breakpoints, inspect variables, and step through code
to troubleshoot issues efficiently.
PL/SQL Best Practices
Code Readability and Maintainability
Writing clean, well-structured code with meaningful variable
and object names enhances code readability and maintainability.
Proper error handling is crucial in PL/SQL to gracefully
handle exceptions and prevent the program from terminating unexpectedly.
Optimizing PL/SQL code involves reducing context switching,
using proper indexing, and identifying and resolving bottlenecks.
PL/SQL and SQL Integration
SQL Statements in PL/SQL
PL/SQL code can include SQL statements like SELECT, INSERT,
UPDATE, and DELETE to interact with the database.
Returning SQL Query Results
SQL queries can be used within PL/SQL to retrieve data from
the database and process the results.
PL/SQL and Exception Handling
PL/SQL allows exceptions to be propagated from nested blocks
to the outer blocks, providing a comprehensive view of errors.
Exception Propagation and Nested Blocks
Handling exceptions in nested blocks allows developers to
handle errors at the appropriate level of the code hierarchy.
Tips for PL/SQL Performance Tuning
Profiling and monitoring tools help identify performance bottlenecks to optimize PL/SQL code.
Using Proper Indexing
Applying appropriate indexes on tables enhances query
performance and reduces execution time.
Reducing Context Switching
Minimizing the context switching between SQL and PL/SQL
execution improves overall performance.
PL/SQL Security Considerations
Avoiding SQL Injection
Sanitizing user input and using bind variables help prevent
SQL injection attacks.
Privileges and Roles
Granting appropriate privileges and roles to users ensures
proper access control and security.
Sensitive data should be encrypted to protect it from
Real-World PL/SQL Examples
Building Business Logic
PL/SQL is used to implement complex business logic, such as
order processing, inventory management, and customer relationship management.
PL/SQL is applied to validate data before inserting or
updating it in the database, ensuring data integrity.
Reporting and Data Manipulation
PL/SQL can generate reports and perform data manipulations
like aggregations and transformations.