Contents
- Audience
- How This Book Is Organized
- Related Documentation
- Conventions
- Sample Database Tables
- Documentation Accessibility
- Reading the Syntax Diagrams
- New Features in PL/SQL for Oracle Database 10g
- New Features in PL/SQL for Oracle9i
- Advantages of PL/SQL
-
- Tight Integration with SQL
- Support for SQL
- Better Performance
- Higher Productivity
- Full Portability
- Tight Security
- Support for Object-Oriented Programming
- Understanding the Main Features of PL/SQL
-
- Block Structure
- Variables and Constants
-
- Declaring Variables
- Assigning Values to a Variable
- Declaring Constants
- Processing Queries with PL/SQL
- Declaring PL/SQL Variables
-
- %TYPE
- %ROWTYPE
- Control Structures
-
- Conditional Control
- Iterative Control
- Sequential Control
- Writing Reusable PL/SQL Code
-
- Subprograms
- Packages
- Data Abstraction
-
- Collections
- Records
- Object Types
- Error Handling
- PL/SQL Architecture
-
- In the Oracle Database Server
-
- Anonymous Blocks
- Stored Subprograms
- Database Triggers
- In Oracle Tools
- Character Set
- Lexical Units
-
- Delimiters
- Identifiers
-
- Reserved Words
- Predefined Identifiers
- Quoted Identifiers
- Literals
-
- Numeric Literals
- Character Literals
- String Literals
- Boolean Literals
- Datetime Literals
- Comments
-
- Single-Line Comments
- Multi-line Comments
- Restrictions on Comments
- Declarations
-
- Using DEFAULT
- Using NOT NULL
- Using the %TYPE Attribute
- Using the %ROWTYPE Attribute
-
- Aggregate Assignment
- Using Aliases
- Restrictions on Declarations
- PL/SQL Naming Conventions
- Scope and Visibility of PL/SQL Identifiers
- Assigning Values to Variables
-
- Assigning Boolean Values
- Assigning a SQL Query Result to a PL/SQL Variable
- PL/SQL Expressions and Comparisons
-
- Logical Operators
- Boolean Expressions
- CASE Expressions
-
- Searched CASE Expression
- Handling Null Values in Comparisons and Conditional Statements
-
- NULLs and the NOT Operator
- Summary of PL/SQL Built-In Functions
- Overview of Predefined PL/SQL Datatypes
-
- PL/SQL Number Types
-
- BINARY_INTEGER
- BINARY_FLOAT and BINARY_DOUBLE
- NUMBER
- PLS_INTEGER
- PL/SQL Character and String Types
-
- CHAR
- LONG and LONG RAW
- RAW
- ROWID and UROWID
- VARCHAR2
- PL/SQL National Character Types
-
- Comparing UTF8 and AL16UTF16 Encodings
- NCHAR
- NVARCHAR2
- PL/SQL LOB Types
-
- BFILE
- BLOB
- CLOB
- NCLOB
- PL/SQL Boolean Types
-
- BOOLEAN
- PL/SQL Date, Time, and Interval Types
-
- DATE
- TIMESTAMP
- TIMESTAMP WITH TIME ZONE
- TIMESTAMP WITH LOCAL TIME ZONE
- INTERVAL YEAR TO MONTH
- INTERVAL DAY TO SECOND
- Datetime and Interval Arithmetic
- Avoiding Truncation Problems Using Date and Time Subtypes
- Overview of PL/SQL Subtypes
-
- Defining Subtypes
- Using Subtypes
-
- Type Compatibility
- Converting PL/SQL Datatypes
-
- Explicit Conversion
- Implicit Conversion
- Choosing Between Implicit and Explicit Conversion
- DATE Values
- RAW and LONG RAW Values
- Overview of PL/SQL Control Structures
- Testing Conditions: IF and CASE Statements
-
- Using the IF-THEN Statement
- Using the IF-THEN-ELSE Statement
- Using the IF-THEN-ELSIF Statement
- Using the CASE Statement
-
- Searched CASE Statement
- Guidelines for PL/SQL Conditional Statements
- Controlling Loop Iterations: LOOP and EXIT Statements
-
- Using the LOOP Statement
- Using the EXIT Statement
- Using the EXIT-WHEN Statement
- Labeling a PL/SQL Loop
- Using the WHILE-LOOP Statement
- Using the FOR-LOOP Statement
-
- How PL/SQL Loops Iterate
- Dynamic Ranges for Loop Bounds
- Scope of the Loop Counter Variable
- Using the EXIT Statement in a FOR Loop
- Sequential Control: GOTO and NULL Statements
-
- Using the GOTO Statement
-
- Restrictions on the GOTO Statement
- Using the NULL Statement
- What Is a Collection?
-
- Understanding Nested Tables
- Understanding Varrays
- Understanding Associative Arrays (Index-By Tables)
- How Globalization Settings Affect VARCHAR2 Keys for Associative Arrays
- Choosing Which PL/SQL Collection Types to Use
-
- Choosing Between Nested Tables and Associative Arrays
- Choosing Between Nested Tables and Varrays
- Defining Collection Types
-
- Defining SQL Types Equivalent to PL/SQL Collection Types
- Declaring PL/SQL Collection Variables
- Initializing and Referencing Collections
-
- Referencing Collection Elements
- Assigning Collections
- Comparing Collections
- Using PL/SQL Collections with SQL Statements
-
- Using PL/SQL Varrays with INSERT, UPDATE, and SELECT Statements
- Manipulating Individual Collection Elements with SQL
- Using Multilevel Collections
- Using Collection Methods
-
- Checking If a Collection Element Exists (EXISTS Method)
- Counting the Elements in a Collection (COUNT Method)
- Checking the Maximum Size of a Collection (LIMIT Method)
- Finding the First or Last Collection Element (FIRST and LAST Methods)
- Looping Through Collection Elements (PRIOR and NEXT Methods)
- Increasing the Size of a Collection (EXTEND Method)
- Decreasing the Size of a Collection (TRIM Method)
- Deleting Collection Elements (DELETE Method)
- Applying Methods to Collection Parameters
- Avoiding Collection Exceptions
- What Is a PL/SQL Record?
- Defining and Declaring Records
-
- Using Records as Procedure Parameters and Function Return Values
- Assigning Values to Records
-
- Comparing Records
- Inserting PL/SQL Records into the Database
- Updating the Database with PL/SQL Record Values
- Restrictions on Record Inserts/Updates
- Querying Data into Collections of Records
- Overview of SQL Support in PL/SQL
-
- Data Manipulation
- Transaction Control
- SQL Functions
- SQL Pseudocolumns
- SQL Operators
- Performing DML Operations from PL/SQL (INSERT, UPDATE, and DELETE)
-
- Overview of Implicit Cursor Attributes
-
- %FOUND Attribute: Has a DML Statement Changed Rows?
- %ISOPEN Attribute: Always FALSE for Implicit Cursors
- %NOTFOUND Attribute: Has a DML Statement Failed to Change Rows?
- %ROWCOUNT Attribute: How Many Rows Affected So Far?
- Guidelines for Using Implicit Cursor Attributes
- Using PL/SQL Records in SQL INSERT and UPDATE Statements
- Issuing Queries from PL/SQL
-
- Selecting At Most One Row: SELECT INTO Statement
- Selecting Multiple Rows: BULK COLLECT Clause
- Looping Through Multiple Rows: Cursor FOR Loop
- Performing Complicated Query Processing: Explicit Cursors
- Querying Data with PL/SQL
-
- Querying Data with PL/SQL: Implicit Cursor FOR Loop
- Querying Data with PL/SQL: Explicit Cursor FOR Loops
- Defining Aliases for Expression Values in a Cursor FOR Loop
- Overview of Explicit Cursors
-
- Declaring a Cursor
- Opening a Cursor
- Fetching with a Cursor
- Fetching Bulk Data with a Cursor
- Closing a Cursor
- Using Subqueries
- Using Correlated Subqueries
-
- Writing Maintainable PL/SQL Queries
- Using Cursor Attributes
-
- Overview of Explicit Cursor Attributes
-
- %FOUND Attribute: Has a Row Been Fetched?
- %ISOPEN Attribute: Is the Cursor Open?
- %NOTFOUND Attribute: Has a Fetch Failed?
- %ROWCOUNT Attribute: How Many Rows Fetched So Far?
- Using Cursor Variables (REF CURSORs)
-
- What Are Cursor Variables (REF CURSORs)?
- Why Use Cursor Variables?
- Declaring REF CURSOR Types and Cursor Variables
-
- Passing Cursor Variables As Parameters
- Controlling Cursor Variables: OPEN-FOR, FETCH, and CLOSE
-
- Opening a Cursor Variable
- Using a Cursor Variable as a Host Variable
- Fetching from a Cursor Variable
- Closing a Cursor Variable
- Reducing Network Traffic When Passing Host Cursor Variables to PL/SQL
- Avoiding Errors with Cursor Variables
- Restrictions on Cursor Variables
- Using Cursor Expressions
-
- Restrictions on Cursor Expressions
- Example of Cursor Expressions
- Constructing REF CURSORs with Cursor Subqueries
- Overview of Transaction Processing in PL/SQL
-
- Using COMMIT, SAVEPOINT, and ROLLBACK in PL/SQL
-
- Statement-Level Rollbacks
- How Oracle Does Implicit Rollbacks
- Ending Transactions
- Setting Transaction Properties with SET TRANSACTION
-
- Restrictions on SET TRANSACTION
- Overriding Default Locking
- Doing Independent Units of Work with Autonomous Transactions
-
- Advantages of Autonomous Transactions
- Defining Autonomous Transactions
-
- Comparison of Autonomous Transactions and Nested Transactions
- Transaction Context
- Transaction Visibility
- Controlling Autonomous Transactions
- Using Autonomous Triggers
- Calling Autonomous Functions from SQL
- What Is Dynamic SQL?
- Why Use Dynamic SQL?
- Using the EXECUTE IMMEDIATE Statement
-
- Specifying Parameter Modes for Bind Variables in Dynamic SQL Strings
- Building a Dynamic Query with Dynamic SQL
- Examples of Dynamic SQL for Records, Objects, and Collections
- Using Bulk Dynamic SQL
-
- Using Dynamic SQL with Bulk SQL
- Examples of Dynamic Bulk Binds
- Guidelines for Dynamic SQL
-
- When to Use or Omit the Semicolon with Dynamic SQL
- Improving Performance of Dynamic SQL with Bind Variables
- Passing Schema Object Names As Parameters
- Using Duplicate Placeholders with Dynamic SQL
- Using Cursor Attributes with Dynamic SQL
- Passing Nulls to Dynamic SQL
- Using Database Links with Dynamic SQL
- Using Invoker Rights with Dynamic SQL
- Using Pragma RESTRICT_REFERENCES with Dynamic SQL
- Avoiding Deadlocks with Dynamic SQL
- Backward Compatibility of the USING Clause
- What Are Subprograms?
- Advantages of PL/SQL Subprograms
- Understanding PL/SQL Procedures
- Understanding PL/SQL Functions
-
- Using the RETURN Statement
- Declaring Nested PL/SQL Subprograms
- Passing Parameters to PL/SQL Subprograms
-
- Actual Versus Formal Subprogram Parameters
- Using Positional, Named, or Mixed Notation for Subprogram Parameters
- Specifying Subprogram Parameter Modes
-
- Using the IN Mode
- Using the OUT Mode
- Using the IN OUT Mode
- Summary of Subprogram Parameter Modes
- Using Default Values for Subprogram Parameters
- Overloading Subprogram Names
-
- Guidelines for Overloading with Numeric Types
- Restrictions on Overloading
- How Subprogram Calls Are Resolved
-
- How Overloading Works with Inheritance
- Using Invoker's Rights Versus Definer's Rights (AUTHID Clause)
-
- Advantages of Invoker's Rights
- Specifying the Privileges for a Subprogram with the AUTHID Clause
- Who Is the Current User During Subprogram Execution?
- How External References Are Resolved in Invoker's Rights Subprograms
-
- The Need for Template Objects in Invoker's Rights Subprograms
- Overriding Default Name Resolution in Invoker's Rights Subprograms
- Granting Privileges on Invoker's Rights Subprograms
-
- Granting Privileges on an Invoker's Rights Subprogram: Example
- Using Roles with Invoker's Rights Subprograms
- Using Views and Database Triggers with Invoker's Rights Subprograms
- Using Database Links with Invoker's Rights Subprograms
- Using Object Types with Invoker's Rights Subprograms
-
- Calling Invoker's Rights Instance Methods
- Using Recursion with PL/SQL
-
- What Is a Recursive Subprogram?
- Calling External Subprograms
- Creating Dynamic Web Pages with PL/SQL Server Pages
- Controlling Side Effects of PL/SQL Subprograms
- Understanding Subprogram Parameter Aliasing
- What Is a PL/SQL Package?
-
- What Goes In a PL/SQL Package?
- Example of a PL/SQL Package
- Advantages of PL/SQL Packages
- Understanding The Package Specification
-
- Referencing Package Contents
-
- Restrictions
- Understanding The Package Body
- Some Examples of Package Features
- Private Versus Public Items in Packages
- Overloading Packaged Subprograms
- How Package STANDARD Defines the PL/SQL Environment
- Overview of Product-Specific Packages
-
- About the DBMS_ALERT Package
- About the DBMS_OUTPUT Package
- About the DBMS_PIPE Package
- About the UTL_FILE Package
- About the UTL_HTTP Package
- Guidelines for Writing Packages
- Separating Cursor Specs and Bodies with Packages
- Overview of PL/SQL Runtime Error Handling
-
- Guidelines for Avoiding and Handling PL/SQL Errors and Exceptions
- Advantages of PL/SQL Exceptions
- Summary of Predefined PL/SQL Exceptions
- Defining Your Own PL/SQL Exceptions
-
- Declaring PL/SQL Exceptions
- Scope Rules for PL/SQL Exceptions
- Associating a PL/SQL Exception with a Number: Pragma EXCEPTION_INIT
- Defining Your Own Error Messages: Procedure RAISE_APPLICATION_ERROR
- Redeclaring Predefined Exceptions
- How PL/SQL Exceptions Are Raised
-
- Raising Exceptions with the RAISE Statement
- How PL/SQL Exceptions Propagate
- Reraising a PL/SQL Exception
- Handling Raised PL/SQL Exceptions
-
- Handling Exceptions Raised in Declarations
- Handling Exceptions Raised in Handlers
- Branching to or from an Exception Handler
- Retrieving the Error Code and Error Message: SQLCODE and SQLERRM
- Catching Unhandled Exceptions
- Tips for Handling PL/SQL Errors
-
- Continuing after an Exception Is Raised
- Retrying a Transaction
- Using Locator Variables to Identify Exception Locations
- Overview of PL/SQL Compile-Time Warnings
-
- PL/SQL Warning Categories
- Controlling PL/SQL Warning Messages
- Using the DBMS_WARNING Package
- How PL/SQL Optimizes Your Programs
- When to Tune PL/SQL Code
- Guidelines for Avoiding PL/SQL Performance Problems
-
- Avoiding CPU Overhead in PL/SQL Code
- Avoiding Memory Overhead in PL/SQL Code
- Profiling and Tracing PL/SQL Programs
-
- Using The Profiler API: Package DBMS_PROFILER
- Using The Trace API: Package DBMS_TRACE
- Reducing Loop Overhead for DML Statements and Queries (FORALL, BULK COLLECT)
-
- Using the FORALL Statement
-
- Counting Rows Affected by FORALL with the %BULK_ROWCOUNT Attribute
- Handling FORALL Exceptions with the %BULK_EXCEPTIONS Attribute
- Retrieving Query Results into Collections with the BULK COLLECT Clause
-
- Examples of Bulk-Fetching from a Cursor
- Limiting the Rows for a Bulk FETCH Operation with the LIMIT Clause
- Retrieving DML Results into a Collection with the RETURNING INTO Clause
- Using FORALL and BULK COLLECT Together
- Using Host Arrays with Bulk Binds
- Writing Computation-Intensive Programs in PL/SQL
- Tuning Dynamic SQL with EXECUTE IMMEDIATE and Cursor Variables
- Tuning PL/SQL Procedure Calls with the NOCOPY Compiler Hint
-
- Restrictions on NOCOPY
- Compiling PL/SQL Code for Native Execution
- Setting Up Transformation Pipelines with Table Functions
-
- Overview of Table Functions
- Using Pipelined Table Functions for Transformations
- Writing a Pipelined Table Function
- Returning Results from Table Functions
- Pipelining Data Between PL/SQL Table Functions
- Querying Table Functions
- Optimizing Multiple Calls to Table Functions
- Fetching from the Results of Table Functions
- Passing Data with Cursor Variables
- Performing DML Operations Inside Table Functions
- Performing DML Operations on Table Functions
- Handling Exceptions in Table Functions
- Overview of PL/SQL Object Types
- What Is an Object Type?
- Why Use Object Types?
- Structure of an Object Type
- Components of an Object Type
-
- What Languages can I Use for Methods of Object Types?
- How Object Types Handle the SELF Parameter
- Overloading
- Changing Attributes and Methods of an Existing Object Type (Type Evolution)
- Defining Object Types
-
- Overview of PL/SQL Type Inheritance
-
- Examples of PL/SQL Type Inheritance
- Declaring and Initializing Objects
-
- Declaring Objects
- Initializing Objects
- How PL/SQL Treats Uninitialized Objects
- Accessing Object Attributes
- Defining Object Constructors
- Calling Object Constructors
- Calling Object Methods
- Sharing Objects through the REF Modifier
-
- Forward Type Definitions
- Manipulating Objects through SQL
-
- Selecting Objects
-
- Using Function VALUE
- Using Function REF
- Testing for Dangling Refs
- Using Function DEREF
- Inserting Objects
- Updating Objects
- Deleting Objects
- Assignment Statement
- AUTONOMOUS_TRANSACTION Pragma
- Blocks
- CASE Statement
- CLOSE Statement
- Collection Methods
- Collections
- Comments
- COMMIT Statement
- Constants and Variables
- Cursor Attributes
- Cursor Variables
- Cursors
- DELETE Statement
- EXCEPTION_INIT Pragma
- Exceptions
- EXECUTE IMMEDIATE Statement
- EXIT Statement
- Expressions
- FETCH Statement
-
- Restrictions on BULK COLLECT
- FORALL Statement
- Functions
- GOTO Statement
- IF Statement
- INSERT Statement
- Literals
- LOCK TABLE Statement
- LOOP Statements
- MERGE Statement
- NULL Statement
- Object Types
- OPEN Statement
- OPEN-FOR Statement
- OPEN-FOR-USING Statement
- Packages
- Procedures
- RAISE Statement
- Records
- RESTRICT_REFERENCES Pragma
- RETURN Statement
- ROLLBACK Statement
- %ROWTYPE Attribute
- SAVEPOINT Statement
- SCN_TO_TIMESTAMP Function
- SELECT INTO Statement
- SERIALLY_REUSABLE Pragma
- SET TRANSACTION Statement
- SQL Cursor
- SQLCODE Function
- SQLERRM Function
- TIMESTAMP_TO_SCN Function
- %TYPE Attribute
- UPDATE Statement
- Where to Find PL/SQL Sample Programs
- Exercises for the Reader
- Assigning Character Values
- Comparing Character Values
- Inserting Character Values
- Selecting Character Values
- Advantages of Wrapping PL/SQL Procedures
- Running the PL/SQL Wrap Utility
-
- Input and Output Files for the PL/SQL Wrap Utility
- Limitations of the PL/SQL Wrap Utility
- What Is Name Resolution?
- Examples of Qualified Names and Dot Notation
- Differences in Name Resolution Between SQL and PL/SQL
- Understanding Capture
-
- Inner Capture
- Same-Scope Capture
- Outer Capture
- Avoiding Inner Capture in DML Statements
- Qualifying References to Object Attributes and Methods
- Calling Parameterless Subprograms and Methods
- Name Resolution for SQL Versus PL/SQL
- When Should I Use Bind Variables with PL/SQL?
- When Do I Use or Omit the Semicolon with Dynamic SQL?
- How Can I Use Regular Expressions with PL/SQL?
- How Do I Continue After a PL/SQL Exception?
- Does PL/SQL Have User-Defined Types or Abstract Data Types?
- How Do I Pass a Result Set from PL/SQL to Java or Visual Basic (VB)?
- How Do I Specify Different Kinds of Names with PL/SQL's Dot Notation?
- What Can I Do with Objects and Object Types in PL/SQL?
- How Do I Create a PL/SQL Procedure?
- How Do I Input or Output Data with PL/SQL?
- How Do I Perform a Case-Insensitive Query?