PL/SQL (Procedural Language extensions to SQL) is used to access an Oracle database from various environments (e.g., Forms, Reports to create triggers, procedures, functions, etc.). PL/SQL is integrated with the database server. It does not exist as a standalone language.
Language type
• PL/SQL is a block structured language like Pascal. In this type of language, the basic unit of a program is a block and the block can be nested.
• PL/SQL is a typed language (all variables must be defined before uses and types should be matched like C/C++).
DECLARE
Declarative section --
variables and types, cursors, and local subprograms here (optional)
BEGIN
Executable section --
statements here -- this is the main section that is required
EXCEPTION -- this is optional
Exception handling section
-- error handling statements here (optional)
END;
An example PL/SQL block
DECLARE
Comp_id NUMBER;
Comp_name CHAR(20)
:= 'ACME SHOWERS';
BEGIN
SELECT company_id_seq.NEXTVAL
INTO comp_id
FROM dual;
INSERT INTO
company (company_id, company_name)
VALUES (comp_id,
comp_name);
END;
Several kinds of blocks
• Anonymous blocks (generally constructed dynamically and executed only
once)
• Named blocks (anonymous blocks with a label)
• Subprograms (procedures, functions, packages)
• Triggers (named blocks that are also stored in the database)
-> Subprograms and triggers can be treated as named blocks
Valid names in PL/SQL (e.g., variables, cursors, subprograms) are similar to SQL's (30 characters starting with alphabets, and numbers, #, $, _, quoted identifiers), many reserved words.
Delimiters
+, –, *, /, ** (exponentiation), = (equality), := (assignment), -- (single
line comment), /* */ (multi-line comment), .. (range), << >> (label),
; (statement separator), and so on.
Literals (constant)
Number (400 or NULL), String ('houston' or NULL), Boolean literals(TRUE, FALSE,
NULL)
Variable declarations
Syntax: Variable_name [CONSTANT] data_type [NOT NULL] [:= (or
DEFAULT) value];
All declarations must be made in the declaration section of
the block.
e.g., num NUMBER(2)
e.g., next_tax_filing_date CONSTANT DATE := '15-APR-00';
e.g., company_name VARCHAR2(60) NOT NULL DEFAULT 'PCS R US';
The basic PL/SQL types
• Scalar type (defined in package STANDARD)
NUMBER, CHAR, VARCHAR2, BOOLEAN, BINARY_INTEGER,
LONG
• Composite types (user-defined types): TABLE, RECORD
Converting between data types
• Implicit conversion -- may be confusing or erroneous
(hard to debug) sometimes
PL/SQL can convert between characters and
numbers, characters and dates
• Explicit conversion -- this is a better idea
TO_CHAR(), TO_DATE(), TO_NUMBER(),
…
Follows the typical scoping rules in Pascal.
e.g., 'scott' LIKE 'sc%t' returns TRUE, 115 BETWEEN 110 AND 120 returns TRUE, 'scott' IN ('mike', 'scott') returns TRUE, etc.
Boolean expression with NULL
TRUE/FALSE test with NULL (is it true or false?)
a) mystring := ‘ ‘; IF
mystring = NULL THEN ….?
IF
mystring != NULL THEN …?
b) mynum := 0; IF
mynum = NULL THEN …?
c) Mystring := ‘have fun’;
Yourstring := NULL; IF
mystring != yourstring THEN …?
d) IF NULL = NULL THEN …?
e) IF NULL != NULL THEN …?
Every PL/SQL statement is separated by a semicolon ; and put in BEGIN and END section.
IF THEN ELSE statement
NULL as a statement
IF report.selection = 'DETAIL' THEN
NULL; --
Do nothing
ELSE
Exec_detail_report;
END IF;
DECLARE
cnt number(2) := 0;
BEGIN
LOOP
cnt := cnt + 1;
EXIT WHEN cnt > 1;
END LOOP;
END;
There are two kinds of FOR LOOPS: the numeric FOR LOOP
and the cursor FOR LOOP. Here is the general syntax of the
numeric FOR LOOP (the cursor FOR LOOP will be discussed later).
• Use the numeric FOR LOOP when you want to execute a body of codes a
fixed number of times.
• The numeric FOR LOOP terminates when the number of times specified in
its range scheme has been satisfied. You can also terminate
the loop with an EXIT statement (although not recommended).
• After each execution of the loop body, PL/SQL checks the value of the
loop index. When it exceeds the difference between the upper
and lower bounds of the range scheme, the loop terminates.
• If the lower bound is greater than the upper bound of the range scheme,
the loop never executes its body.
Rules for Numeric FOR LOOPs
• Do not declare the loop index variable.
PL/SQL automatically and implicitly declares it as a local variable with data
type INTEGER. The scope of this index is the loop itself;
you can't reference the loop index outside the loop.
• Expressions used in the range scheme are evaluated once, when the loop
starts. If you make changes within the loop to the variables,
those changes will have no effect.
• The loop index is always incremented or decremented by one. There is
no STEP.
• Never change the values of either the loop index or the range boundary
from within the loop.
FOR cnt IN 1..10 --
this loop executes 10 times counting cnt from 1 to 10
LOOP
…
statements …
END LOOP;
FOR cnt IN REVERSE 1..10 --
this loop executes 10 times counting cnt from 10 to 1
LOOP
…
statements …
END LOOP;
FOR cnt IN 10..1 --
this loop DOES NO executes at all since 10 > 1
LOOP
… statements
…
END LOOP;
FOR cnt IN start_period..end_period --
this loop executes the period times specified
LOOP --
in the expression.
… statements
…
END LOOP;