D80170GC20 sg2
D80170GC20 sg2
D80170GC20 sg2
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans Oracle Database 12c R2:
Z n-t
no Develop PL/SQL Program Units
Bryan Roberts publish, license, post, transmit, or distribute this document in whole or in part without
the express authorization of Oracle.
Miyuki Osato
The information contained in this document is subject to change without notice. If you
Nancy Greenberg
find any problems in the document, please report them in writing to: Oracle University,
Suresh Rajan 500 Oracle Parkway, Redwood Shores, California 94065 USA. This document is not
warranted to be error-free.
Drishya
Restricted Rights Notice
Editors If this documentation is delivered to the United States Government or anyone using
Anwesha Ray the documentation on behalf of the United States Government, the following notice is
applicable:
Raj Kumar
s a
Kavita Saini U.S. GOVERNMENT RIGHTS
)h ฺ a
The U.S. Government’s rights to use, modify, reproduce, release, perform, display, or
m
co uide
disclose these training materials are restricted by the terms of the applicable Oracle
Publishers s ฺ
license agreement and/or the applicable U.S. Government contract.
1 Introduction
Lesson Objectives 1-2
Lesson Agenda 1-3
Course Objectives 1-4
Course Road Map 1-5
Lesson Agenda 1-8
Human Resources (HR) Schema for This Course 1-9
Course Agenda 1-10 s a
Class Account Information 1-12 h
) ฺa
o m
Appendixes and Practices Used in This Course 1-13
d s ฺc uide
Lesson Agenda 1-14
b r an ent G
Oracle Database 12c: Focus Areas 1-15
s sc tud
Oracle Database 12c 1-16
o d @ is S
Lesson Agenda 1-18
q s o e th
ฺ m a o us
PL/SQL Development Environments 1-19
a b se t
Oracle SQL Developer 1-20
n
( z ai icen
Specifications of SQL Developer 1-21
a n l e l
Kh ferab
SQL Developer 4.1.3 Interface 1-22
b
Coding PL/SQL in SQL*Plus 1-23
na rans
a i
Z n-tLesson Agenda 1-24
iii
Oracle SQL and PL/SQL Documentation 1-44
Additional Resources 1-45
Summary 1-46
Practice 1 Overview: Getting Started 1-47
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
2 Creating Procedures
Course Road Map 2-2
Objectives 2-3
Lesson Agenda 2-4
Modularized Program Design 2-5
Modularizing Code with PL/SQL 2-6
Benefits of Modularization 2-7
What Are PL/SQL Subprograms? 2-8
s a
Lesson Agenda 2-9 h
) ฺa
o m
Procedures 2-10
d s ฺc uide
an ent G
What Are Procedures? 2-11
Creating Procedures: Overview 2-12 b r
s sc tud
Creating Procedures 2-13
o d @ is S
q s o e th
Creating Procedures Using SQL Developer 2-14
Compiling Procedures 2-15
ฺ m a o us
n a b se t
Calling Procedures 2-16
( z ai icen
Calling Procedures Using SQL Developer 2-17
a n
Procedures 2-18
l e l
Kh ferab
What Are Parameters and Parameter Modes? 2-19
b
a i na rans
Formal and Actual Parameters 2-20
Z n-tProcedural Parameter Modes 2-21
no Comparing the Parameter Modes 2-22
Using the IN Parameter Mode: Example 2-23
Using the OUT Parameter Mode: Example 2-24
Using the IN OUT Parameter Mode: Example 2-25
Passing Parameters to Procedures 2-26
Passing Actual Parameters: Creating the raise_sal Procedure 2-27
Passing Actual Parameters: Examples 2-28
Using the DEFAULT Option for the Parameters 2-29
Lesson Agenda 2-30
Handled Exceptions 2-31
Handled Exceptions: Example 2-32
Exceptions Not Handled 2-33
Exceptions Not Handled: Example 2-34
Removing Procedures: Using the DROP SQL Statement or SQL Developer 2-35
Viewing Procedure Information Using the Data Dictionary Views 2-36
iv
Viewing Procedures Information Using SQL Developer 2-37
Quiz 2-38
Summary 2-39
Practice 2 Overview: Creating, Compiling, and Calling Procedures 2-40
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
3 Creating Functions
Course Road Map 3-2
Objectives 3-3
Lesson Agenda 3-4
Functions 3-5
Creating Functions syntax 3-6
Tax Calculation 3-8
The Difference Between Procedures and Functions 3-9
s a
Creating Functions: Overview 3-10 h
) ฺa
o m
Invoking a Stored Function: Example 3-11
d s ฺc uide
an ent G
Using Different Methods for Executing Functions 3-12
b r
Creating and Compiling Functions Using SQL Developer 3-14
s sc tud
Lesson Agenda 3-15
o d @ is S
q s o e th
Using a Function in a SQL Expression: Example 3-16
ฺ m a o us
Calling User-Defined Functions in SQL Statements 3-17
n a b se t
Restrictions When Calling Functions from SQL Expressions 3-18
( z ai icen
Side Effects of Function Execution 3-19
a n l e l
Controlling Side Effects 3-20
Kh ferab
Guidelines to Control Side Effects 3-21
b
a i na rans
Lesson Agenda 3-22
Z n-tPassing Parameters to Functions 3-23
no Named and Mixed Notation from SQL: Example 3-24
Viewing Functions Using Data Dictionary Views 3-25
Viewing Functions Information Using SQL Developer 3-26
Lesson Agenda 3-27
Removing Functions: Using the DROP SQL Statement or SQL Developer 3-28
Quiz 3-29
Practice 3-1: Overview 3-30
Summary 3-31
4 Debugging Subprograms
Course Road Map 4-2
Objectives 4-3
Lesson Agenda 4-4
Before Debugging PL/SQL Subprograms 4-5
Lesson Agenda 4-9
v
Debugging a Subprogram: Overview 4-10
Lesson Agenda 4-12
The Debugging – Log Tab Toolbar 4-13
Tracking Data and Execution 4-15
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
ฺ m a o us
5 Creating Packages
n a b se t
Course Road Map a
z i
5-2 en
Objectives a
(
n ble
5-3 l i c
LessonK
h
Agenda r5-4a
a b
n ran s f e
ZaiWhat
DBMS_OUTPUT.PUT_LINE 5-5
t
on-Is a Package?
nAdvantages
5-6
of Packages 5-7
How Do You Create PL/SQL Packages? 5-8
Components of a PL/SQL Package 5-9
Application Program Interface 5-10
Lesson Agenda 5-11
Creating the Package Specification: Using the CREATE PACKAGE Statement 5-12
Creating Package Specification: Using SQL Developer 5-13
Creating the Package Body: Using SQL Developer 5-14
Example of a Package Specification: comm_pkg 5-15
Creating the Package Body 5-16
Example of a Package Body: comm_pkg 5-17
Invoking the Package Subprograms: Examples 5-18
Invoking Package Subprograms: Using SQL Developer 5-19
Creating and Using Bodiless Packages 5-20
Viewing Packages by Using the Data Dictionary 5-21
vi
Viewing Packages by Using SQL Developer 5-22
Removing Packages 5-23
Removing Package Bodies 5-24
Guidelines for Writing Packages 5-25
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
Quiz 5-26
Summary 5-27
Practice 5 Overview: Creating and Using Packages 5-28
an ent G
Overloading Procedures Example: Creating the Package Body 6-9
Restrictions on Overloading 6-10 b r
s sc tud
STANDARD package 6-11
o d @ is S
q s o e th
Overloading and the STANDARD Package 6-12
Lesson Agenda 6-13
ฺ m a o us
n a b se t
Package Instantiation and Initialization 6-14
( z ai icen
Initializing Packages in Package Body 6-15
a n l e l
Using User-Defined Package Functions in SQL 6-16
Kh ferab
User-Defined Package Function in SQL: Example 6-17
b
a i na rans
Lesson Agenda 6-18
Z n-tPackage State 6-19
no Serially Reusable Packages 6-20
Memory Architecture 6-21
Serially Reusable Packages 6-23
Persistent State of Packages 6-24
Persistent State of Package Variables: Example 6-25
Persistent State of a Package Cursor: Example 6-26
Executing the CURS_PKG Package 6-28
Quiz 6-29
Summary 6-30
Practice 6 Overview: Working with Packages 6-31
vii
Using Oracle-Supplied Packages 7-5
Examples of Some Oracle-Supplied Packages 7-6
Lesson Agenda 7-7
How the DBMS_OUTPUT Package Works 7-8
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
viii
OPEN FOR clause 8-18
Using BULK COLLECT and OPEN FOR clause 8-19
Summarizing Methods for Using Dynamic SQL 8-20
Lesson Agenda 8-22
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
9 Creating Triggers
s a
Objectives 9-2 h
) ฺa
o m
Course Road Map 9-3
d s ฺc uide
an ent G
Lesson Agenda 9-4
What are Triggers? 9-6 b r
s sc tud
Defining Triggers 9-7
o d @ is S
Why do you use Triggers? 9-8
q s o e th
Trigger Event Types 9-9
ฺ m a o us
n a b se t
Available Trigger Types 9-10
( z ai icen
Trigger Event Types and Body 9-11
a n l
Lesson Agenda 9-12e l
Kh ferab
Creating DML Triggers by Using the CREATE TRIGGER Statement 9-13
b
a i na rans
Creating DML Triggers by Using SQL Developer 9-14
Z n-tSpecifying the Trigger Execution Time 9-15
no Creating a DML Statement Trigger Example: SECURE_EMP 9-16
Testing Trigger SECURE_EMP 9-17
Using Conditional Predicates 9-18
Multiple Triggers of the Same Type 9-19
CALL Statements in Triggers 9-20
Lesson Agenda 9-21
Statement-Level Triggers Versus Row-Level Triggers 9-22
Creating a DML Row Trigger 9-24
Correlation names and Pseudorecords 9-25
Correlation Names and Pseudorecords 9-26
Using OLD and NEW Qualifiers 9-27
Using OLD and NEW Qualifiers: Example 9-28
Using the WHEN Clause to Fire a Row Trigger Based on a Condition 9-30
Trigger-Firing Sequence: Single-Row Manipulation 9-31
Trigger-Firing Sequence: Multirow Manipulation 9-32
ix
Summary of the Trigger Execution Model 9-33
Lesson Agenda 9-34
INSTEAD OF Triggers 9-35
Creating an INSTEAD OF Trigger: Example 9-36
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
x
Summary 10-28
Practice 10 Overview: Creating Compound, DDL, and Event Database
Triggers 10-29
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
n a b se t
Using Autonomous Transactions: Example 11-17
( z ai icen
Lesson Agenda 11-19
a n l e l
Using the NOCOPY Hint 11-20
Kh ferab
Effects of the NOCOPY Hint 11-21
b
a i na rans
When Does the PL/SQL Compiler Ignore the NOCOPY Hint? 11-22
Z n-t
Using the PARALLEL_ENABLE Hint 11-23
noUsing the Cross-Session PL/SQL Function Result Cache 11-24
Declaring and Defining a Result-Cached Function: Example 11-25
Using the DETERMINISTIC Clause with Functions 11-26
Using the RETURNING Clause 11-27
Lesson Agenda 11-28
Using Bulk Binding 11-29
Bulk Binding: Syntax and Keywords 11-30
Bulk Binding FORALL: Example 11-31
Using BULK COLLECT INTO with Queries 11-34
Using BULK COLLECT INTO with Cursors 11-35
Using BULK COLLECT INTO with a RETURNING Clause 11-36
Quiz 11-37
Summary 11-38
Practice 11 Overview: Design Considerations for PL/SQL Code 11-39
xi
12 Tuning the PL/SQL Compiler
Objectives 12-2
Course Road Map 12-3
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
an ent G
Enabling Warning Messages 12-16
b r
Setting Compiler Warning Levels: Using PLSQL_WARNINGS, Examples 12-17
s sc tud
o d @ is S
Enabling Compiler Warnings: Using PLSQL_WARNINGS in SQL Developer 12-18
q s o e th
Viewing the Current Setting of PLSQL_WARNINGS 12-19
ฺ m a o us
Viewing Compiler Warnings 12-20
n a b se t
SQL*Plus Warning Messages: Example 12-21
( z ai icen
Defining PLSQL_WARNINGS for Program Units 12-22
a n l
Lesson Agenda 12-23e l
Kh ferab
Using the DBMS_WARNINGS Package 12-24
b
a i na rans
Using the DBMS_WARNING Package Subprograms 12-25
Z n-t
The DBMS_WARNING Procedures: Syntax, Parameters, and Allowed
no Values 12-26
The DBMS_WARNING Procedures: Example 12-27
The DBMS_WARNING Functions: Syntax, Parameters, and Allowed Values 12-28
The DBMS_WARNING Functions: Example 12-29
Using DBMS_WARNING: Example 12-30
Quiz 12-32
Summary 12-33
Practice 12 Overview: Tuning PL/SQL Compiler 12-34
13 Managing Dependencies
Objectives 13-2
Course Road Map 13-3
Lesson Agenda 13-4
What are Dependencies in a Schema? 13-5
How Dependencies Work? 13-6
xii
Dependent and Referenced Objects 13-8
Querying Object Dependencies: Using the USER_DEPENDENCIES View 13-10
Querying an Object’s Status 13-11
Categorizing Dependencies 13-12
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
xiii
ALTER TABLE Statement A-10
DROP TABLE Statement A-11
GRANT Statement A-12
Privilege Types A-13
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
n a b se t
Adding Search Conditions by Using the AND and WHERE Operators A-30
( z ai icen
Retrieving Records with Nonequijoins A-31
a n l e l
Retrieving Records by Using the USING Clause A-32
Kh ferab
Retrieving Records by Using the ON Clause A-33
b
a i na rans
Left Outer Join A-34
Z n-t
Right Outer Join A-35
noFull Outer Join A-36
Self-Join: Example A-37
Cross Join A-38
Summary A-39
xiv
Using Conditional Compilation Error Directives to Raise User-Defined Errors B-11
Using Static Expressions with Conditional Compilation B-12
DBMS_DB_VERSION Package: Boolean Constants B-13
DBMS_DB_VERSION Package Constants B-14
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
xv
Creating a Job D-8
Creating a Job with Inline Parameters D-9
Creating a Job Using a Program D-10
Creating a Job for a Program with Arguments D-11
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
xvi
10
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
m
In Unit 2, you learn to create and use triggers
ฺ t o us applications.
a in database
i n ab nse
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
• Schema triggers
• Database triggers
• Guidelines for designing triggers
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• A single trigger on a table that allows you to specify actions for each of the following four
timing points:
– BEFORE
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
A compound trigger is a single trigger on maa
table that
s you to specify actions for each of the
uallows
four triggering timing points:
ฺ
ab nse t o
i n
•
n za lice
Before the triggering(statement
hathatrthe
a le
btriggering
• Before each
b K row
f e
statement affects
• i
After a rownthat
neach s the triggering statement affects
a t r a
ZAfter then-triggering
• statement
n o
You use a compound trigger when you want all the timing instances to access a common PL/SQL
state. The common PL/SQL state is established when the triggering statement starts and is
destroyed when the triggering statement completes.
However, in some situations where you may have to write DML statements in the trigger body, you
can use compound triggers.
• The compound trigger body supports a common PL/SQL state that the code for each
timing point can access.
• The compound trigger common state is:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The compound trigger body supports aฺcommon m a PL/SQL
t o us state that the code for each timing point
ab nse destroyed when the firing statement completes,
can access. The common state isnautomatically
i
even when the firing statement
n (zacauses l i e error.
can
a the
Your applications canhavoid a b le
mutating table error by allowing rows destined for a second table
K orfe r
i n ab table
(such as a history
n s an audit table) to accumulate and then bulk-insert them.
Za triggers
Compound
n - tramake PL/SQL easier for you to use and improve runtime performance and
scalability.no
• Accumulate rows destined for a second table so that you can periodically bulk-insert
them
• Avoid the mutating-table error (ORA-04091)
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The current PL/SQL state is stored beforeฺ m a otheusexecution of the trigger and destroyed after
starting
a
completing the execution of the trigger.b All thee t
trigger timing points can access the same PL/SQL
n
ai icen s
state in such scenario.
n ( z l
a
h rab
If you are inserting values into a l e
second table while executing the trigger body, compound triggers
K fethe newly inserted rows and bulk insert them into the table at periodic
i n ab nsall
allow you to accumulate
intervals.a tra the performance of the PL/SQL block.
Z Thusnimproving
-
no
What is ORA-4091?
Consider a trigger, you have defined for event BEFORE INSERT on a table T. In the trigger body
definition, you execute a DML statement on the same table T, such action would result in ORA-
4091: table T mutating, trigger/function may not see it. The trigger execution here is
initiated to modify the table. When you try to modify it again in the trigger body, it might lead to an
inconsistent state, thereby giving the ORA-4091 error.
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
The slide illustrates the structure of a compound
ฺ t o us The difference between a simple trigger and
a trigger.
a compound trigger syntax is the n
i ab nseTRIGGER clause.
COMPOUND
The optional declarative n (zofaa compound
part l i ce trigger declares variables and subprograms that all of
hacanruse.
its timing-point sections e the trigger fires, the declarative part runs before any timing-
blWhen
point sectionsa
K
b thusscreating
run,
a
fe the PL/SQL state of the trigger. The variables and subprograms
i n n
Za duration
exist for the
n - traof the triggering statement.
The compoundno triggers further have the timing point sections for the timing points – BEFORE,
BEFORE FOR EACH ROW, AFTER, AFTER FOR EACH ROW.
COMPOUND TRIGGER
INSTEAD OF EACH ROW IS
BEGIN
statement;
END INSTEAD OF EACH ROW;
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
A compound trigger defined on a view has
ฺ m t us
aonly anoINSTEAD OF timing point section defined in the
trigger body. b
na ense
a i
n (z lic
a l e
b Kh ferab
a i na rans
Z n-t
no
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Following are some of the restrictions when m aworking s compound triggers:
uwith
ฺ t
b strigger.
e o
• A compound trigger mustin beaa DMLn
a e
z be ldefined
(must ic on either a table or a view.
• A compound trigger
a n l e
• Khthatfoccurs
An exception
b e r abin one section must be handled in that section. It cannot transfer
i nato another
control
a r a n s section.
•
o n -t and :PARENT cannot appear in the declaration section, the BEFORE
Z:OLD, :NEW,
n
STATEMENT section, or the AFTER STATEMENT section.
• Schema triggers
• Database triggers
• Guidelines for designing triggers
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Rules Governing Triggers ฺ m a o us
n a b se t
Reading and writing data by using
( z aitrigger
triggersnis subject to certain rules. The restrictions apply only to
i cise fired as a result of ON DELETE CASCADE.
row triggers, unless a statement
n
a able l
Mutating Tables Kh
n a b sfer
n that is currently being modified by an UPDATE, DELETE, or INSERT
Zaiortable
A mutating
statement, -
is aatable
tr that
antable might need to be updated by the effects of a declarative DELETE CASCADE
n o
referential integrity action. For STATEMENT triggers, a table is not considered a mutating table.
A mutating table error (ORA-4091) occurs when a row-level trigger attempts to change or examine a
table that is already undergoing change via a DML statement.
The triggered table itself is a mutating table, as well as any table referencing it with the FOREIGN
KEY constraint. This restriction prevents a row trigger from seeing an inconsistent set of data.
ON employees
FOR EACH ROW
WHEN (NEW.job_id <> 'AD_PRES')
DECLARE
v_minsalary employees.salary%TYPE;
v_maxsalary employees.salary%TYPE;
BEGIN
SELECT MIN(salary), MAX(salary)
INTO v_minsalary, v_maxsalary
FROM employees
WHERE job_id = :NEW.job_id;
IF :NEW.salary < v_minsalary OR :NEW.salary > v_maxsalary THEN
s a
RAISE_APPLICATION_ERROR(-20505,'Out of range');
END IF;
a
)h ฺ
END; m
co uide
s ฺ
nd nt G
/
r a
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The CHECK_SALARY trigger in the slideฺm a oattempts
example
t us to guarantee that whenever a new
employee is added to the EMPLOYEES
i n abtable n ewhenever an existing employee’s salary or job ID is
or
sthe
(z
changed, the employee’s salary a falls c e
within
i established salary range for the employee’s job.
n l
When an employee record
K ble the CHECK_SALARY trigger is fired for each row that is
ha israupdated,
updated. The a
i n b code
trigger
n s fequeries the same table that is being updated. Therefore, it is said that the
Za n-tra
EMPLOYEES table is a mutating table.
no
UPDATE employees
SET salary = 3400
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the example in the slide, the trigger code
ฺ m t us or select data from a mutating table.
atries too read
n abbetween
If you restrict the salary within a irange n se the minimum existing value and the maximum
a
existing value, then you get(azruntimelic e
error. The EMPLOYEES table is mutating or is in a state of
change; therefore, the a
h rabn
trigger l
cannot e read from it.
K e also cause a mutating table error when they are invoked in a DML
Rememberin abfunctions
that n s fcan
Za n-tra
statement.
no
Possible Solutions
Possible solutions to this mutating table problem include the following:
• Use a compound trigger as described earlier in this lesson.
• Store the summary data (the minimum salaries and the maximum salaries) in another
summary table, which is kept up-to-date with other DML triggers.
• Store the summary data in a PL/SQL package, and access the data from the package. This
can be done in a BEFORE statement trigger.
ON employees
WHEN (NEW.job_id <> 'AD_PRES')
COMPOUND TRIGGER
o d @ is S
q s o e th
The CHECK_SALARY compound triggerฺm a the
resolves
s
umutating table error in the earlier example. This
is achieved by storing the values n b e t o
inaPL/SQLscollections, and then performing a bulk insert/update in
a i e n
the “before statement” section
n (z of the
lic
compound trigger.
a
In the example in thehslide, PL/SQL l e
b collections are used. The element types used are based on the
K r a
i n ab nsfe columns from the EMPLOYEES table.
SALARY and DEPARTMENT_ID
To create
n - tra you define a collection type and then declare variables of that type. Collections
Zacollections,
no when you enter a block or subprogram, and cease to exist when you exit.
are instantiated
min_salaries is used to hold the minimum salary for each department and max_salaries is
used to hold the maximum salary for each department.
. . .
BEFORE STATEMENT IS
BEGIN
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
r a
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
department_ids is used to hold the department
ฺ m a oIDs.
t usIf the employee who earns the minimum or
maximum salary does not have an n b sdepartment,
aassigned e you use the NVL function to store –1 for
a i e n
the department id, instead of
n (zNULL.
lic
Next, you collect the h a
minimum l e
b maximum salary, and the department ID using a bulk insert
salary,
K e r a
i n ab nsfmax_salaries,
into the min_salaries, and department_ids respectively grouped by
Za ID.
department
an index for o n
the
Thetraselect statement returns 13 rows.
-department_min_salaries The values of the department_ids are used as
and department_max_salaries tables.
Therefore,nthe index for those two tables (VARCHAR2) represents the actual department_ids.
After each row is added, if the new salary is less than the minimum salary for that department or
greater than the department’s maximum salary, then an error message is displayed.
To test the newly created compound trigger, issue the following statement:
UPDATE employees
SET salary = 3400
WHERE last_name = 'Stiles';
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• Schema triggers
• Database triggers
• Guidelines for designing triggers
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
@
o o d t his
a s e
q usthat can cause the trigger to fire. You can
You can specify one or more types of DDL
b m statements
o
ฺ eortSCHEMA
create triggers for these events on
i a
n timingenofsthe trigger. The
DATABASE unless otherwise noted. You can also
specify BEFORE and AFTER(for z a the
i c Oracle database fires the trigger in the
n l
ha rable
existing user transaction.
K
i n fe
ab asnastriggering
You cannot specify event any DDL operation performed through a PL/SQL procedure.
Za body
The trigger
n - trathe syntax in the slide represents a complete PL/SQL block.
in
nofire only if the object being created is a cluster, function, index, package, procedure,
DDL triggers
role, sequence, synonym, table, tablespace, trigger, type, view, or user.
BEGIN
RAISE_APPLICATION_ERROR ( num => -20000, msg => 'Cannot drop object');
END;
/
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• Schema triggers
• Database triggers
• Guidelines for designing triggers
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Before coding the trigger body, decide ฺon m the
t o us of the trigger.
a components
Triggers on system events can be i n ab natsthe
defined e database or schema level. For example, a
database shutdown trigger
a e
(zdefinedliatc the database level. Triggers on DDL statements, or a user
is
a n
logging on or off, canhalso bea b le at either the database level or the schema level. Triggers on
defined
DML statements
K eron a specific table or a view.
bare defined
f
n a s
i attrathen database level fires for all users, whereas a trigger defined at the schema or
Zadefined
A trigger -
table level n ononly
fires when the triggering event involves that schema or table.
o d @ is S
q s o e th
m
You can create triggers for the events listed
ฺ t us in the slide on DATABASE or SCHEMA, except
ain theotable
SHUTDOWN and STARTUP, which n
i ab onlynstoeDATABASE.
apply
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
o d @ is S
q s o e th
You can create these triggers to monitor ฺ mhow
t uslog on and off, or you may want to write a
a ofteno you
report that monitors the length of n
i abfor which
time
n se youONareDATABASE,
logged on. When you specify ON SCHEMA,
(z
the trigger fires for the specific a
user. If
i e
you
c specify the trigger fires for all users.
n l
ha rable used in the slide examples is as follows:
The definition of the log_trig_table
K
CREATE TABLE
i n n fe
ab log_trig_table(
s
user_id - tra
Za nVARCHAR2(30),
log_dateno TIMESTAMP,
action VARCHAR2(40))
/
To see the execution of these triggers you can disconnect from the database and connect with the
database. Then execute
select * from log_trib_table;
You can see the output as:
• Schema triggers
• Database triggers
• Guidelines for designing triggers
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
• ฺ m
Use triggers to ensure that whenever
t o usevent occurs, any necessary actions are
a a specific
done.
i n ab nse
(za tolensure
For example, use a trigger
n i ce that whenever anyone updates a table, its log file is
updated.
K ha rable
• ab triggers
Don’tncreate
i n s fe that duplicate database features.
n - tradon’t create a trigger to reject invalid data if you can do the same with
ZFora example,
no
constraints.
• Don’t create recursive triggers.
For example, don’t create an AFTER UPDATE trigger that issues an UPDATE statement on
the table on which the trigger is defined. The trigger fires recursively until it runs out of
memory.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Answer: a, b, d, e ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In this practice, you implement a simpleฺm a oruleusfor ensuring data integrity of employees’
business
a
salaries with respect to the valid salary
n b rangeseforttheir job. You create a trigger for this rule.
i en a cascading effect with triggers created in the practice
During this process, yournnew (zatriggersliccause
section of the previoushalesson.
a b
Thele cascading effect results in a mutating table exception on the
JOBS table. You
K era PL/SQL package and additional triggers to solve the mutating table
bthen create
f
n a n s
issue. ai
Z n-tra
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
11
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
PL/SQL Code
o d @ is S
q s o e th
In Unit 3, you will learn the design aspects
ฺ m t us code. You will also learn how to use the
aof the oPL/SQL
PL/SQL compiler and how to manage
i n abdependencies
n se among different objects in the database
(z a e
application.
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
When several developers are writing their ฺ m a exception
own
t o us handlers in an application, there could be
i ab situations.
inconsistencies in the handling ofnerror
n e Unless certain standards are adhered to, the
sthe
situation can become confusing(z a because
i c eof different approaches followed in handling the same
error or because of thea n
display ofle
l
conflicting error messages that confuse users. To overcome these,
K h a b
you can:
n a b sfer
•
ZImplement an standards that use a consistent approach to error handling across the
ai -trcompany
n
entireoapplication
n
• Create predefined, generic exception handlers that produce consistency in the application
• Write and call programs that produce consistent error messages
Good programming environments promote naming and coding standards. In PL/SQL, a good place
to start implementing naming and coding standards is with commonly used constants and exceptions
that occur in the application domain.
The PL/SQL package specification construct is an excellent component to support standardization
because all identifiers declared in the package specification are public. They are visible to the
subprograms that are developed by the owner of the package and all code with EXECUTE rights to
the package specification.
Create a standardized error-handling package that includes all named and programmer-
defined exceptions to be used in the application.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
o d @ is S
q s o e th
In the slide, the error_pkg package isฺm a o us exception package. It declares a set of
a standardized
a
programmer-defined exception identifiers.
t
b Anseinternally defined exception does not have a name
unless either PL/SQL or you(z give
n
ai it one. e n
The example shown in the slide uses the PRAGMA
n l i c
EXCEPTION_INIT directive
h le
a toabassociate selected exception names with an Oracle database error
number. This enablesK
b you f etor refer to any of the exceptions in a standard way in your applications, as
n a s
ai -tran
in the following
ZBEGIN
example:
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Standardized exception handling can be ฺ m a o useither as a standalone subprogram or a
implemented
subprogram added to the package a b defines
that e t
the standard exceptions.
n
aiexception s
enhandling in your application with the following:
Consider creating a package ( z
for l i c
h an abthat le is to be used in the application
• Every named K exception
er
b programmer-defined
f
n a n s
•
ai numbers
All unnamed,
Zerror t r a exceptions that are used in the application. These are
For programs that use local variables whose values should not change:
• Convert the variables to constants to reduce maintenance and debugging
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
By definition, a variable’s value changes, mwhereas
s
a oauconstant’s value cannot be changed. If you
b ฺ t
have programs that use local variables
a i a whose
ncan e n sevalues should not and do not change, then convert
those variables to constants.
n (zThis
l i c
help with the maintenance and debugging of your code.
ha shared
Consider creating a single a b lepackage with all your constants in it. This makes maintenance and
change of thea
K
b smuch
constants f er easier. This procedure or package can be loaded on system startup
for bettera n
i tran
Z performance.
-
The examplenoinnthe slide shows the constant_pkg package containing a few constants. Refer to
any of the package constants in your application as required. Here is an example:
BEGIN
UPDATE employees
SET salary = salary + 200
WHERE salary <= constant_pkg.c_min_sal;
END;
/
o d @ is S
q s o e th
Local subprograms reduce the size of aฺm module
t us redundant code. This is one of the
a byo removing
main reasons for creating a local n
i ab nseIf a module needs the same routine several times and
subprogram.
n za then
only this module needs the (routine,
l i cedefine it as a local subprogram.
You can define a named ha PL/SQL
a b leblock in the declarative section of any PL/SQL program, procedure
K er have the following characteristics:
b subprograms
or function. Local f
n a s
• ZThey t an to only the block in which they are defined.
ai are-accessible
r
• They
n compiled as part of their enclosing blocks.
noare
The benefits of local subprograms are:
• Reduction of repetitive code
• Improved code readability and ease of maintenance
• Less administration because there is one program to maintain instead of two
The concept is simple. The example shown in the slide illustrates this with a basic example of an
income tax calculation of an employee’s salary.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• You can control access to privileges required to execute a PL/SQL subprogram by using
Definer’s or Invoker’s rights
• With Definer’s rights, the subprogram executes with the access privileges of the owner
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
of the procedure.
• With Invoker’s rights, the subprogram executes with the privileges of the user who
invokes the procedures
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Suppose user bixby creates a procedure ฺ m t us to modify table cust_records and then
athat is odesigned
he/she grants the EXECUTE privilege
i n abon thisn e
sprocedure to user rlayton. If bixby had created the
procedure with definer's rights,
( z athen the
i c e
procedure looks for table cust_records in bixby's
n l
schema. Had the procedure
ha rbeena blecreated with
procedure looksbforKtable cust_records in
invoker's rights, then when rlayton runs it, the
schema.
a s f e rlayton's
aialln procedures
By default,
Z - t r an are considered definer's rights procedures. You can designate a
procedure toobe n an invoker's rights procedure by using the AUTHID CURRENT_USER clause when
you createnor modify it, or you can use the AUTHID DEFINER clause to make it a definer's rights
procedure.
BEGIN
INSERT INTO departments
VALUES (p_id, p_name, NULL, NULL);
END;
o d @ is S
q s o e th
Specifying Invoker’s Rights ฺ m a o us
n a b se t
You can set the invoker’s rights
z i different
afor en PL/SQL subprogram constructs as follows:
( l i c
CREATE FUNCTION
h an aname b le RETURN type AUTHID CURRENT_USER IS...
K fer name AUTHID CURRENT_USER IS…
CREATEbPROCEDURE
i a
n PACKAGE n s
a
Z n-t
CREATE r a name AUTHID CURRENT_USER IS…
no TYPE name AUTHID CURRENT_USER IS OBJECT…
CREATE
The default is AUTHID DEFINER, which specifies that the subprogram executes with the privileges
of its owner. Most supplied PL/SQL packages such as DBMS_LOB, DBMS_ROWID, and so on, are
invoker-rights packages.
Name Resolution
For a definer’s rights procedure, all external references are resolved in the definer’s schema. For an
invoker’s rights procedure, the resolution of external references depends on the kind of statement in
which they appear:
• Names used in queries, DML statements, dynamic SQL, and DBMS_SQL are resolved in the
invoker’s schema.
• All other statements, such as calls to packages, functions, and procedures, are resolved in
the definer’s schema.
• When the invoker is a lower-privilege user, then the definer can grant privileges to
execute a subprogram or a PL/SQL package to the invoking user.
• The SQL GRANT command grants roles to PL/SQL packages and standalone
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
subprograms:
– Create an IR unit.
– Grant roles using the IR unit.
• The following command grants the read and execute roles to the scott.func function
and the sys.pkg package:
GRANT read, execute TO FUNCTION scott.func, PACKAGE sys.pkg
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Before Oracle Database 12c, a definer’s ฺ mrights
t us ran with the privileges of the definer and
a unito always
an invoker's rights unit always rannwith
i ab thenprivileges
seif their privileges
of the invoker. If you wanted to create a
(z
PL/SQL unit that all users could a invoke,
i c e
even were lower than yours, it had to be a
definer’s rights unit. The n l
le ran with all the definer privileges, regardless of which user
a unit aalways
K h b
invoked it.
n a b sfer
ai Database
As of Oracle
Z - t r an 12c, you can grant roles to individual PL/SQL packages and standalone
subprograms.
n onInstead of a designer's rights unit, you can create an invoker's rights unit and then
grant it roles. The invoker's rights unit runs with the privileges of both the invoker and the roles, but
without any additional privileges that you have.
You grant roles to an invoker's rights unit so that users with lower privileges than yours can run the
unit with only the privileges needed to do so. There is no reason to grant roles to a designer's rights
unit, because its invokers run it with all your privileges.
Using the SQL GRANT command, you can grant roles to PL/SQL packages and standalone stored
subprograms. Roles granted to a PL/SQL unit do not affect compilation. They affect the privilege
checking of SQL statements that the unit issues at run time; the unit runs with the privileges of both
its own roles and any other currently enabled roles.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
a n
s c br den
s Stu
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
@
o o d t his
s
aqa logical e
A transaction is a series of statements ฺdoing m t o usunit of work that completes or fails as an
integrated unit. Often, one transaction
i n abstarts n e that may need to operate outside the scope of
sanother
the transaction that started it. (z a
That is, i c
in e
an existing transaction, a required independent transaction
n
may need to commit oraroll back changesle l without affecting the outcome of the starting transaction.
For example, inb K h a b
r transaction, the customer’s information must be committed
n
regardless iof a a stock-purchase
whether n s
the
f eoverall stock purchase completes. Or, while running that same transaction,
Z a t r a
n o -
you want to lognmessages to a table even if the overall transaction rolls back.
The slide depicts the behavior of an autonomous transaction:
1. The main transaction begins.
2. A proc2 procedure is called to start the autonomous transaction.
3. The main transaction is suspended.
4. The autonomous transactional operation begins.
5. The autonomous transaction ends with a commit or rollback operation.
6. The main transaction is resumed.
7. The main transaction ends.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Autonomous transactions exhibit the followingฺ m t o us
a features:
• i n ab nsautonomous
Although called within a transaction, e transactions are independent of that
( z a c e
transaction; that is, they
a n aren’t
l e li nested transactions.
• If the main K h rarolls
transaction b back, autonomous transactions don’t.
b
na made f e
sby an autonomous transaction become visible to other transactions when the
•
a i
Changes
r a n
Zautonomous
o n -t transaction commits.
• Withn their stack-like functionality, only the “top” transaction is accessible at any given time.
After completion, the autonomous transaction is popped and the calling transaction is
resumed.
• There are no limits other than resource limits on how many autonomous transactions can be
recursively called.
• Autonomous transactions must be explicitly committed or rolled back; otherwise, an error is
returned when attempting to return from the autonomous block.
• You can’t use PRAGMA to mark all subprograms in a package as autonomous. Only individual
routines can be marked autonomous.
• You can’t mark a nested or anonymous PL/SQL block as autonomous.
/
CREATE OR REPLACE PROCEDURE log_usage (p_card_id NUMBER, p_loc NUMBER) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO usage
VALUES (p_card_id, p_loc);
COMMIT;
END log_usage;
/
CREATE OR REPLACE PROCEDURE bank_trans(p_cardnbr NUMBER,p_loc NUMBER) IS
BEGIN
INSERT INTO txn VALUES (9001, 1000);
log_usage (p_cardnbr, p_loc);
s a
END bank_trans;
/
)h ฺa
EXECUTE bank_trans(50, 2000)
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
To define autonomous transactions, you ฺ m a PRAGMA
use
t o usAUTONOMOUS_TRANSACTION. PRAGMA
instructs the PL/SQL compiler to n
i aba routine
mark
n e as autonomous (independent). In this context, the
sanonymous
(z
term “routine” includes top-level a (not c e
nested)
i PL/SQL blocks; local, standalone, and
n l
le methods of a SQL object type; and database triggers. You can
packaged functions and
code PRAGMA anywhereK haprocedures;
in r
thea b
declarative section of a routine. However, for readability, it is best
a b s f e
aintop-tofrathen Declaration section.
placed at the
Z
In the example
n onin the slide, you track where the bankcard is used, regardless of whether the
transaction is successful. The following are the benefits of autonomous transactions:
• After starting, an autonomous transaction is fully independent. It shares no locks, resources,
or commit dependencies with the main transaction, so you can log events, increment retry
counters, and so on even if the main transaction rolls back.
• Autonomous transactions help you build modular, reusable software components. For
example, stored procedures can start and finish autonomous transactions on their own. A
calling application need not know about a procedure’s autonomous operations and the
procedure need not know about the application’s transaction context. That makes
autonomous transactions less error-prone than regular transactions and easier to use.
To run the code on the previous page, enter the following code:
EXECUTE bank_trans(50, 2000)
Use the Data tab in the Tables node of the Object Navigator tree to display the
s a
values in the TXN and USAGE tables as follows: h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• Allows the PL/SQL compiler to pass OUT and IN OUT parameters by reference rather
than by value
• Enhances performance by reducing overhead when passing parameters
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
DECLARE
TYPE rec_emp_type IS TABLE OF employees%ROWTYPE;
rec_emp rec_emp_type;
PROCEDURE populate(p_tab IN OUT NOCOPY emptabtype)IS
BEGIN
. . .
END;
BEGIN
s a
populate(rec_emp); a
)h ฺ
END;
m
co uide
/
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Note that PL/SQL subprograms supportฺm three
t o us
a parameter-passing modes: IN, OUT, and IN OUT. By
default: b
na ense
z a i
• The IN parameter is(passed
a n l e licreference. A pointer to the IN actual parameter is passed to
by
K h formal
the corresponding
r a b parameter. So, both the parameters reference the same memory
i n s fe the value of the actual parameter.
abwhichnholds
location,
• ZThe n traIN OUT parameters are passed by value. The value of the OUT or IN OUT
a OUT-and
noparameter is copied into the corresponding formal parameter. Then, if the subprogram
actual
exits normally, the values assigned to the OUT and IN OUT formal parameters are copied into
the corresponding actual parameters.
Copying parameters that represent large data structures (such as collections, records, and instances
of object types) with OUT and IN OUT parameters slows down execution and uses up memory. To
prevent this overhead, you can specify the NOCOPY hint, which enables the PL/SQL compiler to pass
the OUT and IN OUT parameters by reference.
The slide shows an example of declaring an IN OUT parameter with the NOCOPY hint.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
As a trade-off for better performance, the ฺ m a ohint
NOCOPY
t usenables you to trade well-defined exception
semantics for better performance.nIts
i abuse naffects
se exception handling in the following ways:
a
Because NOCOPY is (azhint and e
•
a n l e licnot a directive, the compiler can pass NOCOPY parameters to
a subprogramhby value b or by reference. So, if the subprogram exits with an unhandled
exception, K
b sfe
you cannotr arely on the values of the NOCOPY actual parameters.
n a
i trifaansubprogram exits with an unhandled exception, the values assigned to its OUT
• ZByadefault,
- formal parameters are not copied to the corresponding actual parameters, and
onOUT
and IN
n
the changes appear to roll back. However, when you specify NOCOPY, assignments to the
formal parameters immediately affect the actual parameters as well. So, if the subprogram
exits with an unhandled exception, the (possibly unfinished) changes are not “rolled back.”
• Currently, the RPC protocol enables you to pass parameters only by value. So, exception
semantics can change without notification when you partition applications. For example, if
you move a local procedure with NOCOPY parameters to a remote site, those parameters are
no longer passed by reference.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the following cases, the PL/SQL compiler ฺ m aignores
t o uthes NOCOPY hint and uses the by-value
parameter-passing method (with no n b generated):
aerror se
a i e n
• The actual parameter
n (zis an element
lic of associative arrays (index-by tables). This restriction
does not apply a
hto entire l e
bassociative arrays.
K r a
fe is constrained (by scale or NOT NULL). This restriction does not extend
•
i n ab parameter
The actual
n s
n - tra elements or attributes. Also, it does not apply to size-constrained character
Ztoaconstrained
no
strings.
• The actual and formal parameters are records; one or both records were declared by using
%ROWTYPE or %TYPE, and constraints on corresponding fields in the records differ.
• The actual and formal parameters are records; the actual parameter was declared (implicitly)
as the index of a cursor FOR loop, and constraints on corresponding fields in the records
differ.
• Passing the actual parameter requires an implicit data-type conversion.
• The subprogram is involved in an external or RPC.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The PARALLEL_ENABLE keyword can ฺbe m used
s for declaring a function. It is an
a inotheusyntax
optimization hint that indicates that atheb function t
e can be used in a parallelized query or parallelized
a i n e n sfeature
n (z
DML statement. Oracle’s parallel
l i c
execution divides the work of executing a SQL statement
h a Functions
across multiple processes.
a b le called from a SQL statement that is run in parallel can have a
separate copy run K
b inprocess.
eache
f ofr these processes, with each copy called for only the subset of rows that
athat
are handledinby s
Z a -tran
n before Oracle 8i, the parallelization optimization looked to see whether a
For DML statements,
nonoted
function was as having all four of RNDS, WNDS, RNPS, and WNPS specified in a PRAGMA
RESTRICT_REFERENCES declaration; those functions that were marked as neither reading nor
writing to either the database or package variables could run in parallel. Again, those functions
defined with a CREATE FUNCTION statement had their code implicitly examined to determine
whether they were actually pure enough; parallelized execution might occur even though a PRAGMA
cannot be specified on these functions.
The PARALLEL_ENABLE keyword is placed after the return value type in the declaration of the
function, as shown in the example in the slide.
Note: The function should not use session state, such as package variables, because those
variables may not be shared among the parallel execution servers.
• Each time a result-cached PL/SQL function is called with different parameter values,
those parameters and their results are stored in cache.
• The function result cache is stored in a shared global area (SGA), making it available to
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
This caching mechanism provides you ฺwith m t o us
aa language-supported and system-managed means for
storing the results of PL/SQL functions b
na is inboth e which is available to every session that runs your
a SGA,
sefficient
a i e n
n (z
application. The caching mechanism
l i c and easy to use, and it relieves you of the
burden of designing and
ha developing
a b le your own caches and cache-management policies.
K
b sfePL/SQL
Each time a result-cached r function is called with different parameter values, those
i n a n
parameters
with the same - tra results
Za andnparameter
their are stored in the cache. Subsequently, when the same function is called
values, the result is retrieved from the cache, instead of being recomputed.
n o
If a database object that was used to compute a cached result is updated, the cached result
becomes invalid and must be recomputed.
Use the result-caching feature with functions that are called frequently and are dependent on
information that never changes or changes infrequently.
Note: For additional information about Cross-Session PL/SQL Function Result Cache, refer to the
Oracle Database Advanced PL/SQL course, the Oracle Database SQL and PL/SQL New Features
course, or Oracle Database PL/SQL Language Reference.
r a
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Before Oracle Database 12c, an invoker’s ฺ m a function
rights
t o us could not be result-cached. As of 12c, the
i n ab nse
invoker’s rights function can be result-cached.
To enable result-caching for(z
a iceuse the RESULT_CACHE clause. When a result-cached
a n l e l
a function,
function is invoked, the
K h rab
system checks the cache. If the cache contains the result from a previous
abfunction
invocation of the
n s e the same parameter values, the system returns the cached result to
fwith
i n
tra execute
Za and
the invoker
system runso n
the
doesn’t
-function the function body again. If the cache does not contain the result, the
body and adds the result (for these parameter values) to the cache before
n to the invoker.
returning control
Note: If function execution results in an unhandled exception, the exception result is not stored in the
cache.
The code example in the slide depicts the creation of a function get_hire_date that takes the
employe_id as a parameter and returns the hire_date.
To enable result caching in a package function, you have to include the RESULT_CACHE clause in
both function declaration and function definition.
• Specify DETERMINISTIC to indicate that the function returns the same result value
whenever it is called with the same values for its arguments.
• Add the DETETMINISTIC clause in function declaration and definition.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can use the DETERMINISTIC function m s
aclauseotouindicate that the function returns the same
b ฺ t
result value whenever it is called n
a i with
e se values for its arguments.
a the nsame
(z alideterministic
When Oracle Database encounters
n c function, it attempts to use previously calculated
a
results when possiblehrather than b l e
execute the function again. If you subsequently change the
K r a
feyou must manually rebuild all dependent function-based indexes and
i n abfunction,
semantics of the
n s
Za views.
materialized
n - tra
nothis clause to define a function that uses package variables or that accesses the
Don’t specify
database in any way that might affect the return result of the function. The results of doing so will not
be captured if Oracle Database chooses not to re-execute the function.
Note
• Don’t specify DETERMINISTIC for a function whose result depends on the state of session
variables or schema objects because results might vary across calls. Instead, consider
making the function result-cached.
• For more information about the DETERMINISTIC clause, refer to Oracle Database SQL
Language Reference.
• Improves performance by returning column values with INSERT, UPDATE, and DELETE
statements
• Eliminates the need for a SELECT statement
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
o d @ is S
q s o e th
Often, applications need information about ฺ m t us by a SQL operation; for example, to
athe rowo affected
i n ab naction.
generate a report or to take a subsequent se column
The INSERT, UPDATE, and DELETE statements
can include a RETURNING clause,
( z a which
i c ereturns values from the affected row into PL/SQL
n le l
or before a DELETE. K hAsaa result,
variables or host variables. This eliminates
r a b fewer
the need to SELECT the row after an INSERT or UPDATE,
network round trips, less server CPU time, fewer cursors, and
a b
n raare s f e
less serverimemory
a t n required.
Z
The example in - slide shows how to update the salary of an employee and, at the same time,
nthe
n o
retrieve the employee’s last name and new salary into a local PL/SQL variable. To test the code
example, issue the following commands that check the salary of employee_id 108 before updating
it. Next, the procedure is invoked with the employee_id 108 as the parameter.
• Standardization of code
• Managing security for PL/SQL packages and subprograms
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Binds whole arrays of values in a single operation, rather than using a loop to perform a
FETCH, INSERT, UPDATE, and DELETE operation multiple times
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
o d @ is S
q s o e th
The Oracle server uses two engines toฺrun m aPL/SQL
t o us and subprograms:
blocks
n b runs
awhich se procedural statements, but passes the SQL
• The PL/SQL runtime engine,
a i e n
statements to the SQL
n (z enginelic
a
h which a b le and executes the SQL statement and, in some cases, returns
• K
The SQL engine,
b PL/SQLf r parses
eengine
datan toathe s
During Z
ai -trevery
execution,
an SQL statement causes a context switch between the two engines, which
on
results in anperformance penalty for excessive amounts of SQL processing. This is typical of
applications that have a SQL statement in a loop that uses values from indexed collections.
Collections include nested tables, varying arrays, index-by tables, and host arrays.
Performance can be substantially improved by minimizing the number of context switches through
the use of bulk binding. Bulk binding causes an entire collection to be bound in one call, a context
switch, to the SQL engine. That is, a bulk bind process passes the entire collection of values back
and forth between the two engines in a single context switch, compared with incurring a context
switch for each collection element in an iteration of a loop. The more rows affected by a SQL
statement, the greater the performance gain with bulk binding.
• The FORALL keyword instructs the PL/SQL engine to bulk bind input collections before
sending them to the SQL engine.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• The BULK COLLECT keyword instructs the SQL engine to bulk bind output collections
before returning them to the PL/SQL engine.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Use bulk binds to improve the performance ฺ m aof: o us
a b collection
e t
• n s
ai icen elements
DML statements that reference
SELECT statements n ( z l collection elements
that reference
•
a l e
h thatrareference
b
• Cursor FORK loops collections and the RETURNING INTO clause
a b s f e
The FORALL
Z ainkeyword
- t r aninstructs the PL/SQL engine to bulk bind input collections before sending them
non
to the SQL engine. Although the FORALL statement contains an iteration scheme, it is not a FOR
loop.
The BULK COLLECT keyword instructs the SQL engine to bulk bind output collections, before
returning them to the PL/SQL engine. This enables you to bind locations into which SQL can return
the retrieved values in bulk. Thus, you can use these keywords in the SELECT INTO, FETCH INTO,
and RETURNING INTO clauses.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
BEGIN
FOR j IN 1..iterations LOOP -- populate collections
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
pnums(j) := j;
pnames(j) := 'Part No. ' || TO_CHAR(j);
END LOOP;
t1 := DBMS_UTILITY.get_time;
FOR i IN 1..iterations LOOP
INSERT INTO parts1 (pnum, pname) VALUES (pnums(i), pnames(i));
END LOOP;
t2 := DBMS_UTILITY.get_time;
FORALL i IN 1..iterations
s a
INSERT INTO parts2 (pnum, pname) VALUES (pnums(i), pnames(i));
h
) ฺa
t3 := DBMS_UTILITY.get_time;
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
By using BULK COLLECT INTO, you can ฺ m a oobtain
quickly
t us a set of rows without using a cursor
mechanism.
i n ab nse
The example reads all the
n (za licrows
department
e for a specified region into a PL/SQL table, whose
hawith rthe
contents are displayed
a le loop that follows the SELECT statement.
bFOR
K
i n ab nsfe
Za n-tra
no
The FETCH statement has been enhanced to support the BULK COLLECT INTO syntax.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
o d @ is S
q s o e th
The example in the slide shows how BULK m aCOLLECT s can be used with cursors.
uINTO
You can also add a LIMIT clausento
ฺ
abcontrol t o
e number of rows fetched in each operation. The code
a i e n sthe
example in the slide could be(zmodifiedicas follows:
CREATE OR h REPLACE le l
an abPROCEDURE get_departments(p_loc NUMBER,
K
b NUMBER)
p_nrows f er IS
n a n
i tradept_csr s
ZaCURSOR -
IS SELECT *
INDEX BY BINARY_INTEGER;
v_emp_ids emplist_type := emplist_type(100,101,102,104);
v_new_sals numlist_type;
BEGIN
FORALL i IN v_emp_ids.FIRST .. v_emp_ids.LAST
UPDATE employees
SET commission_pct = p_rate * salary
WHERE employee_id = v_emp_ids(i)
RETURNING salary BULK COLLECT INTO v_new_sals;
FOR i IN 1 .. v_new_sals.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(v_new_sals(i));
s a
END LOOP;
)h ฺa
END; m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a o uofsFOR loops that reference collections and
Bulk binds can be used to improve the ฺperformance
return DML. If you have, or plan to a b PL/SQL
have, e t code that does this, then you can use the FORALL
n
ai and s
n COLLECT INTO keywords, to improve performance.
eBULK
keyword, along with the RETURNING
( z l i c
In the slide, the salaryh aninformation
a b le is retrieved from the EMPLOYEES table and collected into the
new_sals array.
K er collection is returned in bulk to the PL/SQL engine.
b The new_sals
f
n a s
n shows a FOR loop that is used to iterate through the new salary data
Zai innthe
The example - traslide
nothe UPDATE operation and then process the results.
received from
a. True
b. False
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Answer: a ฺ m a o us
n a b se t
PL/SQL subprograms support a
z i
three n
parameter-passing
e modes: IN, OUT, and IN OUT.
n ( li c
By default: a l e
• b Kh feisrpassed
The IN parameter ab by reference. A pointer to the IN actual parameter is passed to
the
a i na rans formal parameter. So, both the parameters reference the same memory
corresponding
t holds the value of the actual parameter.
Zlocation,n-which
o
• ThenOUT and IN OUT parameters are passed by value. The value of the OUT or IN OUT
actual parameter is copied into the corresponding formal parameter. Then, if the subprogram
exits normally, the values assigned to the OUT and IN OUT formal parameters are copied into
the corresponding actual parameters.
Copying parameters that represent large data structures (such as collections, records, and instances
of object types) with OUT and IN OUT parameters slows down execution and uses up memory. To
prevent this overhead, you can specify the NOCOPY hint, which enables the PL/SQL compiler to pass
OUT and IN OUT parameters by reference.
o d @ is S
q s o e th
The lesson provides insights into managingฺ m t us code by defining constants and exceptions
ayour oPL/SQL
ab anhigh
in a package specification. This enables
i n se degree of reuse and standardization of code.
a
(z to simplifye
Local subprograms can be
a n used
l e lic and modularize a block of code where the subprogram
K h used
functionality is repeatedly
r a bin the local block.
The runtimeinsecurity n s fe of a subprogram can be altered by using definer’s or invoker’s rights.
ab privileges
Autonomous n - tra can be executed without affecting an existing main transaction.
Za transactions
no
You should understand how to obtain performance gains by using the NOCOPY hint, bulk binding and
the RETURNING clauses in SQL statements, and the PARALLEL_ENABLE hint for optimization of
functions.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In this practice, you create a package that m a o ua bulk
performs
s fetch of employees in a specified
department. The data is stored inn aa
ฺ
b stable
PL/SQL
t
e in the package. You also provide a procedure to
a i e n
(z
display the contents of the table.
n lic
You add an add_employee a l
h raprocedure
b e to the package that inserts new employees. The procedure
K e
i n ab nsfsubprogram
uses a local autonomous to write a log record each time the add_employee procedure
is called, a
Z whethern - titrasuccessfully adds a record or not.
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
12
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
PL/SQL Code
o d @ is S
q s o e th
In Unit 3, you will learn the design aspects
ฺ m t us code. You will also learn how to use
aof the oPL/SQL
PL/SQL compiler and how to manage
i n abdependencies
n se among different objects in the database
(z a e
application.
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• The PL/SQL compiler implicitly rearranges the code for better performance.
• The compiler behavior is defined by its initialization parameters.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• You can use initialization parameters to tune the performance of the compiler according
to the application requirement.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
• PLSCOPE_SETTINGS determines ฺ m a otheuscompiler should collect data about the
whether
identifiers in the PL/SQL program
n a b unitseandt provide it to the static data dictionary views. The
z i
ainformation enabout identifier types, usages, and location of each usage
collected data includes
( l i c
an able
in the source code.
h
b K fer parameter can assume either ‘IDENTIFIERS:ALL’ or
n a
The PLSCOPE_SETTINGS
s
ai -tran
Z‘IDENTIFIERS:NONE’.
•
n on
PLSQL_CCFLAGS lets you control the conditional compilation of each program unit.
Conditional compilation lets you customize the functionality of a PL/SQL application without
removing the source text. For example:
- Using new features with the latest database release and disabling them when running
the application in an older database release.
- Activate debugging or tracing statements in the development environment and hide
them when running the application at a production site.
• The PLSQL_CODE_TYPE parameter can have either INTERPRETED or NATIVE as its value.
It determines the mode of compilation.
The PL/SQL statements in a PL/SQL unit are compiled into an intermediate form, system
code, which is stored in the catalog and interpreted at run time. This is the default behavior
when the PLSQL_CODE_TYPE parameter is set to INTERPRETED value.
When the PLSQL_CODE_TYPE value is set to NATIVE, the PL/SQL statements in a PL/SQL
unit are compiled into native code and stored in the catalog. The native code need not be
interpreted at run time, so it runs faster.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
PLSQL_OPTIMIZE_LEVEL = { 0 | 1 | 2 | 3}
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
PLSQL_CODE_TYPE determines the compilation ฺ m a mode
t o usfor the PL/SQL program unit. When the value
of this parameter is changed, it has
i n anobeffectn e PL/SQL library units that have already been
son
z a
compiled. The value of this (parameter i c
isestored persistently with each library unit. If a PL/SQL library
n l
le automatic recompilations of that library unit will use native
a all subsequent
unit is compiled natively,
K h a b
compilation. b
n a s f er
ai -tran defines the extent of optimization applicable to the compilation of the
PLSQL_OPTIMIZE_LEVEL
Z
program unit.on
n
PLSQL_OPTIMIZE_LEVEL, when set to 0: the compiler would not reorder the code for better
performance.
PLSQL_OPTIMIZE_LEVEL, when set to 1: applies a wide range of optimizations to PL/SQL
programs, including the elimination of unnecessary computations and exceptions, but generally does
not move the source code out of its original source order
PLSQL_OPTIMIZE_LEVEL, when set to 2: applies a wide range of modern optimization techniques
beyond those of level 1, including changes that may move the source code relatively far from its
original location.
PLSQL_OPTIMIZE_LEVEL, when set to 3: applies a wide range of optimization techniques beyond
those of level 2, automatically including techniques not specifically requested
DESCRIBE USER_PLSQL_OBJECT_SETTINGS;
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a o us data dictionary view are:
The columns of the USER_PLSQL_OBJECTS_SETTINGS
ฺ
ab This e t
• Owner: The owner of thein object. s
a icen view. is not displayed in the
column
( z
USER_PLSQL_OBJECTS_SETTINGS
n l
a
h of rthe l e
• Name: TheK
b
name
f e abobject
• Type:
a i naThe ravailable
a n s choices are PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY,
ZTRIGGER,
o n -tTYPE, TYPE BODY, or any other user-defined objects.
• n
PLSQL_OPTIMIZE_LEVEL: The optimization level that was used to compile the object
• PLSQL_CODE_TYPE: The compilation mode for the object
• PLSQL_DEBUG: Specifies whether or not the object was compiled for debugging
• PLSQL_WARNINGS: The compiler warning settings used to compile the object
• NLS_LENGTH_SEMANTICS: The NLS length semantics used to compile the object
• PLSQL_CCFLAGS: The conditional compilation flag used to compile the object
• PLSCOPE_SETTINGS: Controls the compile-time collection, cross reference, and storage of
PL/SQL source code identifier data
• ORIGIN_CON_ID: The identifier of the container where the data originates. This value is 0 for
non-container databases.
• Set the compiler initialization parameter’s value by using the ALTER SYSTEM or ALTER
SESSION statements. s a
a
) h ฺ is
• The parameters’ values are accessed when the CREATE OR REPLACE statement
m
co uide
executed.
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can set the value of the compilation
ฺ m
parameter
t us ALTER SESSION as follows:
a o through
i n ab nse
ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=1;
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
@code_11_09_sa.sql
s a
a
)h ฺ
m
co uide
...
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
To change a compiled PL/SQL object from ฺ m t o us code type to the native code type, you
athe interpreted
must first set the PLSQL_CODE_TYPE
i n abparameter
n se to NATIVE (optionally set the other parameters)
(z a e
and then recompile the program.
a n l e lic
h ratoball PL/SQL code, you must recompile each one. Scripts (in the
To enforce native compilation
K
rdmbs/admin
n b sfare
adirectory) e provided for you to achieve conversion to full native compilation
i
(dbmsupgnv.sql) orn
a -tra interpreted compilation (dbmsupgin.sql). The add_job_history
full
Z
n n as follows:
procedure isocreated
CREATE OR REPLACE PROCEDURE add_job_history
( p_emp_id job_history.employee_id%type
, p_start_date job_history.start_date%type
, p_end_date job_history.end_date%type
, p_job_id job_history.job_id%type
, p_department_id job_history.department_id%type )
IS
BEGIN
INSERT INTO job_history (employee_id, start_date,
end_date, job_id, department_id)
VALUES(p_emp_id, p_start_date, p_end_date,
p_job_id, p_department_id);
END add_job_history;
/
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• A PL/SQL unit flagged with warnings may execute successfully, but might exhibit
unexpected behavior or inefficient performance.
• All PL/SQL warning messages use the prefix PLW.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
To make your programs more robust and ฺ mavoid
t o us at run time, you can turn on checking for
a problems
ab nsare
certain warning conditions. Thesenconditions
i e not serious enough to produce an error and keep
(z
you from compiling a subprogram.a They
i e
c point out something in the subprogram that produces
may
n l
ha rcreate
an undefined result or might
K a blea performance problem.
With the PL/SQL
i n n s fe
abcompiler-warning feature, compiling a PL/SQL program could have the following
Za outcomes:
two possible
n - tra
• no with compilation warnings
Success
• Failure with compilation errors and compilation warnings
Note that the compiler may issue warning messages even on a successful compile. A compilation
error must be corrected to be able to use the stored procedure, whereas a warning is for
informational purposes.
Examples of warning messages
SP2-0804: Procedure created with compilation warnings
PLW-07203: Parameter “IO_TBL” may benefit from use of the NOCOPY compiler hint.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Using compiler warnings can help you to: ฺ m a o us
a t
b andseavoid
• Make your programs more n
ai icen
robust problems at run time
• n ( z
Identify potential performance l problems
a l e
• Khthatfeproduce
Identify factors
b r ab undefined results
a i
All PL/SQL nawarning
r a n s
messages use the prefix PLW.
Z n-t
no
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
PL/SQL warning messages are dividedฺm
t o us so that you can suppress or display groups
intoacategories,
i n ab Thenscategories
of similar warnings during compilation. e are:
a
z conditions e
• SEVERE: Messages (for
a n l e lic that may cause unexpected behavior or wrong results,
K h problems
such as aliasing
r a b with parameters
•
i n
PERFORMANCE: fe
ab nsMessages for conditions that may cause performance problems, such as
a
Z n-t
passing a r a
VARCHAR2 value to a NUMBER column in an INSERT statement
• no
INFORMATIONAL: Messages for conditions that do not have an effect on performance or
correctness, but that you may want to change to make the code more maintainable, such as
unreachable code that can never be executed
You can enable displaying warning messages by using one of the following methods:
• The PLSQL_WARNINGS initialization parameter
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
You can enable the display of compilerฺwarning
t o us by using one of the following methods:
a messages
The PLSQL_WARNINGS Initializationi n abParameter
n se
a
(z enables e
n
The PLSQL_WARNINGSaparameter
l e lic or disables warning messages being reported by the
Khspecifies
PL/SQL compiler and
b f e r abwhich warning messages to show as errors. The settings for the
i na raparameter
PLSQL_WARNINGS
a n s are stored along with each compiled subprogram. You can use the
Z n-t initialization parameter to do the following:
PLSQL_WARNINGS
• no or disable the reporting of all warnings, warnings of a selected category, or specific
Enable
warning messages.
• Treat all warnings, a selected category of warning, or specific warning messages as errors.
• Following is the syntax to do so:
PLSQL_WARNINGS = '<DISABLE | ENABLE | ERROR>:<ALL | INFORMATIONAL |
PERFORMANCE | SEVERE>'
PLSQL_WARNINGS = 'DISABLE:<warning#>'ENABLE:<warning#>',
'ERROR:<warning#>'
You can disable or enable certain category of warnings. You can also configure the compiler
to report certain category of warnings as errors.
Through the PLSQL_WARNINGS parameter you can enable, disable, or report specific
warnings as errors.
The DBMS_WARNING Package
The DBMS_WARNING package provides a way to manipulate the behavior of PL/SQL warning
messages, in particular by reading and changing the setting of the PLSQL_WARNINGS initialization
parameter, to control what kinds of warnings are suppressed, displayed, or treated as errors. This
package provides the interface to query, modify, and delete current system or session settings.
'disable:informational';
ALTER SESSION
SET plsql_warnings = 'enable:severe';
s a
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:SEVERE',
'DISABLE:PERFORMANCE' , 'ERROR:05003'; a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can use the ALTER SESSION or ALTER ฺ m a SYSTEM
t o uscommand to change the PLSQL_WARNINGS
initialization parameter. The graphic
i n ainbthenslide
se shows the various examples of enabling and
disabling compiler warnings.(za e
a n l e lic
Example 1
b Kh ferab
a i na you
In this example,
r a
are
n senabling SEVERE and PERFORMANCE warnings and disabling
Z n-twarnings.
INFORMATIONAL
Example 2n
o
In the second example, you are enabling only SEVERE warnings.
Example 3
You can treat particular messages as errors, instead of warnings. In this example, if you know that
the warning message PLW-05003 represents a serious problem in your code; ERROR:05003 in the
PLSQL_WARNINGS setting makes that condition trigger an error message (PLS_05003) instead of a
warning message. An error message causes the compilation to fail. In this example, you are also
disabling PERFORMANCE warnings.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The PL/SQL Compiler pane specifies options
ฺ m t o us of PL/SQL subprograms.
a for compilation
Setting and Viewing the PL/SQL i n ab nse Warning Messages Categories in SQL
Compile-Time
Developer n (za lice
ha of
You can control theKdisplay a b le
informational, severe, and performance-related messages. The ALL
a b f e r
a i n ran
type overrides any s
individual specifications for the other types of messages. For each type of
Z youncan
message,
o -t specify any of the following:
• Non entry (blank): Use any value specified for ALL; and if no value is specified, use the
Oracle default.
• Enable: Enable the display of all messages of this category.
• Disable: Disable the display of all messages of this category.
• Error: Enable the display of only error messages of this category.
You can examine the current setting for the PLSQL_WARNINGS parameter by issuing a
SELECT statement on the V$PARAMETER view.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a o us
Alternatively, you can use the DBMS_WARNING.GET_WARNING_SETTING_STRING
ฺ package and
b t
e PLSQL_WARNINGS parameter:
a i na efor
procedure to retrieve the current settings
n sthe
DECLARE s VARCHAR2(1000);
n (z lic
BEGIN a l e
b Kh ferab
s := dbms_warning.get_warning_setting_string();
i na rans
dbms_output.put_line
a (s);
END; Z - t
/ non
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can use SQL*Plus to see any warnings ฺ m araisedo asusa result of the compilation of a PL/SQL block.
SQL*Plus indicates that a compilation a bwarning e t
has occurred. The “SP2-08xx: <object> created
i n
amessage s
eisndisplayed for objects compiled .You must enable the
with compilation warnings.” ( z l i c
compiler warnings before
h ancompiling
a b le the program. You can display the compiler warning messages
by using any of b K ermethods:
the following
f
n a s
i tranSHOW ERRORS Command
ZaSQL*Plus
Using the
-
nondisplays any compiler errors including the new compiler warnings and informational
This command
messages. This command is invoked immediately after a CREATE
[PROGEDURE|FUNCTION|PACKAGE] command is used. The SHOW ERRORS command displays
warnings and compiler errors. New compiler warnings and informational messages are “interleaved”
with compiler errors when SHOW ERRORS is invoked.
Using Data Dictionary Views
You can select from the USER_|ALL_|DBA_ERRORS data dictionary views to display PL/SQL
compiler warnings. The ATTRIBUTES column of these views has a new attribute called WARNING
and the warning message displays in the TEXT column.
END;
/
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Use the SHOW ERRORS command in SQL*Plus ฺ m t us the compilation errors of a stored
a toodisplay
i ab with
procedure. When you specify thisnoption
n seno arguments, SQL*Plus displays the compilation
z a
errors for the most recently (created or i c e
altered stored procedure. If SQL*Plus displays a compilation
warnings message after n
ayou create l
le or alter a stored procedure, you can use SHOW ERRORS
commands to obtain K h r a b
n a b more s f einformation.
ai -traofn support for PL/SQL warnings, the range of feedback messages is expanded
With the introduction
Z
on message as follows:
to include a third
n
SP2-08xx: <object> created with compilation warnings.
This enables you to differentiate between the occurrence of a compilation warning and a compilation
error. You must correct an error if you want to use the stored procedure, whereas a warning is for
informational purposes only.
The SP2 prefix is included with the warning message because this provides you with the ability to
look up the corresponding message number in the SQL*Plus User’s Guide and Reference to
determine the cause and action for the particular message.
Note: You can also view the compiler errors and warnings by using the USER_|ALL_|DBA_ERRORS
data dictionary views.
• The settings for the PLSQL_WARNINGS parameter are stored along with each compiled
subprogram.
• If you recompile the subprogram using one of the following statements, the current
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
As already stated, the PLSQL_WARNINGS m a o ucan
parameter
s be set at the session level or at the system
level.
ฺ
ab nse t
i n
(za licparameter
The settings for the PLSQL_WARNINGS
n
e are stored along with each compiled subprogram.
a
h rab
If you recompile the subprogram l e
with a CREATE OR REPLACE statement, the current settings for
K fe recompile the subprogram with an ALTER...COMPILE statement, then
that session are
i n abused.
n
If you
s
Z a -tra is used unless you specify the REUSE SETTINGS clause in the
the current session setting
non uses the original setting that is stored with the subprogram.
statement, which
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
Use the DBMS_WARNING package to programmatically
ฺ a o usmanipulate the behavior of PL/SQL warning
settings for the current system or n a b The
session. e t
DBMS_WARNING package provides a way to
ai warning s
en messages, in particular by reading and changing the
manipulate the behavior of PL/SQL
( z l i c
an ablinitialization
setting of the PLSQL_WARNINGS
h e parameter, to control the types of warnings
K
suppressed, displayed, ore r as errors. This package provides the interface to query, modify,
treated
n ab system s f
Z a -tran
and delete icurrent or session settings.
on package is valuable if you are writing a development environment that
The DBMS_WARNING
n
compiles PL/SQL subprograms. By using the package interface routines, you can control PL/SQL
warning messages programmatically to suit your requirements.
o d @ is S
q s o e th
The following is a list of the DBMS_WARNING
ฺ m t o us
a subprograms:
ADD_WARNING_SETTING_CAT: i n ab Modifies
n se the current session or system warning settings of
•
a
(z previouslye
the warning_category
a n l e lic supplied
• Kh ferab
ADD_WARNING_SETTING_NUM:
b
Modifies the current session or system warning settings of
a i na rans
the warning_number previously supplied
•
o n -t
ZGET_CATEGORY: Returns the category name, given the message number
• n
GET_WARNING_SETTING_CAT: Returns the specific warning category in the session
• GET_WARNING_SETTING_NUM: Returns the specific warning number in the session
• GET_WARNING_SETTING_STRING: Returns the entire warning string for the current session
• SET_WARNING_SETTING_STRING: Replaces previous settings with the new value
Note: For additional information about the preceding subprograms, refer to Oracle Database
PL/SQL Packages and Types Reference or Oracle Database PL/SQL Packages and Types
Reference (as applicable to the version you are using).
warning_value IN VARCHAR2,
scope IN VARCAHR2);
EXECUTE DBMS_WARNING.ADD_WARNING_SETTING_NUM (-
warning_number IN NUMBER,
warning_value IN VARCHAR2,
scope IN VARCAHR2);
EXECUTE DBMS_WARNING.SET_WARNING_SETTING_STRING (-
s a
warning_value IN VARCHAR2, h
) ฺa
scope IN VARCHAR2);
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The warning_category is the name ฺof m the
t o usThe allowed values are:
a category.
ALL i n ab nse
za lice
•
INFORMATIONALn (
•
a able
SEVERE Kh
•
n a b sfer
•
ai -tran
ZPERFORMANCE.
non
The warning_value is the value for the category. The allowed values are:
• ENABLE
• DISABLE
• ERROR
The warning_number is the warning message number. The allowed values are all valid warning
numbers.
The scope specifies whether the changes are being performed in the session context or the system
context. The allowed values are SESSION or SYSTEM. Using SYSTEM requires the ALTER SYSTEM
privilege.
-- DISABLE:PERFORMANCE,
-- ENABLE:SEVERE
EXECUTE DBMS_WARNING.SET_WARNING_SETTING_STRING(-
'ENABLE:ALL', 'SESSION');
EXECUTE DBMS_WARNING.ADD_WARNING_SETTING_CAT(-
'PERFORMANCE','DISABLE', 'SESSION');
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
By using the SET_WARNING_SETTING_STRING ฺ m t us you can set one warning setting. If you
a oprocedure,
have multiple warning settings, youn b perform
ashould se the following steps:
a i e n
(z
1. Call SET_WARNING_SETTING_STRING
n lic to set the initial warning setting string.
a l e
b Kh ferab
2. Call ADD_WARNING_SETTING_CAT (or ADD_WARNING_SETTING_NUM) repeatedly to add
a ntosthe initial string.
morensettings
i
a
Z innthe
The example - traslide establishes the following warning setting string in the current session:
no
ENABLE:INFORMATIONAL,DISABLE:PERFORMANCE,ENABLE:SEVERE
DBMS_WARNING.GET_WARNING_SETTING_CAT (-
warning_category IN VARCHAR2) RETURN warning_value;
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
DBMS_WARNING.GET_WARNING_SETTING_NUM (-
warning_number IN NUMBER) RETURN warning_value;
DBMS_WARNING.GET_WARNING_SETTING_STRING
RETURN pls_integer;
s a
DBMS_WARNING.GET_CATEGORY (- )h ฺ a
warning_number IN pls_integer) RETURN VARCHAR2; m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The warning_category is the name ฺofm the
t o usThe allowed values are:
a category.
ALL i n ab nse
za lice
•
INFORMATIONALn (
•
a able
SEVERE Kh
•
n a b sfer
•
ai -tran
ZPERFORMANCE
n on
The warning_number is the warning message number. The allowed values are all valid warning
numbers.
The scope specifies whether the changes are being performed in the session context or the system
context. The allowed values are SESSION or SYSTEM. Using SYSTEM requires the ALTER SYSTEM
privilege.
Note: Use the GET_WARNING_SETTING_STRING function when you do not have the SELECT
privilege on the v$parameter or v$parameter2 fixed tables, or if you want to parse the warning
string yourself, and then modify and set the new value by using SET_WARNING_SETTING_STRING.
DBMS_WARNING.GET_WARNING_SETTING_STRING);
o d @ is S
q s o e th
m
Note: The message numbers must be ฺspecified
t us integers because the data type for the
a aso positive
i n ab nse(allowing positive integer values).
GET_CATEGORY parameter is PLS_INTEGER
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
BEGIN
v_warn_value := DBMS_WARNING.GET_WARNING_SETTING_STRING;
DBMS_OUTPUT.PUT_LINE('Current warning settings: '||
v_warn_value);
DBMS_WARNING.ADD_WARNING_SETTING_CAT(
'PERFORMANCE', 'DISABLE', 'SESSION');
DBMS_OUTPUT.PUT_LINE('Modified warning settings: '||
DBMS_WARNING.GET_WARNING_SETTING_STRING);
EXECUTE IMMEDIATE v_compile_stmt;
DBMS_WARNING.SET_WARNING_SETTING_STRING(v_warn_value,
'SESSION');
DBMS_OUTPUT.PUT_LINE('Restored warning settings: '||
DBMS_WARNING.GET_WARNING_SETTING_STRING);
s a
END;
/
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the example in the slide, the compile_code
ฺ m t o us is designed to compile a named PL/SQL
a procedure
package. The code suppresses the n b se category warnings. The calling environment’s
aPERFORMANCE
z i
a after encompilation is performed. The code does not know what
warning settings must be restored
(
n bsettings l i cthe
the calling environmentawarning
h a le are; it uses the GET_WARNING_SETTING_STRING function
to save the currentK
b setting.
f r value is used to restore the calling environment setting using the
eThis
n a n s
ai -tthe
compiling
apackage
DBMS_WARNING.SET_WARNING_SETTING_STRING
Before Z r using Native Dynamic
procedure in the last line of the example code.
SQL, the compile_code procedure alters the
o n
n warning level by disabling warnings for the PERFORMANCE category. The code also
current session
prints the original, modified, and the restored warning settings.
EXECUTE DBMS_WARNING.SET_WARNING_SETTING_STRING(-
'ENABLE:ALL', 'SESSION');
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
@/home/oracle/labs/plpu/code_ex/code_ex_scripts/code_12_33_s.sql
EXECUTE compile_code('EMP_PKG');
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The example in the slide tests the exampleฺ m aprovided
t o uinsthe previous slide. First, enable all compiler
warnings. Next, run the script on the
n b sepage. Finally, call the compile_code procedure and
aprevious
z i
a MY_PKG,
pass it an existing package (name, en as a parameter.
l i c
h an able
b K fer
i a
n rans
a
Z n-t
no
b. PERFORMANCE
c. INFORMATIONAL
d. All
e. CRITICAL
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Answer: a, b, c, d ฺ m a o us
n a b se t
PL/SQL warning messages areadivided
z i n categories, so that you can suppress or display groups
einto
of similar warnings during n ( l
compilation. i cThe categories are:
a l e
•
b Kh fefor
SEVERE: Messages r abconditions that may cause unexpected behavior or wrong results,
such
a i nasa aliasing
r a n sproblems with parameters
•
o n -t Messages for conditions that may cause performance problems, such as
ZPERFORMANCE:
n a VARCHAR2 value to a NUMBER column in an INSERT statement
passing
• INFORMATIONAL: Messages for conditions that do not have an effect on performance or
correctness, but that you may want to change to make the code more maintainable, such as
unreachable code that can never be executed
• ALL: Displays all categories
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In this practice, you display the compiler minitialization
s
a o uparameters. You then enable native
b ฺ t
compilation for your session and n
a i compile
e se
a anprocedure. You then suppress all compiler warnings
categories and then restore(the
n z original
l i c session-warning settings. Finally, you identify the categories
ha message
for some compiler-warning
a b le numbers.
K
b sfer
n a n
Zai n-tra
no
Managing Dependencies
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a o uand
This lesson introduces you to object dependencies,
s implicit and explicit recompilation of invalid
objects.
ฺ
ab nse t
i n
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
PL/SQL Code
o d @ is S
q s o e th
In Unit 3, you will learn the design aspects
ฺ m t us code. You will also learn how to use
aof the oPL/SQL
PL/SQL compiler and how to manage
i n abdependencies
n se among different objects in the database
(z a e
application.
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• Dependency refers to a situation where one schema object depends on another object
for its definition.
Examples
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
– There is a dependency between a view and the set of tables on which it is defined.
– There is a dependency between the procedure and the tables on which the procedure
is defined.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
m a o and
In the slide, we create two views – commissioned
ฺ t us emp_mails – on the table employees. Both
the views are dependent on the schema
i n ab object
n se employees table.
There is a dependency between
a e
(z the ltable
ic employees, and views commissioned and
emp_mails. The views a n l e
h are rdependent
b on the table employees.
K a
i n ab nsfeuses columns first_name, last_name, and commission_pct
The view commissioned
columns - tra
Zofa thenemployees table.
n o
The view emp_mails uses columns first_name, last_name, and email columns of the
employees table.
You can see that after the email column in the employees table is modified, the
status emp_mails view has become invalid. s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
When we modify the definition of the email
ฺ acolumn
t o uinsthe employees table, the view emp_mails,
which uses the email column, has n b invalidated
abeen se because of the dependency between the view
a i e n
and the table.
n (z lic
The view was defined a l
hon a differente
b version of the email column, which has now changed.
K r a
b sfeview is invalidated.
Therefore, theaemp_mails
i n n
Za n-tra
no
Some types of schema objects can reference other objects in their definitions.
For example:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Some types of schema objects can reference ฺ m a other
t o us in their definitions. For example, a view is
objects
defined by a query that references
i n ab or
tables
n e views, and the body of a subprogram can include
sother
SQL statements that reference (z aother c e
objects.
i If the definition of object A references object B, then A
n l
le to B) and B is a referenced object (with respect to A).
K ha respect
is a dependent object (with
a b
Dependency a
n b sfer
Issues
• ZIf ayou - andefinition of a referenced object, dependent objects may or may not continue
i altertrthe
nonproperly. For example, if the table definition is changed, the procedure may or may
to work
not continue to work without error.
• The Oracle server automatically records dependencies among objects. To manage
dependencies, all schema objects have a status (valid or invalid) that is recorded in the data
dictionary and you can view the status in the USER_OBJECTS data dictionary view.
• If the status of a schema object is VALID, then the object has been compiled and can be
immediately used when referenced.
• If the status of a schema object is INVALID, then the schema object must be compiled
before it can be used.
Subprogram Both
Synonym Both
s a
h
) ฺa
o m
Table Both
d s ฺc uide
Trigger Both b r an ent G
s sc tud
o d @ is S
User-defined object
q s o e th
Both
a o us
User-defined collection bฺm t Both
n a s e
( z ai icen
View a n l e l Both
h
K fera b
a b
n rans
a i
Z n-t
no
desc user_dependencies;
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺ a
m
co uide
... s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can determine dependencies in the ฺ m a from
schema
t o usthe USER_DEPENDENCIES data dictionary
view.
i n ab nse
The ALL_DEPENDENCIES and
n (zaDBA_DEPENDENCIES
l i ce views contain the additional OWNER column,
which references theh a ofathel e
b K fer b
owner object.
Status Description
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
VALID The object was successfully compiled by using the current definition in the data
dictionary.
COMPILED WITH ERRORS The most recent attempt to compile the object produced errors.
INVALID The object is marked invalid because an object that it references has changed.
(Only a dependent object can be invalid.)
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m
Every database object has one of the status avalues
t o us in the table in the slide.
shown
i
Note: The USER_OBJECTS, ALL_OBJECTS,n ab nsande DBA_OBJECTS static data dictionary views do not
distinguish between Compiled
a e
(z withlicerrors, Invalid, and Unauthorized; instead, they
describe all these as h a n
INVALID.ble
a b K f e ra
n n s
Zai n-tra
no
• Local dependencies – Both the referenced and dependent objects are on the same
database. Oracle Database manages them implicitly. There are two types of
dependencies in local dependencies using the internal tables.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
– Direct dependencies
– Indirect dependencies
• Remote dependencies – The referenced and dependent objects are on different nodes
across the network. Oracle Database uses different mechanisms to manage remote
dependencies, depending on the objects involved.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• When a view V is defined on a table T, there is a direct dependency of the view V on the
table T.
• Direct dependents are invalidated only by changes to the referenced objects that affect
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
them.
s a
View (V)
)h ฺ a
Table(T)
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The slide shows a direct dependency between
ฺ m t us and the view defined on that table. A
a theotable
ab invalidate
modification to the table structurenmight
i n se the view, as we have seen in the case of view
(z a e
earlier.
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
• Consider a PL/SQL program unit dependent on the view V, which in turn is dependent
on the table T. The PL/SQL program unit is indirectly dependent on the table T.
• Indirect dependents can be invalidated by changes to the referenced object that do not
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
affect them.
• The PL/SQL unit may be invalidated if there is a modification to the table.
s a
a
) hTable(T)
View (V)
c m
o ideฺ
ฺ
ds t Gu
a n
s c br den
s Stu
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
@
o o d t his
a s e
q theusPL/SQL unit and the table. So, the PL/SQL
The slide shows an indirect dependency
b m between
ฺ e to
unit is an indirect dependent on the atable.
in ens
z a
Indirect dependents can n
a
(
be invalidated
l e licby changes to the reference object that do not affect them. A
h mayrainvalidate
modification to the table
K b the PL/SQL unit. This is called cascading invalidation.
i n ab nsfe
Za n-tra
no
• Run the utldtree.sql script that creates the objects that enable you to display the
direct and indirect dependencies.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
@/home/oracle/labs/plpu/labs/utldtree.sql
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Displaying Direct and Indirect Dependenciesฺ m a obyusUsing Views Provided by Oracle
n a b se t
z a i
You can display direct and indirect
e n
dependencies from additional user views, called DEPTREE and
IDEPTREE; these views aren ( c
providedliby Oracle.
Example K h rable
a
1. Make i n ab thatnthe
sure s feutldtree.sql script has been executed. This script is located in the
a -tra
Z$ORACLE_HOME/labs/plpu/labs folder. You can run the script as follows:
n
no@?/labs/plpu/labs/utldtree.sql
Note: In this class, this script is supplied in the labs folder of your class files. The code
example above uses the student account ORA61. (This applies to a Linux environment. If the
file is not found, locate the file in your labs subdirectory.)
2. Populate the DEPTREE_TEMPTAB table with information for a particular referenced object by
invoking the DEPTREE_FILL procedure. There are three parameters for this procedure:
object_type Type of the referenced object
object_owner Schema of the referenced object
object_name Name of the referenced object
s a
)h ฺa
m
co uide
... s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can display a tabular representation ฺ m t o us objects by querying the DEPTREE view.
ofaall dependent
i n ab nsofethe same information by querying the IDEPTREE
You can display an indented representation
n (zacolumn
view, which consists of a single
l i cenamed DEPENDENCIES as follows:
SELECT *
h a able
FROM ideptree;K
b sfer
n a n
Zai n-tra
no
...
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
m
Let us reconsider the scenario that we ฺdiscussed
t us We created two views, commissioned
a oearlier.
and emp_mails, on the employees
i n abtable.
n se
a e
(z the first_name,
The commissioned view has
a n l e lic last_name, and commission_pct columns of
the employees table.
b Kh ferab
The emp_mails
a i na viewr a n s the first_name, last_name, and email columns of the employees
has
table. Z
o n -t
n the definition of the email column of the employees table, only the emp_mails
When we altered
view is invalidated. The commissioned view is still valid.
This process of invalidating specific objects based on their definition is fine-grained dependency
management. Whenever a referenced object is modified, only those dependent objects are
invalidated that are effected by the modification, and not all the dependent objects.
• Starting with Oracle Database 11g, dependencies are now tracked at the level of
element within unit.
• Element-based dependency tracking covers the following:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
o d @ is S
q s o e th
Example of Dependency of a Single-Table ฺ m t usIts Base Table
a Viewo on
i n
In the first example in the slide, table abT2 isncreated
se with three columns: COL_A, COL_B, and COL_C.
A view named V is created based
a
(z onlcolumns
ic e COL_A and COL_B of table T2. The dictionary views
a n
are queried and viewhV is dependent b l e on table and its status is valid.
K r a T
feT2 is altered. A new column named COL_D is added. The dictionary views
i n ab table
In the third example, n s
Zathatnview
still report - traV is dependent because element-based dependency tracking grasps that
columns COL_Ano and COL_B are not modified and, therefore, the view does not need to be
invalidated.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
In the example in the slide, the view is invalidated
ฺ t us its element (COL_A) is modified in the
a obecause
table on which the view is dependent.
i n ab nse
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
/
CREATE OR REPLACE PROCEDURE p IS
BEGIN
pkg.proc_1();
END p;
/
CREATE OR REPLACE PACKAGE pkg
IS
PROCEDURE proc_1;
PROCEDURE unheard_of;
END pkg;
s a
/ a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the example in the slide, you create a ฺ m a onamed
package
t us PKG that has procedure PROC_1 declared.
i n
A procedure named P invokes PKG.PROC_1.ab nse
The definition of the PKG n (za is lmodified
package i ce and another subroutine is added to the package
declaration. K ha rable
i
When youaquerynabthe n s fe dictionary view for the status of the P procedure, it is still valid
Z t r aUSER_OBJECTS
as shown because
n o n- the element you added to the definition of PKG is not referenced through
procedure P.
SELECT status FROM user_objects
WHERE object_name = 'P';
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Add New Items to the End of the Package ฺ m a o us
a b add them e t
i
When adding new items to a package,
a n e s
n to the end of the package. This preserves the slot
numbers and entry-pointn ( z i c
numbers oflexisting top-level package items, thereby preventing their
a
h rab
invalidation. For example, considerl e the following package:
K
b sPACKAGEfe
CREATE ORna REPLACE pkg1 IS
a i r a n
Z n-t
FUNCTION get_var RETURN VARCHAR2;
PROCEDURE noset_var (v VARCHAR2);
END;
Adding an item to the end of pkg1 does not invalidate dependents that reference get_var.
Inserting an item between the get_var function and the set_var procedure invalidates
dependents that reference the set_var function.
Reference Each Table Through a View
Reference tables indirectly by using views. This allows you to do the following:
• Add columns to the table without invalidating dependent views or dependent PL/SQL objects
• Modify or delete columns not referenced by the view without invalidating dependent objects
• An object that is not valid when it is referenced must be validated before it can be used.
• Validation occurs automatically when an object is referenced; it does not require explicit
user action.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The compiler cannot automatically revalidateฺ m t o usthat compiled with errors. The compiler
a an object
ab nwithout
recompiles the object, and if it recompiles
i n se errors, it is revalidated; otherwise, it remains
(z a e
invalid.
a n l e lic
The compiler checksh whetheratheb unauthorized object has access privileges to all of its referenced
objects. If so, a
K
b compiler
the r
ferevalidates the unauthorized object without recompiling it. If not, the
i n n s
compiler a tra
Zissuesn-appropriate error messages.
no recompiles the invalid object. If the object recompiles without errors, it is
The SQL compiler
revalidated; otherwise, it remains invalid.
For an invalid PL/SQL program unit (procedure, function, or package), the PL/SQL compiler checks
whether any referenced object is an invalid object.
• If so, the compiler recompiles the invalid object. If the object recompiles without errors, it is
revalidated; otherwise, it remains invalid.
• If not, the compiler revalidates the invalid object without recompiling it. Fast revalidation is
usually performed on objects that were invalidated due to cascading invalidation.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
the network.
• Oracle Database does not manage
dependencies among remote schema
objects other than local-procedure-to-
remote-procedure dependencies.
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the case of remote dependencies, the ฺ m a are
objects
t o uons separate nodes. The local stored procedure
and all its dependent objects are n
i ab nsebut are automatically recompile when called for the first
invalidated,
time. Oracle Database does(z a manage
not i cedependencies among remote schema objects other than
n l
ha rable dependencies.
local-procedure-to-remote-procedure
K
For example, a
i n b that
assume
n s fea local view is created and defined by a query that references a remote
Za assume
table. Also
n -trathat
remote table.oLater,
a local procedure includes a SQL statement that references the same
the definition of the table is altered.
n
As a result, the local view and procedure are never invalidated, even if the view or procedure is used
after the table is altered and even if the view or procedure now returns errors when used. In this
case, the view or procedure must be altered manually so that errors are not returned. In such cases,
lack of dependency management is preferable to unnecessary recompilations of dependent objects.
Recompilation of Dependent Objects: Local and Remote
• Verify successful explicit recompilation of the dependent remote procedures and implicit
recompilation of the dependent local procedures by checking the status of these procedures
within the USER_OBJECTS view.
• If an automatic implicit recompilation of the dependent local procedures fails, the status
remains invalid and the Oracle server issues a runtime error. Therefore, to avoid disrupting
production, it is strongly recommended that you recompile local dependent objects manually,
rather than rely on an automatic mechanism.
• Signature checking
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
TIMESTAMP Checking ฺ m a o us
a btime stamp
e t
Each PL/SQL program unit carries
a i n a
e s
n that is set when it is created or recompiled.
Whenever you alter a PL/SQL
n ( z program c
li unit or a relevant schema object, all its dependent program
a l e
h rab be recompiled before they can execute. The actual time stamp
units are marked as invalid and must
K faestatement in the body of a local procedure calls a remote procedure.
i n ab when
comparison occurs
n s
Za Checking
SIGNATURE
n - tra
no program unit, both the time stamp and the signature are recorded. The signature
For each PL/SQL
of a PL/SQL construct contains information about the following:
• The name of the construct (procedure, function, or package)
• The base types of the parameters of the construct
• The modes of the parameters (IN, OUT, or IN OUT)
• The number of the parameters
The recorded time stamp in the calling program unit is compared with the current time stamp in the
called remote program unit. If the time stamps match, the call proceeds. If they do not match, the
remote procedure call layer performs a simple comparison of the signature to determine whether the
call is safe or not. If the signature has not been changed in an incompatible manner, execution
continues; otherwise, an error is returned.
• You can define whether a remote procedure call should undergo Timestamp checking or
Signature checking by setting the REMOTE_DEPENDENCIES_MODE
parameter.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
a
Remote procedure B:
s
)h ฺa
compiles and is VALID
at 8:00 AM
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Local Procedures Referencing Remote ฺ m t o us
aProcedures
n b se
aremote
A local procedure that references
z i a
a after ithe nprocedure is invalidated by the Oracle server if the
elocal
(
remote procedure is recompiled
n l c procedure is compiled.
a l e
h rab Mechanism
Automatic Remote
b KDependency
fe
i n a compiles,
n s
a -tra
When a procedure the Oracle server records the time stamp of that compilation within the
P code Z
on
of the procedure.
n
In the slide, when the remote procedure B is successfully compiled at 8:00 AM, this time is recorded
as its time stamp.
TIMESTAMP of A Record
TIMESTAMP of B TIMESTAMP of B
s a
a
)h ฺ
Local procedure A: VALID Remote procedure B: VALID
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Local Procedures Referencing Remote ฺ m t o us
aProcedures
Automatic Remote Dependency i n ab nse
Mechanism
n (za laicremote
e
When a local procedure
h a able
referencing procedure compiles, the Oracle server also records
the time stamp of the
b K remote
f e r procedure in the P code of the local procedure.
a s
ainlocal-tprocedure
In the slide,
Z r an A (which is dependent on remote procedure B) is compiled at 9:00 AM.
proceduren A.
on of both procedure A and remote procedure B are recorded in the P code of
The time stamps
TIMESTAMP
comparison
s a
)h ฺa
Local procedure A: VALID Remote procedure B: VALID
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Automatic Remote Dependency ฺ m a o us
n a b se t
ai aticrun
When the local procedure is invoked
( z entime, the Oracle server compares the two time stamps of
the referenced remote procedure.
an able l
If the time stamps are h
K equal r(indicating that the remote procedure has not recompiled), then the
a b s f e
Z ain executes
Oracle server
t r a n the local procedure.
- the slide, the time stamp recorded with the P code of remote procedure B is the
In the examplenin
n o
same as that recorded with local procedure A. Therefore, local procedure A is valid.
s a
Remote procedure B:
a
)h ฺ
Recompiles and is VALID
at 11:00 AM
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Local Procedures Referencing Remote ฺ m t o us
aProcedures
Assume that remote procedureaBin
ab nse recompiled at 11:00 AM. The new time stamp is
is successfully
recorded along with its Pn (z
code. l i ce
K ha rable
i n ab nsfe
Za n-tra
no
TIMESTAMP
comparison
TIMESTAMP of A TIMESTAMP of B
s a TIMESTAMP of B
a
) h B:ฺ VALID
Local procedure A: INVALID Remote m
co uide
procedure
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Automatic Remote Dependency ฺ m a o us
n a b se t
i
cen and returns a runtime error. If the local procedure
If the time stamps are not equal a(indicating that the remote procedure has recompiled), then the
Oracle server invalidatesnthe (zlocal l i
procedure
(which is now tagged hasa invalid)
a b leinvoked a second time, then the Oracle server recompiles it
is
K er with the automatic local dependency mechanism.
b in accordance
f
n a
before executing,
i tran s
Note: IfZaalocal procedure
- returns a runtime error the first time it is invoked (indicating that the remote
procedure’s o n
n time stamp has changed), then you should develop a strategy to reinvoke the local
procedure.
In the example in the slide, the remote procedure is recompiled at 11:00 AM and this time is
recorded as its time stamp in the P code. The P code of local procedure A still has 8:00 AM as the
time stamp for remote procedure B. Because the time stamp recorded with the P code of local
procedure A is different from that recorded with the remote procedure B, the local procedure is
marked invalid. When the local procedure is invoked for the second time, it can be successfully
compiled and marked valid.
A disadvantage of the time stamp mode is that it is unnecessarily restrictive. Recompilation of
dependent objects across the network is often performed when not strictly necessary, leading to
performance degradation.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
To alleviate some of the problems with ฺthem t o us dependency model, you can use the
atime stamp-only
i n ab procedure
signature model. This allows the remote
n sise distributed.
to be recompiled without affecting the local
(z a e
procedures. This is important
a n
if the
l e lic
database
h rabcontains the following information:
The signature of a subprogram
K
• The n
i ab of the
name
n s fe
subprogram
• ZThe n tra of the parameters
a data-types
•
o
Thenmodes of the parameters
• The number of parameters
• The data type of the return value for a function
If a remote program is changed and recompiled but the signature does not change, then the local
procedure can execute the remote procedure. With the time stamp method, an error would have
been raised because the time stamps would not have matched.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
You revalidate a PL/SQL program unit by recompiling it. There are two ways of recompiling:
• Implicit runtime recompilation
– Local dependencies are resolved implicitly
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Recompiling PL/SQL Objects ฺ m a o us
n a b se t
If the recompilation is successful,
z i the object
aWhen enrecompile
becomes valid. If not, the Oracle server returns an error
(
and the object remains invalid.
n l i c
you a PL/SQL object, the Oracle server first
a l e
objects. Locala b Kh object
recompiles any invalid
f
dependencies e
onbwhich it depends. This is implicit recompilation or revalidation of the
raare generally resolved implicitly.
i n n s
Za resolve
You explicitly
n - tra dependencies by using the ALTER statement. You may have to explicitly
recompile ntheoPL/SQL program units if the implicit recompilation is unsuccessful. You have to
resolve such dependencies by using the ALTER statement.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Sometimes, a recompilation of dependent ฺ m a o usis unsuccessful (for example, when a
procedures
a
referenced table is dropped or renamed).
n b se t
( z ai is based
i c enon the exact dependency. If a referenced view is
The success of any recompilation
anis dependent l
le on the view needs to be recompiled. The success of the
recreated, any objecththat a b
recompilationa
K
b sonfethe
depends r columns that the view now contains, as well as the columns that the
dependent n
aiobjects r an for their execution. If the required columns are not part of the new view,
require
Z - t
nonremains invalid.
then the object
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The recompilation of dependent objectsฺm a o uif:s
is successful
• New columns are added ito n b se ttable
aa referenced
( z a icen
•
a n
All INSERT statements include
l e l a column list
• Kh isfedefined
No new column
b r ab as NOT NULL
a i
When a private na table
r a n s
is referenced by a dependent procedure and the private table is dropped, the
status of theo n -t
Z dependent procedure would become invalid. When the procedure is recompiled (either
explicitly ornimplicitly) and a public table exists, the procedure can recompile successfully but is now
dependent on the public table. The recompilation is successful only if the public table contains the
columns that the procedure requires; otherwise, the status of the procedure remains invalid.
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
You can minimize recompilation failureฺby a o the
following
t usguidelines that are shown in the slide.
i n ab nse
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Package
Procedure A
specification
declaration
Package
Standalone Procedure A
body
procedure declaration Package
.
s a definition
.
. )h ฺa changed
. m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can simplify dependency management ฺ m t o us when referencing a package procedure or
awith packages
function from a standalone procedure
i n abor function.
n se
z a
If the package body (changes e
ic the package specification does not change, then the
•
a n l e land
h rathat
standalone procedure
K b references a package construct remains valid.
• If thenpackage
i fe
ab nspecification
s changes, then the outside procedure referencing a package
a
Z n-t
construct r
is a
invalidated.
no
Package
Procedure A
specification
declaration
Package
body Procedure A
Standalone declaration
procedure definition .
s a
changed .
. )h ฺa
. m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
If a standalone procedure that is referenced
ฺ m t uspackage changes, then the entire package
awithinothe
body is invalidated, but the packagen b se remains valid. Therefore, it is recommended that
aspecification
z i en in a package body should be in the package body.
a the procedures
all the procedures referenced( by
l i c
h an able
b K fer
i a
n rans
a
Z n-t
no
a. True
b. False
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Answer: a ฺ m a o us
n a b se t
Displaying Direct and Indirect
( z aiDependencies
i c en
You can display direct a n indirect
and l l
edependencies as follows:
1. Run the b
h b
K fera script, which creates the objects that enable you to display the
utldtree.sql
i
direct
a n s dependencies.
nand indirect
a
Z n-the r a
t DEPTREE_TEMPTAB table with information for a particular referenced object by
2. Populate
o
n the DEPTREE_FILL procedure.
executing
3. Query the DEPTREE or IDEPTREE views.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Avoid disrupting production by keepingฺam track
t us procedures and recompiling them
a of odependent
manually as soon as possible after
i n atheb definition
n se of a database object changes.
(z a e
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In this practice, you use the DEPTREE_FILLฺ m t o us and the IDEPTREE view to investigate
a procedure
dependencies in your schema. Inn
i ab nyou
addition, se recompile invalid procedures, functions, packages,
(z a e
and views.
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
• Create, alter, and drop a table using the data definition language (DDL) statements
• Insert, update, and delete rows from one or more tables using data manipulation
language (DML) statements
• Commit, roll back, and create save points using the transaction control statements
• Perform join operations on one or more tables
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
This lesson explains how to obtain dataฺm from
s tables by using the SELECT statement,
a oneoor umore
b structure t
how to use DDL statements to alter
a i n athe
e n se of data objects, how to manipulate data in the
n z
existing schema objects by (using the
l i c
DML statements, how to manage the changes made by DML
h rab e display data from multiple tables using SQL:1999 join syntax.
statements, and how toause joinslto
K
i n ab nsfe
Za n-tra
no
materialized views
• A SELECT statement is also known as a query because it queries a database.
• Syntax:
o d @ is S
q s o e th
In its simplest form, a SELECT statement ฺ m a include
must
t o usthe following:
i
• A SELECT clause, which specifies n abthencolumns
se to be displayed
a
(z the e
• A FROM clause, which
a nidentifies
l e lictable containing the columns that are listed in the SELECT
clause
b Kh ferab
i
In the syntax:
a na rans
Z n-t Is a list of one or more columns
SELECT
n o
* Selects all columns
DISTINCT Suppresses duplicates
column|expression Selects the named column or the expression
alias Gives different headings to the selected columns
FROM table Specifies the table containing the columns
Note: Throughout this course, the words keyword, clause, and statement are used as follows:
• A keyword refers to an individual SQL element (for example, SELECT and FROM are keywords).
• A clause is a part of a SQL statement (for example, SELECT employee_id, last_name).
• A statement is a combination of two or more clauses (for example, SELECT * FROM
employees).
SELECT *
FROM job_history;
s a
SELECT manager_id, job_id
)h ฺa
FROM employees;
m
co uide
s ฺ
… and t G
b r n
s sc tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can display all columns of data in aฺm table
t o us the SELECT keyword with an asterisk (*)
a by following
or by listing all the column names i n ab thenSELECT
after se keyword. The first example in the slide displays
(z
all the rows from the job_history
a e
ic Specific columns of the table can be displayed by
a n l e ltable.
specifying the columnhnames, separated
b by commas. The second example in the slide displays the
manager_ida
K
b job_id
and
r a
fecolumns from the employees table.
i n n s
Za nclause,
In the SELECT - tra specify the columns in the order in which you want them to appear in the
o
output. Fornexample, the following SQL statement displays the location_id column before
displaying the department_id column:
SELECT location_id, department_id FROM departments;
Note: You can enter your SQL statement in a SQL Worksheet and click the Run Statement icon or
press F9 to execute a statement in SQL Developer. The output displayed on the Results tabbed
page appears as shown in the slide.
• Syntax:
SELECT * FROM table
[WHERE condition];
• Example:
o d @ is S
q s o e th
The WHERE clause specifies a conditionฺm to a
filter rows,
s
uproducing a subset of the rows in the table. A
b t o
a i e n seexample
condition specifies a combinationnofaone or more expressions and logical (Boolean) operators. It
n (z
returns a value of TRUE, FALSE, or
i
NULL.
l c The in the slide retrieves the location_id of
ha rable
the marketing department.
K
The WHERE clause
i n fe be used to update or delete data from the database.
ab cannsalso
Za n-tra
For example:
no
UPDATE departments
SET department_name = 'Administration'
WHERE department_id = 20;
and
DELETE from departments
WHERE department_id =20;
• Example:
o d @ is S
q s o e th
The ORDER BY clause specifies the order ฺ m t usrows should be displayed. The rows can be
inawhichothe
sorted in ascending or descending n b Bysdefault,
aorder. e the rows are displayed in ascending order.
a i e n
(z rows
The example in the slide retrieves
n lic from the employees table ordered first by ascending order
of department_id h a
and then by l e
b descending order of salary.
K r a
i n ab nsfe
Za n-tra
no
• Use the optional GROUP BY clause to group columns that have matching values into
subsets.
• No group has two rows having the same value for the grouping column or columns.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Syntax:
SELECT <column1, column2, ... column_n>
FROM table
[WHERE condition]
[GROUP BY <column> [, ...] ]
[ORDER BY <column> [, ...] ] ;
• Example:
s a
SELECT department_id, MIN(salary), MAX (salary)
FROM employees )h ฺ a
m
co uide
GROUP BY department_id ;
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
The GROUP BY clause is used to group ฺselected a rows s on the value of expr(s) for each row.
ubased
abguarantee t o
The clause groups rows but doesnnot
use the ORDER BY clause. (za
i e n se the order of the result set. To order the groupings,
a n l e lic
K h that
Any SELECT list elements
r a bare not included in aggregation functions must be included in the
GROUP BY list a
i n n s feThis includes both columns and expressions. The database returns a
ofbelements.
single row
n - tra information for each group.
Zaof summary
The examplenoin the slide returns the minimum and maximum salaries for each department in the
employees table.
• DDL statements are used to define, structurally change, and drop schema objects.
• The commonly used DDL statements are:
– CREATE TABLE, ALTER TABLE, and DROP TABLE
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
– GRANT, REVOKE
– TRUNCATE
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Data definition language (DDL) statements ฺ m t usto alter the attributes of an object without
aenableoyou
altering the applications that accessn b object.
athe se You can also use DDL statements to alter the
a i e n
n (z
structure of objects while database users
l i c are performing work in the database. These statements are
most frequently used to:
K ha rable
• Create,
n b andsfdrop
aalter, e schema objects and other database structures, including the database
i n
Za n-tra users
itself and database
• no all the data in schema objects without removing the structure of these objects
Delete
• Grant and revoke privileges and roles
Oracle Database implicitly commits the current transaction before and after every DDL statement.
• Example:
o d @ is S
q s o e th
Use the CREATE TABLE statement to create
ฺ m a a table
t o uinsthe database. To create a table, you must
have the CREATE TABLE privilege n b a storage
aand se area in which to create objects.
a i e n
The table owner and the n (z owner
database lic automatically gain the following privileges on the table after
a l e
it is created:
b Kh ferab
• na rans
INSERT
a i
• ZSELECTn-t
• no
REFERENCES
• ALTER
• UPDATE
The table owner and the database owner can grant the preceding privileges to other users.
• Use the ALTER TABLE statement to modify the definition of an existing table in the
database.
• Example 1:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Example 2:
o d @ is S
q s o e th
The ALTER TABLE statement allows you ฺ mto
t us to an existing table.
amakeochanges
You can: i n ab nse
• (za lice
Add a column toaantable
h a b le
• K
b stofeartable
Add a constraint
n a
•
ZModify r an column definition
ai an-texisting
• noancolumn from a table
Drop
• Drop an existing constraint from a table
• Increase the width of the VARCHAR and CHAR columns
• Change a table to have read-only status
Example 1 in the slide adds a new column called location_id to the teach_dept table.
Example 2 updates the existing department_name column from VARCHAR2(10) to
VARCHAR2(30), and adds a NOT NULL constraint to it.
• The DROP TABLE statement removes the table and all its data from the database.
• Example:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• DROP TABLE with the PURGE clause drops the table and releases the space that is
associated with it.
• The CASCADE CONSTRAINTS clause drops all referential integrity constraints from the
table.
s a
DROP TABLE teach_dept CASCADE CONSTRAINTS; )h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The DROP TABLE statement allows youฺm to a
remove
s
autable and its contents from the database, and
pushes it to the recycle bin. Dropping aba table e t o
a i n e n sinvalidates dependent objects and removes object
privileges on the table.
n (z lic
Use the PURGE clause a
h alongrawithl e
b the DROP TABLE statement to release back to the tablespace the
K fe You cannot roll back a DROP TABLE statement with the PURGE
space allocated
i n abyou
for the table.
n s
Za n-tra
clause, nor can recover the table if you have dropped it with the PURGE clause.
The CASCADEno CONSTRAINTS clause allows you to drop the reference to the primary key and unique
keys in the dropped table.
table
– Select data, a view, or a subset of columns from a table
– Create a trigger on a table
– Execute a specified function or procedure
• Example:
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can use the GRANT statement to: ฺma
t o us
• i
Assign privileges to a specificn abusernorsrole,
e or to all users, to perform actions on database
(z a e
objects
a n l e lic
• Grant a roleKtoha user,r atobPUBLIC, or to another role
b
na arGRANT f e
s statement, check that the derby.database.sql Authorization property
Before you iissue
a a n
-t property enables the SQL Authorization mode. You can grant privileges on an
is set toZTrue.nThis
o
n are the owner of the database.
object if you
You can grant privileges to all users by using the PUBLIC keyword. When PUBLIC is specified, the
privileges or roles affect all current and future users.
• DELETE
• INSERT
• REFERENCES
• SELECT
• UPDATE
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
Oracle Database provides a variety of privilege
ฺ a types
t o utos grant privileges to a user or role:
n b stype
aprivilege e to grant all privileges to the user or role for the
• Use the ALL PRIVILEGES
a i e n
specified table.
n (z lic
a l e
•
b Kh privilege
Use the DELETE
f e r ab type to grant permission to delete rows from the specified table.
• Usein a INSERT
the n sprivilege type to grant permission to insert rows into the specified table.
a -t r a
ZUse thenREFERENCES
• privilege type to grant permission to create a foreign key reference to
n o
the specified table.
• Use the SELECT privilege type to grant permission to perform SELECT statements on a table
or view.
• Use the UPDATE privilege type to grant permission to use the UPDATE statement on the
specified table.
• Use the REVOKE statement to remove privileges from a user to perform actions on
database objects.
• Revoke a system privilege from a user:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
REVOKE dw_manager
FROM sh;
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The REVOKE statement removes privileges ฺ m t us user (or users) or role to perform actions
afrom aospecific
on database objects. It performs then b seoperations:
afollowing
i
a icePUBLIC, n
• Revokes a role from(azuser, froml or from another role
a n l e
• Kh feforraan
Revokes privileges
b
b object if you are the owner of the object or the database owner
a i na arrole
Note: To revoke
a n sor system privilege, you must have been granted the privilege with the ADMIN
OPTION.Z n-t
no
• Use the TRUNCATE TABLE statement to remove all the rows from a table.
• Example:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The TRUNCATE TABLE statement deletes ฺ m t usfrom a specific table. Removing rows with the
aall the orows
TRUNCATE TABLE statement can
i n abebmoren e than dropping and re-creating a table. Dropping
sefficient
(z a e
and re-creating a table:
a n l e lic
•
K hdependent
Invalidates the
r a b objects of the table
• Requires
n abyou nto:sfe
i tra object privileges
Za- nRegrant
o -
-n Re-create indexes, integrity constraints, and triggers.
- Respecify its storage parameters
The TRUNCATE TABLE statement spares you from these efforts.
Note: You cannot roll back a TRUNCATE TABLE statement.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Data manipulation language (DML) statements
ฺ m a enable
t o usyou to query or change the contents of an
ab nare
existing schema object. These statements
i n semost frequently used to:
a
(zto a table e
• Add new rows of data
a n l e licor view by specifying a list of column values or by using a
K h and
subquery to select
r a b
manipulate existing data
• Change
i n abcolumn
n s fe in the existing rows of a table or view
values
•
a -rows
ZRemove n tra from tables or views
nofo DML statements that forms a logical unit of work is called a transaction. Unlike DDL
A collection
statements, DML statements do not implicitly commit the current transaction.
• Example:
INSERT INTO departments
VALUES (200,'Development',104,1400);
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The INSERT statement adds rows to a ฺtable. m a Be sure
t o utos insert a new row containing values for each
column and to list the values in then b order
adefault se of the columns in the table. Optionally, you can also
a i e n
n (z
list the columns in the INSERT statement.
lic
a l e
For example:
b Kh ferab
a i najob_id)
INSERT
r n
INTO
a s job_history (employee_id, start_date, end_date,
Z n-t
no (120,'25-JUL-06','12-FEB_08','AC_ACCOUNT');
VALUES
The syntax discussed in the slide allows you to insert a single row at a time. The VALUES keyword
assigns the values of expressions to the corresponding columns in the column list.
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
• Example:
UPDATE copy_emp
SET
o d @ is S
q s o e th
The UPDATE statement modifies the existing
ฺ m a values
t o uinsa table. Confirm the update operation by
i n ab rows.
querying the table to display the updated
n se You can modify a specific row or rows by specifying
the WHERE clause. (z a e
a n l e lic
For example:
b Kh ferab
a i na UPDATE
r a n s employees
Z n-SET t salary = 17500
o
n WHERE employee_id = 102;
In general, use the primary key column in the WHERE clause to identify the row to update. For
example, to update a specific row in the employees table, use employee_id instead of
employee_name, to identify the row, because more than one employee may have the same name.
Note: Typically, the condition keyword is composed of column names, expressions, constants,
subqueries, and comparison operators.
• Use the DELETE statement to delete the existing rows from a table.
• Syntax:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Write the DELETE statement using the WHERE clause to delete specific rows from a
table.
DELETE FROM departments
WHERE department_name = 'Finance';
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The DELETE statement removes existing m a from
rows
s You must use the WHERE clause to
ua table.
ฺ
b based t o
delete a specific row or rows fromnaatable
i
a names, e n se on a condition. The condition identifies the rows
to be deleted. It may contain(z column i c expressions, constants, subqueries, and comparison
n l
operators.
K ha rable
The first example
i n n s fe deletes the finance department from the departments table. You can
ab inoperation
the slide
Za n-tra
confirm the delete by using the SELECT statement to query the table.
no SELECT *
FROM departments
WHERE department_name = 'Finance';
If you omit the WHERE clause, all rows in the table are deleted. For example:
DELETE FROM copy_emp;
The preceding example deletes all the rows from the copy_emp table.
• Transaction control statements are used to manage the changes made by DML
statements.
• The DML statements are grouped into transactions.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
A transaction is a sequence of SQL statements a that s Database treats as a single unit.
uOracle
Transaction control statements are
ฺ
aused e t
b in asdatabaseo to manage the changes made by DML
a i n e n
n (z
statements and to group these
lic
statements into transactions.
a l e
h raa bunique transaction_id and it groups SQL statements so that they
Each transaction is assigned
K fe means they are applied to the database, or all rolled back, which
i n ab nswhich
are either all committed,
means Z they
n tra from the database.
a are -undone
no
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The COMMIT statement ends the current ฺ m a o ubysmaking all the pending data changes
transaction
a
permanent. It releases all row andntable b locks, e t
and erases any savepoints that you may have marked
s
ai Theichanges
en made using the COMMIT statement are visible to all
( z
since the last commit or rollback.
l c
users.
h an able
Oracle recommendsb K that fyou
er explicitly end every transaction in your application programs with a
n a s
COMMIT or
Z aiROLLBACK
- t r anstatement, including the last transaction, before disconnecting from Oracle
Database. If o
n n do not explicitly commit the transaction and the program terminates abnormally, the
you
last uncommitted transaction is automatically rolled back.
Note: Oracle Database issues an implicit COMMIT before and after any data definition language
(DDL) statement.
• Use the ROLLBACK statement to undo changes made to the database during the current
transaction.
• Use the TO SAVEPOINT clause to undo a part of the transaction after the savepoint.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Example:
UPDATE employees
SET salary = 7000
WHERE last_name = 'Ernst';
SAVEPOINT Ernst_sal;
UPDATE employees
SET salary = 12000
s a
WHERE last_name = 'Mourgos'; a
)h ฺ
m
co uide
ROLLBACK TO SAVEPOINT Ersnt_sal;
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The ROLLBACK statement undoes workฺm a in the
done
t o us transaction. To roll back the current
current
transaction, no privileges are necessary.
i n ab nse
Using ROLLBACK with the TO
n (zaSAVEPOINT
l i ce clause performs the following operations:
hathe portion
a b leof the transaction after the savepoint
• K
Rolls back only
b savepointsf er created after that savepoint. The named savepoint is retained, so you
n a s
•
airoll back
Erases
Zcan
all
- t r atonthe same savepoint multiple times.
non without the TO SAVEPOINT clause performs the following operations:
Using ROLLBACK
• Ends the transaction
• Undoes all the changes in the current transaction
• Erases all savepoints in the transaction
• Use the SAVEPOINT statement to name and mark the current point in the processing of
a transaction.
• Specify a name to each savepoint.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The SAVEPOINT statement identifies aฺpoint m t us to which you can later roll back. You
a in a otransaction
must specify a distinct name for each
i n absavepoint.
n se If you create a second savepoint with the same
(z a
identifier as an earlier savepoint, the e
c savepoint is erased.
earlier
i
n
a created, l
le you can either continue processing, commit your work, roll back
After a savepoint hashbeen a b
K
b orsroll
the entire transaction, f erback to the savepoint.
n a n erases all savepoints. When you roll back to a savepoint, any
i torracommit
A simpleZarollback-
on after that savepoint are erased. The savepoint to which you have rolled back is
savepointsnmarked
retained.
When savepoint names are reused within a transaction, the Oracle Database moves (overrides) the
save point from its old position to the current point in the transaction.
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
When data from more than one table inฺm theadatabase
t o uiss required, a join condition is used. Rows in
ab ntable
one table can be joined to rows innanother
i se according to common values that exist in the
(z
corresponding columns (usually a primaryi e
c foreign key columns).
and
n
a or more le l
To display data from h
two b related tables, write a simple join condition in the WHERE clause.
K r a
n
In the syntax:
i ab nsfe
Za n-tra
table1.column Denotes the table and column from which data is retrieved
n o
table1.column1 = Is the condition that joins (or relates) the tables together
table2.column2
Guidelines
• When writing a SELECT statement that joins tables, precede the column name with the table
name for clarity and to enhance database access.
• If the same column name appears in more than one table, the column name must be prefixed
with the table name.
• To join n tables together, you need a minimum of n-1 join conditions. For example, to join
four tables, a minimum of three joins is required. This rule may not apply if your table has a
concatenated primary key, in which case more than one column is required to uniquely
identify each row.
• Natural join
• Equijoin
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Nonequijoin
• Outer join
• Self-join
• Cross join
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
To join tables, you can use Oracle’s join ฺ m a o us
syntax.
n a b se t
Note: Before the Oracle9i release,
z a i the joinnsyntax was proprietary. The SQL:1999–compliant join
e
(
syntax does not offer anynperformance l i cbenefits over the Oracle-proprietary join syntax.
K ha rable
i n ab nsfe
Za n-tra
no
• Use table prefixes to qualify column names that are in multiple tables.
• Use table prefixes to improve performance.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
When joining two or more tables, you need m ato qualify s names of the columns with the table name
uthe
ฺ
abprefixes, t o
to avoid ambiguity. Without the table
a i n e n seEMPLOYEES
the DEPARTMENT_ID column in the SELECT list could
be from either the DEPARTMENTS
n (z table
l i cor the table. Therefore, it is necessary to add
h a your
the table prefix to execute
a b le If there are no common column names between the two
query.
tables, there is no K
btheneed toe
f r the columns. However, using a table prefix improves performance,
qualify
n a s
Z ai -tran server exactly where to find the columns.
because you tell Oracle
n names with table names can be very time consuming, particularly if table names
Qualifying column
noTherefore,
are lengthy. you can use table aliases, instead of table names. Just as a column alias
gives a column another name, a table alias gives a table another name. Table aliases help to keep
SQL code smaller, thereby using less memory.
The table name is specified in full, followed by a space, and then the table alias. For example, the
EMPLOYEES table can be given an alias of e, and the DEPARTMENTS table an alias of d.
Guidelines
• Table aliases can be up to 30 characters in length, but shorter aliases are better than longer
ones.
• If a table alias is used for a particular table name in the FROM clause, that table alias must be
substituted for the table name throughout the SELECT statement.
• Table aliases should be meaningful.
• A table alias is valid only for the current SELECT statement.
• The NATURAL JOIN clause is based on all the columns in the two tables that have the
same name.
• It selects rows from tables that have the same names and data values of columns.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Example:
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can join tables automatically basedฺm
t o us in the two tables that have matching data
onathe columns
types and names. You do this by n
i ab thenNATURAL
using se JOIN keywords.
a
z on those e
Note: The join can happen
a n (only
l e lic columns that have the same names and data types in both
tables. If the columnshhave the b same name but different data types, the NATURAL JOIN syntax
K r a
causes an error.
i n ab nsfe
Za nin-tthe
In the example ra slide, the COUNTRIES table is joined to the LOCATIONS table by the
COUNTRY_ID nocolumn, which is the only column of the same name in both tables. If other common
columns were present, the join would have used them all.
EMPLOYEES DEPARTMENTS
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
…
Primary key
Foreign key s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
An equijoin is a join with a join condition ฺ m a o uansequality operator. An equijoin combines rows
containing
that have equivalent values for the a b scolumns.
specified e t To determine an employee’s department
n
aini theiDEPARTMENT_ID
en
name, you compare the values
n ( z l c column in the EMPLOYEES table with the
DEPARTMENT_ID values le
hisaanin equijoin;
the DEPARTMENTS
a b table. The relationship between the EMPLOYEES and
DEPARTMENTS tables
b K f e r that is, values in the DEPARTMENT_ID column in both tables
a s
Z ain Often,
must be equal.
- t r a nthis type of join involves primary and foreign key complements.
nonare also called simple joins.
Note: Equijoins
ON e.department_id = d.department_id;
s a
… )h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the example in the slide: ฺ m a o us
a e t
bthe column
• n
ai icen
The SELECT clause specifies s names to retrieve:
- ( z
Employeenlast name, lemployee ID, and department ID, which are columns in the
a l e
Kh fetable
EMPLOYEES
b r ab
- inaDepartment
n s ID and location ID, which are columns in the DEPARTMENTS table
a
ZThe FROM r a
-tclause specifies the two tables that the database must access:
•
o n
n EMPLOYEES table
-
- DEPARTMENTS table
• The WHERE clause specifies how the tables are to be joined:
e.department_id = d.department_id
Because the DEPARTMENT_ID column is common to both tables, it must be prefixed with the table
alias to avoid ambiguity. Other columns that are not present in both the tables need not be qualified
by a table alias, but it is recommended for better performance.
Note: When you use the Execute Statement icon to run the query, SQL Developer suffixes a “_1” to
differentiate between the two DEPARTMENT_IDs.
ON d.location_id = l.location_id
AND d.department_id IN (20, 50);
o d @ is S
q s o e th
In addition to the join, you may have criteria m afor your s clause to restrict the rows in
uWHERE
ฺ
ainb thenjoin. t o
consideration for one or more tables
a i n e sineaddition,
The example in the slide performs a join on the
DEPARTMENTS and LOCATIONS
n ( z tables
l i cand, displays only those departments with ID
equal to 20 or 50. To add a more
hclause a b le
conditions to the ON clause, you can add AND clauses. Alternatively,
you can use a WHERE
b K f e r to apply additional conditions.
a s
n ranthe same output.
Zai produce
Both queries
n -t
n o
ON e.salary
BETWEEN j.lowest_sal AND j.highest_sal;
… a
a s
m )h ฺ
s ฺ co uide
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The example in the slide creates a nonequijoin
ฺ m t us an employee’s salary grade. The salary
a tooevaluate
must be between any pair of the low n b high
aand sesalary ranges.
a i e n
It is important to note thatnall(zemployeeslic appear exactly once when this query is executed. No
a
employee is repeatedhin the list. l e
bThere are two reasons for this:
K r a
finethe job grade table contain grades that overlap. That is, the salary value
• Nonenof
i abthe rows
n s
n - tra can lie only between the low salary and high salary values of one of the
Zforaan employee
rowsnoin the salary grade table.
• All of the employees’ salaries lie within the limits that are provided by the job grade table.
That is, no employee earns less than the lowest value contained in the LOWEST_SAL column
or more than the highest value contained in the HIGHEST_SAL column.
Note: Other conditions (such as <= and >=) can be used, but BETWEEN is the simplest. Remember
to specify the low value first and the high value last when using the BETWEEN condition. The Oracle
server translates the BETWEEN condition to a pair of AND conditions. Therefore, using BETWEEN has
no performance benefits, but should be used only for logical simplicity.
Table aliases have been specified in the example in the slide for performance reasons, not because
of possible ambiguity.
• You can use the USING clause to match only one column when more than one column
matches.
• You cannot specify this clause with a NATURAL join.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Do not qualify the column name with a table name or table alias.
• Example:
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the example in the slide, the COUNTRY_IDฺ m a columns
t o usin the COUNTRIES and LOCATIONS tables are
joined and thus the LOCATION_ID
i n aofbthe location
n se where an employee works is shown.
(z a e
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
• The join condition for the natural join is basically an equijoin of all columns with the same
name.
• Use the ON clause to specify arbitrary conditions or specify columns to join.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
Use the ON clause to specify a join condition.
ฺ t usyou can specify join conditions separate from
a Withothis,
any search or filter conditions in the
n b sclause.
aWHERE e
a i e n
(z columns
In this example, the EMPLOYEE_ID
n lic in the EMPLOYEES and JOB_HISTORY tables are joined
using the ON clause. h a
Whereverb l e
an employee ID in the EMPLOYEES table equals an employee ID in
K r a
e row is returned. The table alias is necessary to qualify the matching
the JOB_HISTORY
i n ab table,
n s fthe
columnZ a -tra
names.
n the ON clause to join columns that have different names. The parentheses around
nouse
You can also
the joined columns, as in the example in the slide, (e.employee_id = j.employee_id), is
optional. So, even ON e.employee_id = j.employee_id will work.
Note: When you use the Execute Statement icon to run the query, SQL Developer suffixes a ‘_1’ to
differentiate between the two employee_ids.
• A join between two tables that returns all matched rows, as well as the unmatched rows
from the left table is called a LEFT OUTER JOIN.
• Example:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
This query retrieves all the rows in the COUNTRIES
ฺ t us which is the left table, even if there is no
a o table,
match in the LOCATIONS table. nab se
a i e n
n (z lic
a l e
b Kh ferab
a i na rans
Z n-t
no
• A join between two tables that returns all matched rows, as well as the unmatched rows
from the right table is called a RIGHT OUTER JOIN.
• Example:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
…
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a o ustable, which is the table at the right, even if
This query retrieves all the rows in the DEPARTMENTS
ฺ
there is no match in the EMPLOYEES n a btable. se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• A join between two tables that returns all matched rows, as well as the unmatched rows
from both tables is called a FULL OUTER JOIN.
• Example:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
…
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
This query retrieves all the rows in the EMPLOYEES
ฺ t us even if there is no match in the
a o table,
DEPARTMENTS table. It also retrieves
i n aball the
n e in the DEPARTMENTS table, even if there is no
srows
match in the EMPLOYEES table. (z a e
a n l e lic
b Kh ferab
a i na rans
Z n-t
no
s a
)h ฺ a
m
co uide
… s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m
Sometimes you need to join a table to itself. aTo find
t o usname of each employee’s manager, you
the
need to join the EMPLOYEES tablento
i abitself,norseperform a self-join. The example in the slide joins the
EMPLOYEES table to itself. To( a ictwo
zsimulate e tables in the FROM clause, there are two aliases, namely
n l
worker and manager, for
K a bletable, EMPLOYEES.
ha thersame
In this example,
i n abthe WHERE
n s feclause contains the join that means “where a worker’s manager ID
matches
n - tra ID for the manager.”
Zathe employee
no
• A CROSS JOIN is a JOIN operation that produces the Cartesian product of two tables.
• Example:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
)h ฺa
… m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The CROSS JOIN syntax specifies the cross
ฺ m aproduct.
t o uItsis also known as a Cartesian product. A cross
abrelations,
join produces the cross product ofntwo
i n se and is essentially the same as the comma-delimited
Oracle Database notation. (za e
a n l e lic
K h WHERE
You do not specify any
r a bcondition between the two tables in the CROSS JOIN.
i n ab nsfe
Za n-tra
no
• Create, alter, and drop a table using the data definition language (DDL) statements
• Insert, update, and delete rows from one or more tables using data manipulation
language (DML) statements
• Commit, roll back, and create save points using the transaction control statements
• Perform join operations on one or more tables
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
This appendix covered commonly usedฺm SQL
t o us and statements, including DDL statements,
a commands
DML statements, transaction control
n b se and joins.
astatements,
z i
a icen
n ( l
a l e
b Kh ferab
a i na rans
Z n-t
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
B
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
• Hide PL/SQL source code by using dynamic obfuscation and the wrap utility
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
This appendix introduces the conditionalm a o uand
compilation
s obfuscating (or wrapping) PL/SQL code.
ฺ
ab nse t
i n
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Enables you to customize the functionality in a PL/SQL application without removing any
source code:
• Use the latest functionality with the latest database release, or disable the new features
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
o d @ is S
q s o e th
m a oinclude
Conditional compilation enables you toฺselectively
t us code depending on the values of the
i n ab For
conditions evaluated during compilation.
n e
sexample, conditional compilation enables you to
(z
determine which PL/SQL featuresa in a i c e
PL/SQL application are used for specific database releases.
n
a inaan
The latest PL/SQL features e l
lapplication can be run on a new database release; at the same
K h b
time, those features
n a can beerconditional
b Conditional
s f so that the same application is compatible with a previous
Z a i tran
database release. compilation is also useful when you want to execute debugging
procedures in na-development environment but want to turn off the debugging routines in a production
no
environment.
Benefits of Conditional Compilation
• Support for multiple versions of the same program in one source code
• Easy maintenance and debugging of code
• Easy migration of code to a different release of the database
s a
)h ฺa
DBMS_PREPROCESSOR DBMS_DB_VERSION m
co uide
package package
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can use conditional compilation byฺm embedding
t us
a o directives in your PL/SQL source programs.
When the PL/SQL program is submitted b
nabe compiled.
for s e
compilation, a preprocessor evaluates these directives
a i e n
n (z
and selects parts of the program to
l i c The selected program source is then handed off to
ha rable
the compiler for compilation.
K
Inquiry directives
n s e token to make inquiries about the compilation environment, such as the
abusecompiler
thef$$
value of thei
a -tra
PL/SQL n PLSQL_CCFLAGS or PLSQL_OPTIMIZE_LEVEL initialization
Z
parameters for
n onthe unit being compiled. This directive can be used in conjunction with the conditional
selection directive to select the parts of the program to compile.
Selection directives can test inquiry directives or static package constants by using the $IF construct
to branch sections of code for possible compilation if a condition is satisfied.
Error directives issue a compilation error if an unexpected condition is encountered during
conditional compilation done by using the $ERROR token.
The DBMS_DB_VERSION package provides database version and release constants that can be
used for conditional compilation.
The DBMS_PREPROCESSOR package provides subprograms for accessing the post-processed
source text that is selected by conditional compilation directives in a PL/SQL unit.
$END
DECLARE
CURSOR cur IS SELECT employee_id FROM
employees WHERE
$IF myapp_tax_package.new_tax_code $THEN
salary > 20000;
$ELSE
salary > 50000;
$END
BEGIN
s a
OPEN cur;
)h ฺa
. . . m
co uide
END; s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The conditional selection directive looks ฺ m
and
t o uslike the IF-THEN-ELSE mechanism in
a operates
PL/SQL proper. When the preprocessor
i n ab encounters
n se and $THEN, it verifies that the text between $IF and
$THEN is a static expression. ( z a
If the check
i c e succeeds the result of the evaluation is TRUE, the
n l
le and $ELSE (or $ELSIF) is selected for compilation.
ha rab$THEN
PL/SQL program text between
K
The selection a
i n b s(the
condition
n fe expression between $IF and $THEN) can be constructed by referring to
Zadefined
constants
n - trinaanother package or an inquiry directive (or some combination of the two).
no in the slide, the conditional selection directive chooses between two versions of the
In the example
cursor (cur) on the basis of the value of MYAPP_TAX_PACKAGE.NEW_TAX_CODE.
If the value is TRUE, employees with salary > 20000 are selected; otherwise, employees with
salary > 50000 are selected.
PLSQL_CCFLAGS
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
PLSQL_CODE_TYPE
PLSQL_OPTIMIZE_LEVEL
PLSQL_WARNINGS
NLS_LENGTH_SEMANTICS
PLSQL_LINE
PLSQL_UNIT
s a
PLSQL_CCFLAGS = 'plsql_ccflags:true,debug:true,debug:0';
a
)h ฺ
m
co uide
User-defined inquiry directives s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
An inquiry directive can be predefined or ฺ m a o usFollowing is the order of the processing flow
user-defined.
when conditional compilation attempts a bto resolve
e t an inquiry directive:
n s
ai icen in the form $$id for the search key.
1. The ID is used as an(z l
inquiry directive
a n l e
2. The two-pass
b Khalgorithm
f e r abproceeds as follows:
a.inaThe string
n s in the PLSQL_CCFLAGS initialization parameter is scanned from right to
a
Z nleft, r a
-t searching by ID for a matching name (not case sensitive). Processing is done if
o
n an ID is found.
b. The predefined inquiry directives are searched. Processing is done if an ID is found.
3. If the $$ID cannot be resolved to a value, the PLW-6003 warning message is reported if the
source text is not wrapped. The literal NULL is substituted as the value for undefined inquiry
directives.
Note: If the PL/SQL code is wrapped, the warning message is disabled so that the undefined
inquiry directive is not revealed.
In the example in the slide, the value of $$debug is 0 and the value of $$plsql_ccflags is TRUE.
Note that the value of $$plsql_ccflags resolves to the user-defined plsql_ccflags inside the
value of the PLSQL_CCFLAGS compiler parameter. This occurs because a user-defined directive
overrides the predefined one.
PLSQL_CCFLAGS = '<v1>:<c1>,<v2>:<c2>,...,<vn>:<cn>'
s a
a
)h ฺ
m
co uide
PLSQL_CCFLAGS
s ฺ
initialization parameter
nd nt G
Inquiry directive
r a
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Oracle Database 10g Release 2 introduced ฺ m t us initialization parameter PLSQL_CCFLAGS
aa newoOracle
for use with conditional compilation. n b dynamic
aThis se parameter enables you to set up name-value
z a i e n
pairs. The names (called “flag
n ( names”)
l i c then be referenced in inquiry directives.
can
PLSQL_CCFLAGS provides
h a a amechanism
b le that enables PL/SQL programmers to control the
K
conditional compilation
b soffeeach r PL/SQL library unit independently.
n a
ValuesZai
- t r an
• onthe form of an unquoted PL/SQL identifier that is unrestricted and can be a reserved
vi:nHas
word or a keyword. The text is not case sensitive. Each is known as a flag or a flag name.
Each vi can occur more than once in the string, each occurrence can have a different flag
value, and the flag values can be of different kinds.
• ci: Can be any of the following:
- A PL/SQL Boolean literal
- A PLS_INTEGER literal
- The literal NULL (default). The text is not case sensitive. Each is known as a flag
value and corresponds to a flag name.
FROM user_plsql_object_settings
s a
)h ฺa
m
co uide
s ฺ
...
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Use the USER|ALL|DBA_PLSQL_OBJECT_SETTINGS ฺ m a o usdata dictionary views to display the settings
of a PL/SQL object. n a b se t
( z ai icPLSQL_CCFLAGS.
en
You can define any allowable
a n l e l
value for However, Oracle recommends that this
parameter be used for
K h rab
controlling the conditional compilation of debugging or tracing code.
n
The flag names
i abcan benssetfeto any identifier, including reserved words and keywords. The values
a literals
must beZthe
n - traTRUE, FALSE, or NULL, or a PLS_INTEGER literal. The flag names and values
nosensitive. The PLSQL_CCFLAGS parameter is a PL/SQL compiler parameter (like other
are not case
compiler parameters) and is stored with the PL/SQL program unit. Consequently, if the PL/SQL
program is recompiled later with the REUSE SETTINGS clause (example, ALTER PACKAGE
…REUSE SETTINGS), the same value of PLSQL_CCFLAGS is used for the recompilation. Because
the PLSQL_CCFLAGS parameter can be set to a different value for each PL/SQL unit, it provides a
convenient method for controlling conditional compilation on a per-unit basis.
BEGIN
$IF $$tracing $THEN
DBMS_OUTPUT.PUT_LINE ('TRACING');
$END
END P;
o d @ is S
q s o e th
In the example in the slide, the parameter m aset and
is
s the procedure is created. The setting is
uthen
stored with each PL/SQL unit. nab
ฺ t o
a i e n se
n (z lic
a l e
b Kh ferab
a i na rans
Z n-t
no
CREATE PROCEDURE P IS
BEGIN
$IF $$Trace_Level = 0 $THEN ...;
$ELSIF $$Trace_Level = 1 $THEN ...;
$ELSIF $$Trace_Level = 2 $THEN ...;
$else $error 'Bad: '||$$Trace_Level $END –- error
-- directive
$END -- selection directive ends
END P;
SHOW ERRORS
s a
Errors for PROCEDURE P:
LINE/COL ERROR
) ฺh a
o m
ฺc uide
-------- ------------------------------------
6/9 PLS-00179: $ERROR: Bad: 3
d s
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a oerror
The $ERROR error directive raises a user-defined
ฺ t usand is of the following form:
i
$ERROR varchar2_static_expression n ab nse$END
n (za lice must be a VARCHAR2 static expression.
Note: varchar2_static_expression
K ha rable
i n ab nsfe
Za n-tra
no
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
As described earlier, a preprocessor processes
ฺ m t o us directives before proper compilation
a conditional
ab nsethat can be fully evaluated at compile time are
begins. Consequently, only thosenexpressions
i
n (za directives.
permitted in conditional compilation
l i ce Expressions that contain references to variables or
functions that require the
h a execution
a b le of the PL/SQL are not available during compilation and cannot
be evaluated. b K f er
n a s
These PL/SQL
Z - t an that are allowed in conditional compilation directives are referred to as
ai expressions
r
on Static expressions are carefully defined to guarantee that if a unit is
“static expressions.”
n
automatically recompiled without any changes to the values it depends on, the expressions evaluate
in the same way and the same source is compiled.
Static expressions are typically composed of three sources:
• Inquiry directives marked with $$
• Constants defined in PL/SQL packages such as DBMS_DB_VERSION. These values can be
combined and compared using the ordinary operations of PL/SQL.
• Literals such as TRUE, FALSE, 'CA', 123, and NULL
Static expressions can also contain operations that include comparisons, logical Boolean operations
(such as OR and AND), or concatenations of static character expression.
VER_LE_9
VER_LE_9_1
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
VER_LE_9_2
VER_LE_10
VER_LE_10_1
VER_LE_10_2
DBMS_DB_VERSION VER_LE_11 TRUE?
package
VER_LE_11_1
DBMS_DB_VERSION
Boolean constants
s a
)h ฺ a
m
co uide
s ฺ
Oracle 11g Release 1
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Oracle Database 10g Release 2 introduced ฺ m t o us
athe DBMS_DB_VERSION package. This package
b
na and
specifies the Oracle Database version se numbers that are useful when making simple
release
a i e n
(z
selections for conditional compilation.
n lic
a
h a Boolean
The constants represent l e
b condition that evaluates to less than or equal to the version and
the release, if a
K
b sfe
present. r a
i n n
Example Za n-tra
VER_LE_11 noindicates that the database version <= 11. The values of the constants are either
TRUE or FALSE. For example, in an Oracle Database 11g Release 1 database, VER_LE_11 and
VER_LE_11_1 are TRUE and all other constants are FALSE.
Name Description
VER_LE_11_1 s a
Version <=11 and release <= 1.
h
) ฺ a
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
The package for the Oracle Database 11g aRelease s
1uversion is shown as follows:
ฺ
ab nse t o
PACKAGE DBMS_DB_VERSION iIS n
(za lice := 11; -- RDBMS version
VERSION CONSTANT PLS_INTEGER
n
K ha rable -- number
b sfePLS_INTEGER := 1; -- RDBMS release
RELEASEaCONSTANT
n
i n
Za n-tra -- number
no
ver_le_9_1 CONSTANT BOOLEAN := FALSE;
ver_le_9_2 CONSTANT BOOLEAN := FALSE;
ver_le_9 CONSTANT BOOLEAN := FALSE;
ver_le_10_1 CONSTANT BOOLEAN := FALSE;
ver_le_10_2 CONSTANT BOOLEAN := FALSE;
ver_le_10 CONSTANT BOOLEAN := FALSE;
ver_le_11_1 CONSTANT BOOLEAN := TRUE;
ver_le_11 CONSTANT BOOLEAN := TRUE;
END DBMS_DB_VERSION;
The DBMS_DB_VERSION package contains different constants for different Oracle Database
releases. The Oracle Database 11g Release 1 version of the DBMS_DB_VERSION package uses the
constants shown in the slide.
o d @ is S
q s o e th
This example also shows the use of theฺm a o us parameter. You first set the
PLSQL_CCFLAGS
PLSQL_CCFLAGS parameter flag n toadisplay
t
b sdebugging
e code and tracing information.
a i e n
In the example in the slide
n (zthis page
on licand the next page, conditional compilation is used to specify
a l
h rConditional
code for database versions. b e compilation is used to determine whether the
K a
fe can be used in the calculations for PL/SQL units in the database. The
BINARY_DOUBLE
i n ab datan
type
s
Z a -tra
BINARY_DOUBLE data type can be used only in Oracle Database 10g or later. If you are using
Oracle Database
n o n 10g, the data type for my_real is BINARY_DOUBLE; otherwise, the data type for
my_real is NUMBER.
In the specification of the new package (my_pkg), conditional compilation is used to check for the
database version. In the body definition of the package, conditional compilation is used again to set
the values of my_pi and my_e for future calculations based on the database version.
The result of the example code in the slide is as follows:
s a
CALL circle_area(50); -- Using Oracle Database 11g Release 2
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the example in the slide, a new procedure
ฺ m a called
t o us
circle_area is defined. This procedure
calculates the area of a circle based b
naonhasethenonee of the variables in the my_pkg package defined
svalues
a i
n (z
on the previous page. The procedure
l i c informal parameter: radius.
The procedure declares
K a ble
hatworvariables:
•
i n ab which
my_area,
n s fethe same data type as my_real in my_pkg
is
•
a -tra which is a VARCHAR2(30)
Zmy_datatype,
non body, my_area becomes equal to the value of my_pi set in my_pkg multiplied by
In the procedure’s
the value that is passed to the procedure as a radius. A message is printed displaying the radius and
the area of the circle, as shown in the second code example in the slide.
Note: If you want to set my_debug to TRUE, you can make this change only for the circle_area
procedure with the REUSE SETTINGS clause as follows:
ALTER PROCEDURE circle_area COMPILE PLSQL_CCFLAGS = 'my_debug:TRUE' REUSE
SETTINGS;
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
DBMS_PREPROCESSOR subprograms print m aor retrieve s postprocessed source text of a PL/SQL unit
uthe
ฺ
ab nsdirectives.
after processing the conditional compilation e t o This postprocessed text is the actual source
a i n e
that is used to compile a valid
n ( zPL/SQL
l i c
unit. The example in the slide shows how to print the
postprocessed form of a
h my_pkg a bbyleusing the PRINT_POST_PROCESSED_SOURCE procedure.
When my_pkgais
K
bcompiled f r an Oracle Database 10g release (or later) database using the HR
eon
n s
anoutput is shown in the slide.
account,Zathei resulting
- t r
non
The PRINT_POST_PROCESSED_SOURCE removes unselected text. The lines of code that are not
included in the postprocessed text are removed. The arguments for the
PRINT_POST_PROCESSED_SOURCE procedure are object type, schema name (using student
account ORA61), and object name.
Note: For additional information about the DBMS_PREPROCESSOR package, refer to the Oracle
Database PL/SQL Packages and Types Reference.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
• The obfuscation (or wrapping) of a PL/SQL unit is the process of hiding the PL/SQL
source code.
• Wrapping can be done with the wrap utility and DBMS_DDL subprograms.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• The wrap utility is run from the command line. It processes an input SQL file, such as a
SQL*Plus installation script.
• The DBMS_DDL subprograms wrap a single PL/SQL unit, such as a single CREATE
PROCEDURE command, that has been generated dynamically.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a o refer
Note: For additional information about ฺobfuscation,
t us to the Oracle Database PL/SQL Language
Reference.
i n ab nse
n (za lice
K ha rable
i n ab nsfe
Za n-tra
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
DBMS_DDL.WRAP function
DBMS_DDL package
Wraps the text and creates
the PL/SQL unit
s a
)h ฺa
CREATE_WRAPPED procedure m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
CREATE_WRAPPED Procedure ฺ m a o us
n a b se t
Does the following:
( z ai icen
a n
1. Takes as input a single
l e
CREATE l OR REPLACE statement that specifies creation of a PL/SQL
Kh ferapackage
package specification,
b
b body, function, procedure, type specification, or type body
a s
ain -tarCREATE
2. Generates
Zobfuscated an OR REPLACE statement in which the PL/SQL source text has been
nonthe generated statement
3. Executes
WRAP Function
Does the following:
1. Takes as input a CREATE OR REPLACE statement that specifies the creation of a PL/SQL
package specification, package body, function, procedure, type specification, or type body
2. Returns a CREATE OR REPLACE statement in which the text of the PL/SQL unit has been
obfuscated
END P1;
';
END;
/
CALL p1();
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the first example in the slide, the EXECUTE
ฺ m t o us statement is used to create the P1
a IMMEDIATE
procedure. The code in the created n b seis not wrapped. The code is not hidden when you use
aprocedure
z i
a iceview
any of the views from the ALL_SOURCE n family to display the procedure’s code as shown in the
( l
slide.
h an able
b K fer
i a
n rans
a
Z n-t
no
s a
)h ฺa
m
co uide
s ฺ
...
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m a o us
In the example in the slide, the DBMS_DDL.CREATE_WRAPPED
ฺ package procedure is used to create
b t
a i na code
the P1 procedure. The code is obfuscated
e n se you use any of the views from the ALL_SOURCE
when
n ( z
view family to display the procedure’s
l i c (as shown on the next page). When you check the
a aisbwrapped,
*_SOURCE views, the source
h le or hidden, so that others cannot view the code details
shown in the outputK
b of the f r
ecommand in the slide.
n a n s
Zai n-tra
no
SET SERVEROUTPUT ON
DECLARE
c_code CONSTANT VARCHAR2(32767) :=
' CREATE OR REPLACE PROCEDURE new_proc AS
v_VDATE DATE;
BEGIN
v_VDATE := SYSDATE;
DBMS_OUTPUT.PUT_LINE(v_VDATE) ;
END; ' ;
BEGIN
DBMS_DDL.CREATE_WRAPPED (c_CODE);
END;
s a
/ a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
The example in the slide displays the creation
ฺ t us
a of aodynamically obfuscated procedure called
NEW_PROC. To verify that the code b
naforviews: se is obfuscated, you can query from the
NEW_PROC
a i e n
n (z
DBA|ALL|USER_SOURCE dictionary
lic
a
SELECT text FROMh user_source l e
b K ferab
WHERE namea= 'NEW_PROC';
a i n rans
Z n-t
no
...
• The PL/SQL wrapper is a stand-alone utility that hides application internals by converting
PL/SQL source code to portable object code.
• Wrapping has the following features:
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
– Platform independence
– Dynamic loading
– Dynamic binding
– Dependency checking
– Normal importing and exporting when invoked
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Using the PL/SQL Wrapper utility, you can ฺ m t us applications without exposing your source
adeliveroPL/SQL
code, which may contain proprietary n b se and data structures. The Wrapper utility converts the
aalgorithms
readable source code into unreadable z i
a iccode.en By hiding application internals, it prevents misuse of
( l
your application.
h an able
Wrapped codea(such b K as PL/SQL
f er stored programs) has several features:
n n s
• ZIt ais iplatform
n - t r aindependent, so you do not need to deliver multiple versions of the same
n o
compilation unit.
• It permits dynamic loading, so users do not need to shut down and restart to add a new
feature.
• It permits dynamic binding, so external references are resolved at load time.
• It offers strict dependency checking, so that invalidated program units are recompiled
automatically when they are invoked.
• It supports normal importing and exporting, so the import/export utility can process wrapped
files.
Examples
s a
WRAP INAME=demo_04_hello.sql
WRAP INAME=demo_04_hello
a
)h ฺ
WRAP INAME=demo_04_hello.sql ONAME=demo_04_hello.plb m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The PL/SQL Wrapper utility is an operating ฺ m t us
asystemo executable called WRAP.
b se
Note: This is 11g-only code. aina n
(z e
liccommand at your operating system prompt:
To run the wrapper, enter a n e
the following
l
b Kh ferab [ONAME=output_file_name]
WRAP INAME=input_file_name
a ns
ainexamples
Each ofZthe
- ra shown in the slide takes a file called demo_04_hello.sql as input and
tfile
no n
creates an output called demo_04_hello.plb.
After the wrapped file is created, execute the .plb file from SQL*Plus to compile and store the
wrapped version of the source code (as you would execute SQL script files).
Note
• Only the INAME argument is required. If the ONAME argument is not specified, the output file
acquires the same name as the input file with an extension of .plb.
• The input file can have any extension, but the default is .sql.
• Case sensitivity of the INAME and ONAME values depends on the operating system.
• The output file is usually much larger than the input file.
• Do not put spaces around the equal signs in the INAME and ONAME arguments and values.
min_bal := 100;
no_funds EXCEPTION;
...
END banking;
/
s a
/
012abc463e ...
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
When it is wrapped, an object type, package,
ฺ m t o us has the following form: header, followed
a or subprogram
by the word wrapped, followed by
i n athebencrypted
n se body.
a
(zcombination e
The input file can containnany
a l e lic of SQL statements. However, the PL/SQL Wrapper utility
K h CREATE
wraps only the following
r a b statements:
• CREATE
i n s fe
ab[OR nREPLACE] TYPE
•
a r a
t REPLACE] TYPE BODY
ZCREATEn-[OR
• CREATE
o
n [OR REPLACE] PACKAGE
• CREATE [OR REPLACE] PACKAGE BODY
• CREATE [OR REPLACE] FUNCTION
• CREATE [OR REPLACE] PROCEDURE
All other SQL CREATE statements are passed intact to the output file.
• You must wrap only the package body and not the package specification.
• The wrapper can detect syntactic errors but cannot detect semantic errors.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• The output file should not be edited. You maintain the original source code and wrap
again as required.
• To ensure that all the important parts of your source code are obfuscated, view the
wrapped file in a text editor before distributing it.
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Guidelines include the following: ฺ m a o us
a e t
bobjectstype,
• When wrapping a package
a i n or
e n wrap only the body and not the specification. By
( z
doing this, you give other developers
n li c the information that they need to use the package
a l e
b Kh ferab
without exposing its implementation.
• If your
i ainput filenscontains syntactic errors, the PL/SQL Wrapper utility detects and reports
nHowever,
Z n-tra the wrapper cannot detect semantic errors because it does not resolve
a
them.
no references. For example, the wrapper does not report an error if the table or view
external
amp does not exist:
CREATE PROCEDURE raise_salary (emp_id INTEGER, amount NUMBER) AS
BEGIN
UPDATE amp -- should be emp
SET sal = sal + amount WHERE empno = emp_id;
END;
However, the PL/SQL compiler resolves external references. Therefore, semantic errors are
reported when the wrapper output file (.plb file) is compiled.
• Because its contents are not readable, the output file should not be edited. To change a
wrapped object, you must modify the original source code and wrap the code again.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Both the wrap utility and the DBMS_DDL ฺ m a ohave
package
t usdistinct uses.
wrap Utility i n ab nse
The wrap utility is usefulnfor
za licemultiple programs with one execution of the utility.
(obfuscating
haapplication
a b lecan be wrapped. However, the wrap utility cannot be used to
K
In essence, a complete
b generatedf er code at run time. The wrap utility processes an input SQL file and
a
obfuscate dynamically
n s
n units in the file, such as:
Zaionlyn-the
obfuscates traPL/SQL
• no specification and body
Package
• Function and procedure
• Type specification and body
The wrap utility does not obfuscate PL/SQL content in:
• Anonymous blocks
• Triggers
• Non-PL/SQL code
DBMS_DDL Package
The DBMS_DDL package is intended to obfuscate a dynamically generated program unit from within
another program unit. The DBMS_DDL package methods cannot obfuscate multiple program units at
one execution. Each execution of these methods accepts only one CREATE OR REPLACE statement
at a time as argument.
• Hide PL/SQL source code by using dynamic obfuscation and the wrap utility
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Implementing Triggers
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In this lesson, you learn to develop database
ฺ m a triggers
t o uins order to enhance features that cannot
otherwise be implemented by then
i ab server.
Oracle
n se In some cases, it may be sufficient to refrain from
using triggers and accept the (z a c
functionality
i e provided by the Oracle server.
n le l
This lesson covers the
K hafollowing
r a bbusiness application scenarios:
•
i n ab nsfe
Security
•
a -tra
ZAuditing
n
nointegrity
• Data
• Referential integrity
• Table replication
• Computing derived data automatically
• Event logging
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Develop schemas and roles within the Oracle
ฺ m a server
t o utoscontrol the security of data operations on
tables according to the identity ofn
i abuser.nse
the
Base privileges upon(z
a ice supplied when the user connects to the database.
•
a n l e l
the username
• Kh fetortables,
Determine access
b ab views, synonyms, and sequences.
• i na rquery,
Determine
a a n s data-manipulation, and data-definition privileges.
Z n-t
no
dummy PLS_INTEGER;
BEGIN
IF (TO_CHAR (SYSDATE, 'DY') IN ('SAT','SUN')) THEN
RAISE_APPLICATION_ERROR(-20506,'You may only
change data during normal business hours.');
END IF;
SELECT COUNT(*) INTO dummy FROM holiday
WHERE holiday_date = TRUNC (SYSDATE);
IF dummy > 0 THEN
RAISE_APPLICATION_ERROR(-20507,
'You may not change data on a holiday.');
END IF;
s a
END;
/ )h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Develop triggers to handle more complex ฺ m security
t us
a orequirements.
• i n ab values,
Base privileges on any database n se such as the time of day, the day of the week, and so
(z a e
on.
a n l e lic
• Kh fetortables
Determine access
b ab only.
• i na rdata-manipulation
Determine
a a n s privileges only.
Z n-t
no
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can enforce data integrity within the ฺ m a server
Oracle
t o usand develop triggers to handle more complex
data integrity rules.
i n ab nse
The standard data integrity n (za are lnot
rules i cenull, unique, primary key, and foreign key.
Use these rules to:Kh
a able
n a b sfer
• ai constant
Provide
t r a n default values
Z -
•
nonstatic constraints
Enforce
• Enable and disable dynamically
Example
The code sample in the slide ensures that the salary is at least $500.
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
Protect data integrity with a trigger and ฺenforce
t o us data integrity checks.
a nonstandard
• i n ab nse
Provide variable default values.
• Enforce dynamic n (za lice
constraints.
a b le
ha dynamically.
• Enable and K
b sfer
disable
n a
•
ZIncorporate an
ai -trdeclarative constraints within the definition of a table to protect data integrity.
Example non
The code sample in the slide ensures that the salary is never decreased.
REFERENCES departments(department_id)
ON DELETE CASCADE;
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
Incorporate referential integrity constraints
s
awithin otheudefinition of a table to prevent data
b ฺ t
inconsistency and enforce referential
a i e n sewithin the server.
na integrity
• Restrict updates and(z deletes.lic
n
h rable
a
• K
Cascade deletes.
b disable fedynamically.
• i
Enablen aand n s
Za
Example on-
tra
n
When a department is removed from the DEPARTMENTS parent table, cascade the deletion to the
corresponding rows in the EMPLOYEES child table.
o d @ is S
q s o e th
The following referential integrity rules areฺ m t o us by declarative constraints:
anot supported
• Cascade updates. i n ab nse
• n (zaand deletions.
Set to NULL for updates l i ce
a able
• Set to a b Kh value
default
f e r on updates and deletions.
a s
• ain referential
ZEnforce - t r an integrity in a distributed system.
•
nonand disable dynamically.
Enable
You can develop triggers to implement these integrity rules.
Example
Enforce referential integrity with a trigger. When the value of DEPARTMENT_ID changes in the
DEPARTMENTS parent table, cascade the update to the corresponding rows in the EMPLOYEES child
table.
For a complete referential integrity solution using triggers, a single trigger is not enough.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Creating a Materialized View ฺ m a o us
n a b se t
Materialized views enable you a toi maintainncopies of remote data on your local node for replication
purposes. You can selectndata
e
(z from alicmaterialized view as you would from a normal database table
a l e
b Ka hquery.
or view. A materialized view is
f e r aabFROM
database object that contains the results of a query, or a copy of
some database
i n a ns
on The clause of the query of a materialized view can name tables,
Za other
views, and
n - tra
materialized views.
no
When a materialized view is used, replication is performed implicitly by the Oracle server. This
performs better than user-defined PL/SQL triggers for replication. Materialized views:
• Copy data from local and remote tables asynchronously, at user-defined intervals
• Can be based on multiple master tables
• Are read-only by default, unless using the Oracle Advanced Replication feature
• Improve the performance of data manipulation on the master table
Alternatively, you can replicate tables using triggers.
The example in the slide creates a copy of the remote EMPLOYEES table from New York. The NEXT
clause specifies a date-time expression for the interval between automatic refreshes.
o d @ is S
q s o e th
You can replicate a table with a trigger.ฺBy m t o usa table, you can:
areplicating
• Copy tables synchronously, i n ainbrealntime
se
a
(z master e
• Base replicas on n
a a single
l e lic table
• Read from K h rawell
replicaseas
b as write to them
b
na use f
ofstriggers can impair the performance of data manipulation on the master
a i
Note: Excessive
r a n
Z n-tif the network fails.
table, particularly
Example n
o
In New York, replicate the local EMPLOYEES table to San Francisco.
UPDATE departments
SET total_sal=(SELECT SUM(salary)
FROM employees
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
WHERE employees.department_id =
departments.department_id);
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
By using the server, you can schedule batch m s the database Scheduler for the following
a jobsoor uuse
scenarios:
ฺ
ab nse t
i n
• Compute derived column
n (za values l i ceasynchronously, at user-defined intervals.
a only
hvalues b e database tables.
lwithin
• Store derivedK
b in one f r a
epass
n a s
•
Z ai -tran
Modify data to the database and calculate derived data in a second pass.
UPDATE departments
SET total_sal = NVL (total_sal, 0)+ new_sal
WHERE department_id = id;
END increment_salary;
o d @ is S
q s o e th
m a tasks:
By using a trigger, you can perform theฺfollowing
t o us
• Compute derived columns i n ab nse in real time.
synchronously,
• n
Store derived values
za database
(within l i ce tables or within package global variables.
hacalculate
a b le
• Modify data
b K and
f e r derived data in a single pass to the database.
Exampleain
a n s
Z n-tra
o total of the salary for each department in the special TOTAL_SALARY column of the
Keep a running
n
DEPARTMENTS table.
msg_text VARCHAR2(2000);
BEGIN
IF :NEW.quantity_on_hand <=
:NEW.reorder_point THEN
SELECT product_description INTO dsc
FROM product_descriptions
WHERE product_id = :NEW.product_id;
_ msg_text := 'ALERT: INVENTORY LOW ORDER:'||
'Yours,' ||CHR(10) ||user || '.'|| CHR(10);
ELSIF :OLD.quantity_on_hand >=
:NEW.quantity_on_hand THEN
msg_text := 'Product #'||... CHR(10);
END IF;
s a
UTL_MAIL.SEND('[email protected]','[email protected]',
)h ฺa
message=>msg_text, subject=>'Inventory Notice');
m
co uide
END;
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In the server, you can log events by queryingฺ m a dataoand
t usperforming operations manually. This sends
an email message when the inventory
i n abfor na sparticular
e product has fallen below the acceptable limit.
(z a
This trigger uses the Oracle-supplied e
package
i c UTL_MAIL to send the email message.
n l
Logging Events Within
K ble
ha theraServer
1. Query
i n adata n s fe to determine whether an operation is necessary.
b explicitly
2. Z
a the
Perform n - traoperation, such as sending a message.
no to Log Events
Using Triggers
1. Perform operations implicitly, such as firing off an automatic electronic memo.
2. Modify data and perform its dependent operation in a single step.
3. Log events automatically when data is changing.
Example
CREATE OR REPLACE TRIGGER notify_reorder_rep
BEFORE UPDATE OF amount_in_stock, reorder_point
ON inventory FOR EACH ROW
DECLARE
dsc product.descrip%TYPE;
msg_text VARCHAR2(2000);
BEGIN s a
h
) ฺa
IF :NEW.amount_in_stock <= :NEW.reorder_point THEN
o m
SELECT descrip INTO dsc
d s ฺc uide
FROM PRODUCT WHERE prodid = :NEW.product_id;
b r an ent G
s sc tud
msg_text := 'ALERT: INVENTORY LOW ORDER:'||CHR(10)||
d @ that,
i s S
'It has come to my personal attention
s o
o et h due to recent'
q us
||CHR(10)||'transactions, aour inventory
ฺ m t o for product # '||
non
:= 'Product #'|| TO_CHAR(:NEW.product_id)
||' ordered. '|| CHR(10)|| CHR(10);
END IF;
UTL_MAIL.SEND('[email protected]', '[email protected]',
message => msg_text, subject => 'Inventory Notice');
END;
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
This lesson provides some detailed comparison
ฺ m t us the Oracle database server functionality to
a ofousing
ab nreplication,
implement security, auditing, datanintegrity,
i se and logging. The lesson also covers how
database triggers can be used(z a
to c
implement
i e the same features but go further to enhance the
n
a server
features that the database
l
leprovides. In some cases, you must use a trigger to perform some
K h a b
activities (such as
n
implement ithis s fer ofrule
b computation
akind ofnbusiness
derived data) because the Oracle server cannot know how to
without some programming effort.
Za n-tra
no
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
D
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
Objectives
s a
)h ฺ a
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
In this lesson, you learn how to use some ฺ mof
t o us
athe Oracle-supplied packages and their capabilities.
This lesson focuses on the packages b se web-based output and the provided scheduling
na thatengenerate
a i
capabilities.
n (z lic
a l e
b Kh ferab
a i na rans
Z n-t
no
– A browser using Oracle HTTP Server and PL/SQL Gateway (mod_plsql) services
– A SQL*Plus script to display HTML output
s a
Web client a
)h ฺ
mod_plsql
m
co uide
s ฺGenerated
Buffer HTP
r nd nHTML
Buffer
a t G
b
sc tude
s
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
@ is S
o d
o e th
q s
The HTP package contains proceduresฺthat m aare used
t o utos generate HTML tags. The HTML tags that
are generated typically enclose the n b provided
adata se ascan parameters to the various procedures. The
z a
slide illustrates two ways in (which
i the e npackage be used:
n l i c
HTP
• haprocedures
Most likely your
a b leare invoked by the PL/SQL Gateway services, via the
K
b component
f er supplied with Oracle HTTP Server, which is part of the Oracle
n a
mod_plsql
s
an product (represented by solid lines in the graphic).
ai -trServer
ZApplication
• n on (as represented by dotted lines in the graphic), your procedure can be called
Alternatively
from SQL*Plus that can display the generated HTML output, which can be copied and pasted
to a file. This technique is used in this course because Oracle Application Server software is
not installed as a part of the course environment.
Note: The HTP procedures output information to a session buffer held in the database server. In the
Oracle HTTP Server context, when the procedure completes, the mod_plsql component
automatically receives the buffer contents, which are then returned to the browser as the HTTP
response. In SQL*Plus, you must manually execute:
• A SET SERVEROUTPUT ON command
• The procedure to generate the HTML into the buffer
• The OWA_UTIL.SHOWPAGE procedure to display the buffer contents
BEGIN -- Generates:
htp.htmlOpen; ---------> <HTML>
htp.headOpen; --------->
htp.title('Welcome'); -->
<HEAD>
htp.headClose; ---------> <TITLE>Welcome</TITLE>
htp.bodyOpen; ---------> </HEAD>
<BODY>
htp.print('My home page');
htp.bodyClose; ---------> My home page s a
htp.htmlClose; ---------> </BODY>
)h ฺ a
END; </HTML> m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The HTP package is structured to provide ฺ m t o usmapping of a procedure to standard HTML
aaone-to-one
tags. For example, to display boldntext
i abon na swebpage,
e the text must be enclosed in the HTML tag
pair <B> and </B>. The first(z a boxicinethe slide shows how to generate the word Hello in HTML
code
a n
bold text by using the equivalent l e l package procedure, that is, HTP.BOLD. The HTP.BOLD
Ka htext fparameter
HTP
procedure accepts
b e r ab and ensures that it is enclosed in the appropriate HTML tags in
i na that
the HTML output
a r a nissgenerated.
Z n-tprocedure copies its text parameter to the buffer. The example in the slide shows
The HTP.PRINT
no supplied to the HTP.PRINT procedure can contain HTML tags. This technique is
how the parameter
recommended only if you need to use HTML tags that cannot be generated by using the set of
procedures provided in the HTP package.
The second example in the slide provides a PL/SQL block that generates the basic form of an HTML
document. The example serves to illustrate how each of the procedures generates the
corresponding HTML line in the enclosed text box on the right.
The benefit of using the HTP package is that you create well-formed HTML documents, eliminating
the need to manually enter the HTML tags around each piece of data.
Note: For information about all the HTP package procedures, refer to PL/SQL Packages and Types
Reference.
SET SERVEROUTPUT ON
ACCEPT procname PROMPT "Procedure: "
EXECUTE &procname
EXECUTE owa_util.showpage
UNDEFINE proc
2. Load and execute the script in SQL*Plus, supplying values for substitution variables.
3. Select, copy, and paste the HTML text that is generated in the browser to an HTML file.
4. Open the HTML file in a browser.
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The example in the slide shows the steps ฺ mfor
t o us HTML by using any procedure and saving
a generating
the output into an HTML file. Youn
i ab perform
should
n se the following steps:
1. Turn on server output
a e
(zwith thelicSET SERVEROUTPUT ON command. Without this, you receive
a n
h rwhen
exception messages blerunning procedures that have calls to the HTP package.
K a
fe that contains calls to the HTP package.
2. Execute
i n abthe procedure
n s
a This
ZNote: - a not produce output, unless the procedure has calls to the DBMS_OUTPUT
trdoes
no
package.n
3. Execute the OWA_UTIL.SHOWPAGE procedure to display the text. This call actually displays
the HTML content that is generated from the buffer.
The ACCEPT command prompts for the name of the procedure to execute. The call to
OWA_UTIL.SHOWPAGE displays the HTML tags in the browser window. You can then copy and
paste the generated HTML tags from the browser window into an HTML file, typically with an .htm
or .html extension.
Note: If you are using SQL*Plus, then you can use the SPOOL command to direct the HTML output
directly to an HTML file.
The database Scheduler comprises several components to enable jobs to be run. Use the
DBMS_SCHEDULER package to create each job with:
• A unique job name
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
s a
Arguments Arguments
)h ฺa
m
co uide
s ฺ
Window
Job class
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
Oracle Database provides a collection of ฺ m a o usin the DBMS_SCHEDULER package to simplify
subprograms
management and to provide a rich a
set
t for complex scheduling tasks. Collectively,
bof functionality
e
n
athei Scheduler s
en and can be called from any PL/SQL program. The
these subprograms are called ( z l i c
h an aadministrators
Scheduler enables database
b le and application developers to control when and where
various tasks take K
place. By
bcan f rensuring that many routine database tasks occur without manual
eoperating
intervention,n a
i tran
you s
lower costs, implement more reliable routines, and minimize human
Z a
error.
n on-
The diagram shows the following architectural components of the Scheduler:
• A job is the combination of a program and a schedule. Arguments required by the program
can be provided with the program or the job. All job names have the format
[schema.]name. When you create a job, you specify the job name, a program, a schedule,
and (optionally) job characteristics that can be provided through a job class.
• A program determines what should be run. Every automated job involves a particular
executable, whether it is a PL/SQL block, a stored procedure, a native binary executable, or a
shell script. A program provides metadata about a particular executable and may require a
list of arguments.
• A schedule specifies when and how many times a job is executed.
- A resource consumer group, which classifies a set of user sessions that have
common resource-processing requirements. At any given time, a user session or job
class can belong to a single resource consumer group. The resource consumer group
that the job class associates with determines the resources that are allocated to the
job class.
• A window is represented by an interval of time with a well-defined beginning and end, and is
used to activate different resource plans at different times.
The slide focuses on the job component as the primary entity. However, a program, a schedule, a
a
window, and a job class are components that can be created as individual entities that can be
s
a
associated with a job to be executed by the Scheduler. When a job is created, it may contain all the
)h ฺ
m
information needed inline, that is, in the call that creates the job. Alternatively, creating a job may
co uide
ฺ
reference a program or schedule component that was previously defined. Examples of this are
s
discussed on the next few pages.
r a nd nt G
For more information about the Scheduler, see the online s scb titled
course t u e Database: Configure
dOracle
and Manage Jobs with the Scheduler.
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
– Using inline information with the “what” and the schedule specified as parameters
– Using a named (saved) program and specifying the schedule inline
– Specifying what should be done inline and using a named Schedule
– Using named Program and Schedule components
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The component that causes somethingฺto m be
t o usat a specified time is called a job. Use the
a executed
DBMS_SCHEDULER.CREATE_JOB
i n ab nseof the DBMS_SCHEDULER package to create a job,
procedure
which is in a disabled state (by
n zadefault.licAejob becomes active and scheduled when it is explicitly
enabled. To create a job,
ha you: a b le
• Provide
K
ba namesinfether format [schema.]name
n a
• ai the-CREATE
ZNeed t r an JOB privilege
n the CREATE ANY JOB privilege can create a job in any schema except the SYS
nowith
Note: A user
schema. Associating a job with a particular class requires the EXECUTE privilege for that class.
In simple terms, a job can be created by specifying all the job details—the program to be executed
(what) and its schedule (when)—in the arguments of the CREATE_JOB procedure. Alternatively, you
can use predefined Program and Schedule components. If you have a named Program and
Schedule, then these can be specified or combined with inline arguments for maximum flexibility in
the way a job is created.
A simple logical check is performed on the schedule information (that is, checking the date
parameters when a job is created). The database checks whether the end date is after the start date.
If the start date refers to a time in the past, then the start date is changed to the current date.
Specify the type of code, code, start time, and frequency of the job to be run in the
arguments of the CREATE_JOB procedure.
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'JOB_NAME',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN ...; END;',
start_date => SYSTIMESTAMP,
repeat_interval=>'FREQUENCY=HOURLY;INTERVAL=1',
enabled => TRUE);
END;
s a
/ a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
You can create a job to run a PL/SQL block,ฺ m a stored
t o us
procedure, or external program by using the
DBMS_SCHEDULER.CREATE_JOB b
a nseThe CREATE_JOB procedure can be used directly
nprocedure.
a i
n (z
without requiring you to create Program
l i ceor Schedule components.
ha shows
The example in the slide
a b le you can specify all the job details inline. The parameters of the
how
CREATE_JOBa K
b sfdefine
procedure er “what” is to be executed, the schedule, and other job attributes. The
following a n
i trandefine what is to be executed:
parameters
Z -
•
non
The job_type parameter can be one of the following three values:
- PLSQL_BLOCK for any PL/SQL block or SQL statement. This type of job cannot
accept arguments.
- STORED_PROCEDURE for any stored stand-alone or packaged procedure. The
procedures can accept arguments that are supplied with the job.
- EXECUTABLE for an executable command-line operating system application
• The schedule is specified by using the following parameters:
- The start_date accepts a time stamp, and the repeat_interval is string-
specified as a calendar or PL/SQL expression. An end_date can be specified.
Note: String expressions that are specified for repeat_interval are discussed later. The
example specifies that the job should run every hour.
o d @ is S
q s o e th
The DBMS_SCHEDULER.CREATE_PROGRAM
ฺ m t o usdefines a program that must be assigned a
a procedure
unique name. Creating the program n b se for a job enables you to:
aseparately
z i
aand then n this action within multiple jobs
ereuse
• (
Define the action once l i c
• han raforbalejob without having to re-create the PL/SQL block
Change theKschedule
• i n
Change n s fe executed without changing all the jobs
abthe program
Za n-trastring specifies a procedure, executable name, or PL/SQL block depending on
The programoaction
nthe program_type parameter, which can be:
the value of
• PLSQL_BLOCK to execute an anonymous block or SQL statement
• STORED_PROCEDURE to execute a stored procedure, such as PL/SQL, Java, or C
• EXECUTABLE to execute operating system command-line programs
The example shown in the slide demonstrates calling an anonymous PL/SQL block. You can also
call an external procedure within a program, as in the following example:
DBMS_SCHEDULER.CREATE_PROGRAM(program_name => 'GET_DATE',
program_action => '/usr/local/bin/date',
program_type => 'EXECUTABLE');
To create a job with a program, specify the program name in the program_name argument in the
call to the DBMS_SCHEDULER.CREATE_JOB procedure, as shown in the slide.
• Create a program:
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'PROG_NAME',
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Define an argument:
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(
program_name => 'PROG_NAME',
argument_name => 'DEPT_ID',
argument_position=> 1, argument_type=> 'NUMBER',
default_value => '50');
o d @ is S
q s o e th
m a o may
Programs, such as PL/SQL or external ฺprocedures,
t us require input arguments. Using the
n
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT
i ab nse procedure, you can define an argument for an
n (za lice
existing program. The DEFINE_PROGRAM_ARGUMENT procedure parameters include the following:
program_name haspecifies
a b lean existing program that is to be altered.
•
K er
b sfspecifies
•
n a
argument_name
i n a unique argument name for the program.
a -t r a
Zargument_position specifies the position in which the argument is passed when the
•
o n
n is called.
program
• argument_type specifies the data type of the argument value that is passed to the called
program.
• default_value specifies a default value that is supplied to the program if the job that
schedules the program does not provide a value.
The slide shows how to create a job executing a program with one argument. The program argument
default value is 50. To change the program argument value for a job, use:
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
job_name => 'JOB_NAME',
argument_name => 'DEPT_ID', argument_value => '80');
o d @ is S
q s o e th
You can create a common schedule that ฺ mcan
t o us to different jobs without having to specify
a be applied
the schedule details each time. The n b seare the benefits of creating a schedule:
afollowing
z i
a icento different jobs.
• It is reusable and can
n ( l
be assigned
a l e
• Changing the
b Khschedule
f e r abaffects all the jobs that are using the schedule. The job schedules are
changed
a i na once,
r a n s multiple times.
not
A schedule
o n -t to only the nearest second. Although the TIMESTAMP data type is more
Z is precise
n Scheduler rounds off anything with a higher precision to the nearest second.
accurate, the
The start and end times for a schedule are specified by using the TIMESTAMP data type. The
end_date for a saved schedule is the date after which the schedule is no longer valid. The
schedule in the example is valid for 15 days after using it with a specified job.
The repeat_interval for a saved schedule must be created by using a calendaring expression.
A NULL value for repeat_interval specifies that the job runs only once.
Note: You cannot use PL/SQL expressions to express the repeat interval for a saved schedule.
repeat_interval=> 'FREQ=DAILY'
repeat_interval=> 'FREQ=MINUTELY;INTERVAL=15'
repeat_interval=> 'FREQ=YEARLY;
BYMONTH=MAR,JUN,SEP,DEC;
BYMONTHDAY=15'
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no
BEGIN
DBMS_SCHEDULER.CREATE_JOB('JOB_NAME',
program_name => 'PROG_NAME',
schedule_name => 'SCHED_NAME',
enabled => TRUE);
END;
/
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The example in the slide shows the final ฺ mform
t usthe DBMS_SCHEDULER.CREATE_JOB
a for ousing
procedure. In this example, the named
i n ab program
n secall(PROG_NAME) and schedule (SCHED_NAME) are
z a
specified in their respective (parameters e
in the to the
procedure. a n l e lic DBMS_SCHEDULER.CREATE_JOB
h rab
Kyou
i n b
With this example,
a nscan fesee how easy it is to create jobs by using a predefined program and
Za n-tra
schedule.
Some jobsnand o schedules can be too complex to cover in this course. For example, you can create
windows for recurring time plans and associate a resource plan with a window. A resource plan
defines attributes about the resources required during the period defined by execution window.
For more information, refer to the online course titled Oracle Database: Configure and Manage Jobs
with the Scheduler.
• Run a job:
DBMS_SCHEDULER.RUN_JOB('SCHEMA.JOB_NAME');
Unauthorized reproduction or distribution prohibitedฺ Copyright© 2016, Oracle and/or its affiliatesฺ
• Stop a job:
DBMS_SCHEDULER.STOP_JOB('SCHEMA.JOB_NAME');
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
After a job has been created, you can: ฺma
t o us
• Run the job by calling thein ab nsprocedure
RUN_JOB e specifying the name of the job. The job is
( z a c e
immediately executed in yourlicurrent session.
n ble
hausing
• Stop the jobKby
b f e r athe STOP_JOB procedure. If the job is running currently, it is stopped
a i na raThe
immediately.
n s STOP_JOB procedure has two arguments:
o -t
Z - njob_name: Is the name of the job to be stopped
-n force: Attempts to gracefully terminate a job. If this fails and force is set to TRUE,
then the job slave is terminated. (Default value is FALSE.) To use force, you must
have the MANAGE SCHEDULER system privilege.
• Drop the job with the DROP_JOB procedure. This procedure has two arguments:
- job_name: Is the name of the job to be dropped
- force: Indicates whether the job should be stopped and dropped if it is currently
running (Default value is FALSE.)
If the DROP_JOB procedure is called and the job specified is currently running, then the
command fails unless the force option is set to TRUE. If the force option is set to TRUE,
then any instance of the job that is running is stopped and the job is dropped.
Note: To run, stop, or drop a job that belongs to another user, you need ALTER privileges on that job
or the CREATE ANY JOB system privilege.
• [DBA | ALL]_SCHEDULER_JOB_CLASSES
• [DBA | ALL | USER]_SCHEDULER_JOB_LOG
• [DBA | ALL | USER]_SCHEDULER_JOB_RUN_DETAILS
• [DBA | ALL | USER]_SCHEDULER_PROGRAMS
s a
a
)h ฺ
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
The DBA_SCHEDULER_JOB_LOG view ฺshows m t o us job instances, both successful and
a all completed
failed.
i n ab nse
To view the state of yourn (zause thelicfollowing
jobs,
e query:
a l e
SELECT job_name,
b Kh program_name,
f e r ab job_type, state
a i na rans
FROM USER_SCHEDULER_JOBS;
Z which
To determine
o n -t instance a job is running on, use the following query:
n
SELECT owner, job_name, running_instance, resource_consumer_group
FROM DBA_SCHEDULER_RUNNING_JOBS;
To determine information about how a job ran, use the following query:
SELECT job_name, instance_id, req_start_date, actual_start_date, status
FROM ALL_SCHEDULER_JOB_RUN_DETAILS;
To determine the status of your jobs, use the following query:
SELECT job_name, status, error#, run_duration, cpu_used
FROM USER_SCHEDULER_JOB_RUN_DETAILS;
s a
)h ฺa
m
co uide
s ฺ
r a nd nt G
s scb tude
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.
o d @ is S
q s o e th
m
This lesson covers a small subset of packages
ฺ t o us with the Oracle database. You have
a provided
extensively used DBMS_OUTPUT for n b se purposes and displaying procedurally generated
adebugging
z i
a icen
information on the screen in(SQL*Plus.
a n l e l
K h rab
In this lesson, you should have learned how to schedule PL/SQL and external code for execution
i n ab nsfe package.
with the DBMS_SCHEDULER
Note: For tra
Zamoren-information about all PL/SQL packages and types, refer to PL/SQL Packages and
n o
Types Reference.
s a
h
) ฺa
o m
d s ฺc uide
b r an ent G
s sc tud
o d @ is S
q s o e th
ฺ m a o us
n a b se t
( z ai icen
a n l e l
b Kh ferab
a i na rans
Z n-t
no