Chapter 01
PL/SQL : INTRODUCTION
PL/SQL
• PL/SQL is Oracle's procedural language
extension to SQL, the non-procedural relational
database language.
• With PL/SQL, you can use SQL statements to
manipulate ORACLE data and the flow of control
statements to process the data. Moreover, you
can declare constants and variables, define
subprograms (procedures and functions), and
trap runtime errors. Thus, PL/SQL combines the
data manipulating power of SQL with the data
processing power of procedural languages.
PL/SQL
• Many Oracle applications are built using client-server
architecture. The Oracle database resides on the server.
• The program that makes requests against this database
resides on the client machine.
• This program can be written in C, Java, or PL/SQL.
• While PL/SQL is just like any other programming
language, it has syntax and rules that determine how
programming statements work together. It is important
for you to realize that PL/SQL is not a stand-alone
programming language.
• PL/SQL is a part of the Oracle RDBMS, and it can reside
in two environments, the client and the server.
PL/SQL
• As a result, it is very easy to move PL/SQL
modules between server-side and client-side
applications.
• When the PL/SQL engine is located on
the server, the whole PL/SQL block is
passed to the PL/SQL engine on the
Oracle server.
• The PL/SQL engine processes the
block according to the Figure 2.1.
PL/SQL
• When the PL/SQL engine is located on
the client, as it is in the Oracle
Developer Tools, the PL/SQL processing
is done on the client side.
• All SQL statements that are embedded
within the PL/SQL block are sent to the
Oracle server for further processing.
When PL/SQL block contains no SQL
statement, the entire block is executed
on the client side.
DIFFERENCE BETWEEN PL/SQL
AND SQL
• When a SQL statement is issued on the client computer, the
request is made to the database on the server, and the
result set is sent back to the client.
• As a result, a single SQL statement causes two trips on the
network. If multiple SELECT statements are issued, the
network traffic increase significantly very fast. For example,
four SELECT statements cause eight network trips.
• If these statements are part of the PL/SQL block, they are
sent to the server as a single unit. The SQL statements in
this PL/SQL program are executed at the server and the
result set is sent back as a single unit. There is still only one
network trip made as is in case of a single SELECT
statement.
Comparison of SQL*PLUS and
PL/SQL
PL/SQL BLOCKS
• PL/SQL blocks can be divided into two groups:
1. Named and
2. Anonymous.
• Named blocks are used when creating subroutines. These
subroutines are procedures, functions, and packages.
• The subroutines can be stored in the database and
referenced by their names later on.
• In addition, subroutines can be defined within the
anonymous PL/SQL block.
• Anonymous PL/SQL blocks do not have names. As a
result,they cannot be stored in the database and
referenced later.
PL/SQL BLOCK STRUCTURE
• PL/SQL blocks contain three sections
1. Declare section
2. Executable section and
3. Exception-handling section.
• The executable section is the only mandatory
section of the block.
• Both the declaration and exception-handling
sections are optional.
PL/SQL BLOCK STRUCTURE
• PL/SQL block has the following structure:
DECLARE
Declaration statements
BEGIN
Executable statements
EXCETION
Exception-handling statements
END ;
DECLARATION SECTION
• The declaration section is the first section of
the PL/SQL block.
• It contains definitions of PL/SQL identifiers
such as variables, constants, cursors and so on.
• Example
• DECLARE
• v_first_name VARCHAR2(35) ;
• v_last_name VARCHAR2(35) ;
• v_counter NUMBER := 0 ;
EXECUTABLE SECTION
• The executable section is the next section of the PL/SQL
block.
• This section contains executable statements that allow
you to manipulate the variables that have been declared
in the declaration section.
• BEGIN
• SELECT first_name, last_name
• INTO v_first_name, v_last_name
• FROM student
• WHERE student_id = 123 ;
• DBMS_OUTPUT.PUT_LINE
• (‘Student name :’ || v_first_name ||‘ ’||
v_last_name);
• END;
EXCEPTION-HANDLING SECTION
• The exception-handling section is the last section
of the PL/SQL block.
• This section contains statements that are executed
when a runtime error occurs within a block.
• Runtime errors occur while the program is running
and cannot be detected by the PL/SQL compiler.
• EXCEPTION
• WHEN NO_DATA_FOUND THEN
• DBMS_OUTPUT.PUT_LINE
• (‘ There is no student with student id 123 ’);
• END;
HOW PL/SQL GETS EXECUTED
• Every time an anonymous block is executed, the code is
sent to the PL/SQL engine on the server where it is
compiled.
• The named PL/SQL block is compiled only at the time of its
creation, or if it has been changed.
• The compilation process includes syntax checking, binding
and p-code generation.
• Syntax checking involves checking PL/SQL code for syntax
or compilation errors.
• Once the programmer corrects syntax errors, the compiler
can assign a storage address to program variables that are
used to hold data for Oracle. This process is called Binding.
HOW PL/SQL GETS EXECUTED
• After binding, p-code is generated for the PL/SQL
block.
• P-code is a list of instructions to the PL/SQL engine.
• For named blocks, p-code is stored in the database,
and it is used the next time the program is executed.
• Once the process of compilation has completed
successfully, the status for a named PL/SQL block is
set to VALID, and also stored in the database.
• If the compilation process was not successful, the
status for a named PL/SQL block is set to INVALID.
PL/SQL IN SQL*PLUS
• SQL*Plus is an interactive tool that
allows you to type SQL or PL/SQL
statements at the command prompt.
• These statements are then sent to the
database. Once they are processed, the
results are sent back from the database
and displayed on the screen.
• There are some differences between
entering SQL and PL/SQL statements.
SQL EXAMPLE
• SELECT first_name, last_name
• FROM student;
• The semicolon terminates this SELECT
statement. Therefore, as soon as you
type semicolon and hit the ENTER key,
the result set is displayed to you.
PL/SQL EXAMPLE
• DECLARE
• v_first_name VARCHAR2(35);
• v_last_name VARCHAR2(35);
• BEGIN
• SELECT first_name, last_name
• INTO v_first_name, v_last_name
• FROM student
• WHERE student_id = 123;
• DBMS_OUTPUT.PUT_LINE
• ('Student name: '||v_first_name||' '||v_last_name);
• EXCEPTION
• WHEN NO_DATA_FOUND THEN
• DBMS_OUTPUT.PUT_LINE
• ('There is no student with student id 123');
• END;
• .
• /
PL/SQL EXAMPLE
• There are two additional lines at the end of the
block containing “.” and “/”. The “.” marks the end of
the PL/SQL block and is optional.
• The “/” executes the PL/SQL block and is required.
• When SQL*Plus reads SQL statement, it knows that
the semicolon marks the end of the statement.
Therefore, the statement is complete and can be
sent to the database.
• When SQL*Plus reads a PL/SQL block, a semicolon
• marks the end of the individual statement within the
block. In other words, it is not a block terminator.
PL/SQL EXAMPLE
• Therefore, SQL*Plus needs to know when the
block has ended. As you have seen in the
example, it can be done with period and
forward slash.
EXECUTING PL/SQL
• PL/SQL can be executed directly in
SQL*Plus. A PL/SQL program is normally
saved with an .sql extension. To execute
an anonymous PL/SQL program, simply
type the following command at the SQL
prompt:
• SQL> @DisplayAge
GENERATING OUTPUT
• Like other programming languages, PL/SQL provides a
procedure (i.e. PUT_LINE) to allow the user to display
the output on the screen. For a user to able to view a
result on the screen, two steps are required.
• First, before executing any PL/SQL program, type the
following command at the SQL prompt (Note: you
need to type in this command only once for every
SQL*PLUS session):
• SQL> SET SERVEROUTPUT ON;
• or put the command at the beginning of the program,
right before the declaration section.
GENERATING OUTPUT
• Second, use DBMS_OUTPUT.PUT_LINE in your
executable section to display any message you
want to the screen.
• Syntax for displaying a message:
• DBMS_OUTPUT.PUT_LINE(<string>);
• in which PUT_LINE is the procedure to generate
the output on the screen, and DBMS_OUTPUT is
the package to which the PUT_LINE belongs.
• DBMS_OUTPUT_PUT_LINE(‘My age is ‘ ||
num_age);
SUBSTITUTION VARIABLES
• SQL*Plus allows a PL/SQL block to receive input
information with the help of substitution
variables.
• Substitution variables cannot be used to output
the values because no memory is allocated for
them.
• SQL*Plus will substitute a variable before the
PL/SQL block is sent to the database.
• Substitution variables are usually prefixed by the
ampersand(&) character or double ampersand
(&&) character.
EXAMPLE
• DECLARE
• v_student_id NUMBER := &sv_student_id;
• v_first_name VARCHAR2(35);
• v_last_name VARCHAR2(35);
• BEGIN
• SELECT first_name, last_name
• INTO v_first_name, v_last_name
• FROM student
• WHERE student_id = v_student_id;
• DBMS_OUTPUT.PUT_LINE
• ('Student name: '||v_first_name||' '||v_last_name);
• EXCEPTION
• WHEN NO_DATA_FOUND THEN
• DBMS_OUTPUT.PUT_LINE('There is no such student');
• END;
EXAMPLE
• When this example is executed, the user is
asked to provide a value for the student ID.
• The example shown above uses a single
ampersand for the substitution variable.
• When a single ampersand is used throughout
the PL/SQL block, the user is asked to provide a
value for each occurrence of the substitution
variable.
EXAMPLE
• BEGIN
• DBMS_OUTPUT.PUT_LINE('Today is ‘||’&sv_day');
• DBMS_OUTPUT.PUT_LINE('Tomorrow will be ‘||’ &sv_day');
• END;
• This example produces the following output:
• Enter value for sv_day: Monday
• old 2: DBMS_OUTPUT.PUT_LINE('Today is ‘||’ &sv_day');
• new 2: DBMS_OUTPUT.PUT_LINE('Today is ‘||’ Monday');
• Enter value for sv_day: Tuesday
• old 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be ‘||’ &sv_day');
• new 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be ‘||’ Tuesday');
• Today is Monday
• Tomorrow will be Tuesday
• PL/SQL procedure successfully completed.
EXAMPLE
• When a substitution variable is used in the
script, the output produced by the program
contains the statements that show how the
substitution was done.
• If you do not want to see these lines displayed
in the output produced by the script, use the
SET command option before you run the script
as shown below:
•
• SET VERIFY OFF;
EXAMPLE
• Then, the output changes as shown below:
• Enter value for sv_day: Monday
• Enter value for sv_day: Tuesday
• Today is Monday
• Tomorrow will be Tuesday
• PL/SQL procedure successfully completed.
• The substitution variable sv_day appears twice in this PL/SQL
block. As a result, when this example is run, the user is asked
twice to provide the value for the same variable.
EXAMPLE
• BEGIN
• DBMS_OUTPUT.PUT_LINE('Today is '||'&&sv_day');
• DBMS_OUTPUT.PUT_LINE('Tomorrow will be ‘||’
&sv_day');
• END;
• In this example, substitution variable sv_day is
prefixed by double ampersand in the first
DBMS_OUTPUT.PUT_LINE statement. As a
result, this version of the example produces
different output.
OUTPUT
• Enter value for sv_day: Monday
• old 2: DBMS_OUTPUT.PUT_LINE('Today is ‘||’ &&sv_day');
• new 2: DBMS_OUTPUT.PUT_LINE('Today is ‘||’ Monday');
• old 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be ‘||’
&sv_day');
• new 3: DBMS_OUTPUT.PUT_LINE('Tomorrow will be ‘||’
Monday');
• Today is Monday
• Tomorrow will be Monday
• PL/SQL procedure successfully completed.
• It is clear that the user is asked only once to provide the value for
the substitution variable sv_day.
• As a result, both DBMS_OUTPUT.PUT_LINE statements use the
value of Monday entered previously by the user.
Substitution Variables
• Ampersand(&) character and double ampersand
(&&) characters are the default characters that
denote substitution variables.
• There is a special SET command option available in
SQL*Plus that allows to change the default
character (&) to any other character or disable the
substitution variable feature.
• This SET command has the following syntax:
SET DEFINE character
or
SET DEFINE ON
or
SET DEFINE OFF
Substitution Variables
• The first set command option changes the prefix
of the substitution variable from an ampersand
to another character. This character cannot be
alphanumeric or white space.
• The second (ON option) and third (OFF option)
control whether SQL*Plus will look for
substitution variables or not.
• In addition, ON option changes the value of the
character back to the ampersand.