
- •Contents
- •Send Us Your Comments
- •Preface
- •What’s New in SQL Reference?
- •1 Introduction to Oracle SQL
- •History of SQL
- •SQL Standards
- •Embedded SQL
- •Lexical Conventions
- •Tools Support
- •2 Basic Elements of Oracle SQL
- •Datatypes
- •Oracle Built-in Datatypes
- •ANSI, DB2, and SQL/DS Datatypes
- •Oracle-Supplied Types
- •"Any" Types
- •XML Types
- •Spatial Type
- •Media Types
- •Datatype Comparison Rules
- •Data Conversion
- •Literals
- •Text Literals
- •Integer Literals
- •Number Literals
- •Interval Literals
- •Format Models
- •Number Format Models
- •Date Format Models
- •String-to-Date Conversion Rules
- •XML Format Model
- •Nulls
- •Nulls in SQL Functions
- •Nulls with Comparison Conditions
- •Nulls in Conditions
- •Pseudocolumns
- •CURRVAL and NEXTVAL
- •LEVEL
- •ROWID
- •ROWNUM
- •XMLDATA
- •Comments
- •Comments Within SQL Statements
- •Comments on Schema Objects
- •Hints
- •Database Objects
- •Schema Objects
- •Nonschema Objects
- •Parts of Schema Objects
- •Schema Object Names and Qualifiers
- •Schema Object Naming Rules
- •Schema Object Naming Examples
- •Schema Object Naming Guidelines
- •Syntax for Schema Objects and Parts in SQL Statements
- •How Oracle Resolves Schema Object References
- •Referring to Objects in Other Schemas
- •Referring to Objects in Remote Databases
- •Referencing Object Type Attributes and Methods
- •3 Operators
- •About SQL Operators
- •Unary and Binary Operators
- •Operator Precedence
- •Arithmetic Operators
- •Concatenation Operator
- •Set Operators
- •4 Expressions
- •About SQL Expressions
- •Simple Expressions
- •Compound Expressions
- •CASE Expressions
- •CURSOR Expressions
- •Datetime Expressions
- •Function Expressions
- •INTERVAL Expressions
- •Object Access Expressions
- •Scalar Subquery Expressions
- •Type Constructor Expressions
- •Variable Expressions
- •Expression Lists
- •5 Conditions
- •About SQL Conditions
- •Condition Precedence
- •Comparison Conditions
- •Simple Comparison Conditions
- •Group Comparison Conditions
- •Logical Conditions
- •Membership Conditions
- •Range Conditions
- •Null Conditions
- •EQUALS_PATH
- •EXISTS Conditions
- •LIKE Conditions
- •IS OF type Conditions
- •UNDER_PATH
- •Compound Conditions
- •6 Functions
- •SQL Functions
- •Single-Row Functions
- •Aggregate Functions
- •Analytic Functions
- •Object Reference Functions
- •Alphabetical Listing of SQL Functions
- •ACOS
- •ADD_MONTHS
- •ASCII
- •ASCIISTR
- •ASIN
- •ATAN
- •ATAN2
- •BFILENAME
- •BITAND
- •CAST
- •CEIL
- •CHARTOROWID
- •COALESCE
- •COMPOSE
- •CONCAT
- •CONVERT
- •CORR
- •COSH
- •COUNT
- •COVAR_POP
- •COVAR_SAMP
- •CUME_DIST
- •CURRENT_DATE
- •CURRENT_TIMESTAMP
- •DBTIMEZONE
- •DECODE
- •DECOMPOSE
- •DENSE_RANK
- •DEPTH
- •DEREF
- •DUMP
- •EMPTY_BLOB, EMPTY_CLOB
- •EXISTSNODE
- •EXTRACT (datetime)
- •EXTRACT (XML)
- •EXTRACTVALUE
- •FIRST
- •FIRST_VALUE
- •FLOOR
- •FROM_TZ
- •GREATEST
- •GROUP_ID
- •GROUPING
- •GROUPING_ID
- •HEXTORAW
- •INITCAP
- •INSTR
- •LAST
- •LAST_DAY
- •LAST_VALUE
- •LEAD
- •LEAST
- •LENGTH
- •LOCALTIMESTAMP
- •LOWER
- •LPAD
- •LTRIM
- •MAKE_REF
- •MONTHS_BETWEEN
- •NCHR
- •NEW_TIME
- •NEXT_DAY
- •NLS_CHARSET_DECL_LEN
- •NLS_CHARSET_ID
- •NLS_CHARSET_NAME
- •NLS_INITCAP
- •NLS_LOWER
- •NLSSORT
- •NLS_UPPER
- •NTILE
- •NULLIF
- •NUMTODSINTERVAL
- •NUMTOYMINTERVAL
- •PATH
- •PERCENT_RANK
- •PERCENTILE_CONT
- •PERCENTILE_DISC
- •POWER
- •RANK
- •RATIO_TO_REPORT
- •RAWTOHEX
- •RAWTONHEX
- •REFTOHEX
- •REGR_ (Linear Regression) Functions
- •REPLACE
- •ROUND (number)
- •ROUND (date)
- •ROW_NUMBER
- •ROWIDTOCHAR
- •ROWIDTONCHAR
- •RPAD
- •RTRIM
- •SESSIONTIMEZONE
- •SIGN
- •SINH
- •SOUNDEX
- •SQRT
- •STDDEV
- •STDDEV_POP
- •STDDEV_SAMP
- •SUBSTR
- •SYS_CONNECT_BY_PATH
- •SYS_CONTEXT
- •SYS_DBURIGEN
- •SYS_EXTRACT_UTC
- •SYS_GUID
- •SYS_TYPEID
- •SYS_XMLAGG
- •SYS_XMLGEN
- •SYSDATE
- •SYSTIMESTAMP
- •TANH
- •TO_CHAR (character)
- •TO_CHAR (datetime)
- •TO_CHAR (number)
- •TO_CLOB
- •TO_DATE
- •TO_DSINTERVAL
- •TO_MULTI_BYTE
- •TO_NCHAR (character)
- •TO_NCHAR (datetime)
- •TO_NCHAR (number)
- •TO_NCLOB
- •TO_NUMBER
- •TO_SINGLE_BYTE
- •TO_TIMESTAMP
- •TO_TIMESTAMP_TZ
- •TO_YMINTERVAL
- •TRANSLATE
- •TRANSLATE ... USING
- •TREAT
- •TRIM
- •TRUNC (number)
- •TRUNC (date)
- •TZ_OFFSET
- •UNISTR
- •UPDATEXML
- •UPPER
- •USER
- •USERENV
- •VALUE
- •VAR_SAMP
- •VARIANCE
- •VSIZE
- •WIDTH_BUCKET
- •XMLAGG
- •XMLCOLATTVAL
- •XMLCONCAT
- •XMLELEMENT
- •XMLFOREST
- •XMLSEQUENCE
- •XMLTRANSFORM
- •ROUND and TRUNC Date Functions
- •User-Defined Functions
- •Prerequisites
- •Name Precedence
- •7 Common SQL DDL Clauses
- •allocate_extent_clause
- •constraints
- •deallocate_unused_clause
- •file_specification
- •logging_clause
- •parallel_clause
- •physical_attributes_clause
- •storage_clause
- •8 SQL Queries and Subqueries
- •About Queries and Subqueries
- •Creating Simple Queries
- •Hierarchical Queries
- •The UNION [ALL], INTERSECT, MINUS Operators
- •Sorting Query Results
- •Joins
- •Using Subqueries
- •Unnesting of Nested Subqueries
- •Selecting from the DUAL Table
- •Distributed Queries
- •9 SQL Statements: ALTER CLUSTER to ALTER SEQUENCE
- •Types of SQL Statements
- •Organization of SQL Statements
- •ALTER CLUSTER
- •ALTER DATABASE
- •ALTER DIMENSION
- •ALTER FUNCTION
- •ALTER INDEX
- •ALTER INDEXTYPE
- •ALTER JAVA
- •ALTER MATERIALIZED VIEW
- •ALTER MATERIALIZED VIEW LOG
- •ALTER OPERATOR
- •ALTER OUTLINE
- •ALTER PACKAGE
- •ALTER PROCEDURE
- •ALTER PROFILE
- •ALTER RESOURCE COST
- •ALTER ROLE
- •ALTER ROLLBACK SEGMENT
- •ALTER SEQUENCE
- •10 SQL Statements: ALTER SESSION to ALTER SYSTEM
- •ALTER SESSION
- •ALTER SYSTEM
- •ALTER TABLE
- •ALTER TABLESPACE
- •ALTER TRIGGER
- •ALTER TYPE
- •ALTER USER
- •ALTER VIEW
- •ANALYZE
- •ASSOCIATE STATISTICS
- •AUDIT
- •CALL
- •COMMENT
- •COMMIT
- •13 SQL Statements: CREATE CLUSTER to CREATE JAVA
- •CREATE CLUSTER
- •CREATE CONTEXT
- •CREATE CONTROLFILE
- •CREATE DATABASE
- •CREATE DATABASE LINK
- •CREATE DIMENSION
- •CREATE DIRECTORY
- •CREATE FUNCTION
- •CREATE INDEX
- •CREATE INDEXTYPE
- •CREATE JAVA
- •14 SQL Statements: CREATE LIBRARY to CREATE SPFILE
- •CREATE LIBRARY
- •CREATE MATERIALIZED VIEW
- •CREATE MATERIALIZED VIEW LOG
- •CREATE OPERATOR
- •CREATE OUTLINE
- •CREATE PACKAGE
- •CREATE PACKAGE BODY
- •CREATE PFILE
- •CREATE PROCEDURE
- •CREATE PROFILE
- •CREATE ROLE
- •CREATE ROLLBACK SEGMENT
- •CREATE SCHEMA
- •CREATE SEQUENCE
- •CREATE SPFILE
- •15 SQL Statements: CREATE SYNONYM to CREATE TRIGGER
- •CREATE SYNONYM
- •CREATE TABLE
- •CREATE TABLESPACE
- •CREATE TEMPORARY TABLESPACE
- •CREATE TRIGGER
- •CREATE TYPE
- •CREATE TYPE BODY
- •CREATE USER
- •CREATE VIEW
- •DELETE
- •DISASSOCIATE STATISTICS
- •DROP CLUSTER
- •DROP CONTEXT
- •DROP DATABASE LINK
- •DROP DIMENSION
- •DROP DIRECTORY
- •DROP FUNCTION
- •DROP INDEX
- •DROP INDEXTYPE
- •DROP JAVA
- •DROP LIBRARY
- •DROP MATERIALIZED VIEW
- •DROP MATERIALIZED VIEW LOG
- •DROP OPERATOR
- •DROP OUTLINE
- •DROP PACKAGE
- •DROP PROCEDURE
- •DROP PROFILE
- •DROP ROLE
- •DROP ROLLBACK SEGMENT
- •17 SQL Statements: DROP SEQUENCE to ROLLBACK
- •DROP SEQUENCE
- •DROP SYNONYM
- •DROP TABLE
- •DROP TABLESPACE
- •DROP TRIGGER
- •DROP TYPE
- •DROP TYPE BODY
- •DROP USER
- •DROP VIEW
- •EXPLAIN PLAN
- •GRANT
- •INSERT
- •LOCK TABLE
- •MERGE
- •NOAUDIT
- •RENAME
- •REVOKE
- •ROLLBACK
- •18 SQL Statements: SAVEPOINT to UPDATE
- •SAVEPOINT
- •SELECT
- •SET CONSTRAINT[S]
- •SET ROLE
- •SET TRANSACTION
- •TRUNCATE
- •UPDATE
- •Required Keywords and Parameters
- •Optional Keywords and Parameters
- •Syntax Loops
- •Multipart Diagrams
- •Database Objects
- •ANSI Standards
- •ISO Standards
- •Oracle Compliance
- •FIPS Compliance
- •Oracle Extensions to Standard SQL
- •Character Set Support
- •Using Extensible Indexing
- •Using XML in SQL Statements
- •Index

CREATE TEMPORARY TABLESPACE
CREATE TEMPORARY TABLESPACE
Purpose
Use the CREATE TEMPORARY TABLESPACE statement to create a locally managed temporary tablespace, which is an allocation of space in the database that can contain schema objects for the duration of a session. If you subsequently assign this temporary tablespace to a particular user, then Oracle will also use this tablespace for sorting operations in transactions initiated by that user.
To create a tablespace to contain persistent schema objects, use the CREATE
TABLESPACE statement.
To create a temporary tablespace that is dictionary managed, use the CREATE TABLESPACE statement with the TEMPORARY clause.
Note: Media recovery does not recognize tempfiles.
See Also:
■CREATE TABLESPACE on page 15-80 for information on creating tablespaces to store persistent schema objects and dictionary-managed temporary tablespaces
■CREATE USER on page 16-32 for information on assigning a temporary tablespace to a user
Prerequisites
You must have the CREATE TABLESPACE system privilege.
Syntax
create_temporary_tablespace::=
CREATE TEMPORARY
TABLESPACE
tablespace
TEMPFILE datafile_tempfile_spec
temp_tablespace_extent ;
(datafile_tempfile_spec::= on page 7-39, temp_tablespace_extent::= on page 15-93)
15-92 Oracle9i SQL Reference

CREATE TEMPORARY TABLESPACE
temp_tablespace_extent::=
K
M
|
|
|
SIZE |
integer |
EXTENT |
MANAGEMENT |
LOCAL |
UNIFORM |
|
Semantics
tablespace
Specify the name of the temporary tablespace.
TEMPFILE datafile_tempfile_spec
Specify the tempfiles that make up the tablespace.
You can omit the TEMPFILE clause only if the DB_CREATE_FILE_DEST initialization parameter has been set. In this case, Oracle creates a 100 MB Oracle-managed tempfile in the default file destination specified in the parameter. The file has AUTOEXTEND enabled and an unlimited maximum size. If the DB_ CREATE_FILE_DEST parameter is not set, then you must specify the TEMPFILE clause.
Note: On some operating systems, Oracle does not allocate space for the tempfile until the tempfile blocks are actually accessed. This delay in space allocation results in faster creation and resizing of tempfiles, but it requires that sufficient disk space is available when the tempfiles are later used. To avoid potential problems, before you create or resize a tempfile, ensure that the available disk space exceeds the size of the new tempfile or the increased size of a resized tempfile. The excess space should allow for anticipated increases in disk space use by unrelated operations as well. Then proceed with the creation or resizing operation.
See Also: file_specification on page 7-39 for a full description, including the AUTOEXTEND parameter
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-93

CREATE TEMPORARY TABLESPACE
temp_tablespace_extent
The temp_tablespace_extent clause lets you specify how the tablespace is managed.
EXTENT MANAGEMENT LOCAL This clause indicates that some part of the tablespace is set aside for a bitmap. All temporary tablespaces created with the CREATE TEMPORARY TABLESPACE statement have locally managed extents, so this clause is optional. To create a dictionary-managed temporary tablespace, use the
CREATE TABLESPACE statement with the TEMPORARY clause.
UNIFORM All extents of temporary tablespaces are the same size (uniform), so this keyword is optional. However, you must specify UNIFORM in order to specify SIZE.
SIZE integer Specify in bytes the size of the tablespace extents. Use K or M to specify the size in kilobytes or megabytes.
If you do not specify SIZE, then Oracle uses the default extent size of 1M.
See Also: Oracle9i Database Concepts for a discussion of locally managed tablespaces
Example
Creating a Temporary Tablespace: Example This statement shows how the temporary tablespace that serves as the default temporary tablespace for database users in the sample database was created:
CREATE TEMPORARY TABLESPACE temp_demo
TEMPFILE ’temp01.dbf’ SIZE 5M AUTOEXTEND ON;
If we assume the default database block size of 2K, and that each bit in the map represents one extent, then each bit maps 2,500 blocks.
The following example sets the default location for datafile creation and then creates a tablespace with an Oracle-managed tempfile in the default location. The tempfile is 100 M and is autoextensible with unlimited maximum size (the default values for Oracle-managed files):
ALTER SYSTEM SET DB_CREATE_FILE_DEST = ’$ORACLE_HOME/rdbms/log’;
CREATE TEMPORARY TABLESPACE tbs_05;
15-94 Oracle9i SQL Reference

CREATE TRIGGER
CREATE TRIGGER
Purpose
Use the CREATE TRIGGER statement to create and enable a database trigger, which is
■A stored PL/SQL block associated with a table, a schema, or the database or
■An anonymous PL/SQL block or a call to a procedure implemented in PL/SQL or Java
Oracle automatically executes a trigger when specified conditions occur.
When you create a trigger, Oracle enables it automatically. You can subsequently disable and enable a trigger with the DISABLE and ENABLE clause of the ALTER TRIGGER or ALTER TABLE statement.
See Also:
■Oracle9i Database Concepts for a description of the various types of triggers
■Oracle9i Application Developer’s Guide - Fundamentals for more information on how to design triggers
■ALTER TRIGGER on page 12-2 and ALTER TABLE on page 11-2 for information on enabling, disabling, and compiling triggers
■DROP TRIGGER on page 17-13 for information on dropping a trigger
Prerequisites
Before a trigger can be created, the user SYS must run a SQL script commonly called DBMSSTDX.SQL. The exact name and location of this script depend on your operating system.
■To create a trigger in your own schema on a table in your own schema or on your own schema (SCHEMA), you must have the CREATE TRIGGER privilege.
■To create a trigger in any schema on a table in any schema, or on another user’s schema (schema.SCHEMA), you must have the CREATE ANY TRIGGER privilege.
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-95

CREATE TRIGGER
■In addition to the preceding privileges, to create a trigger on DATABASE, you must have the ADMINISTER DATABASE TRIGGER system privilege.
If the trigger issues SQL statements or calls procedures or functions, then the owner of the trigger must have the privileges necessary to perform these operations. These privileges must be granted directly to the owner rather than acquired through roles.
Syntax
create_trigger::=
OR |
REPLACE |
schema |
. |
BEFORE |
|
|
|
||||
CREATE |
|
TRIGGER |
trigger |
AFTER |
|
|
|
|
|
INSTEAD |
OF |
dml_event_clause |
|
|
|
|
|
|
OR |
|
|
|
|
ddl_event |
|
|
schema |
. |
|
|
|
|
|
|
SCHEMA |
|
OR |
|
ON |
|
|
|
|
|
|
DATABASE |
|
database_event |
|
|
|
||
WHEN |
( |
condition |
) |
pl/sql_block |
|
|
|
|
|
call_procedure_statement |
15-96 Oracle9i SQL Reference

CREATE TRIGGER
dml_event_clause::=
|
OR |
|
|
|
|
|
|
|
DELETE |
|
|
|
|
|
|
|
INSERT |
|
|
|
|
|
|
|
|
, |
|
|
|
|
|
|
OF |
column |
|
|
|
|
|
|
UPDATE |
|
|
|
|
|
|
|
schema |
. |
|
|
|
|
|
|
|
table |
|
|
|
|
|
ON |
NESTED |
TABLE |
nested_table_column |
OF |
schema |
. |
|
|
|||||||
|
|
|
|
|
|
|
view |
|
referencing_clause |
FOR |
EACH |
ROW |
|
|
|
referencing_clause::=
|
|
AS |
|
OLD |
old |
|
|
AS |
REFERENCING |
NEW |
new |
|
|
AS |
|
PARENT |
parent |
Semantics
OR REPLACE
Specify OR REPLACE to re-create the trigger if it already exists. Use this clause to change the definition of an existing trigger without first dropping it.
schema
Specify the schema to contain the trigger. If you omit schema, then Oracle creates the trigger in your own schema.
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-97

CREATE TRIGGER
trigger
Specify the name of the trigger to be created.
If a trigger produces compilation errors, then it is still created, but it fails on execution. This means it effectively blocks all triggering DML statements until it is disabled, replaced by a version without compilation errors, or dropped. You can see the associated compiler error messages with the SQL*Plus command SHOW ERRORS.
Note: If you create a trigger on a base table of a materialized view, then you must ensure that the trigger does not fire during a refresh of the materialized view. (During refresh, the DBMS_MVIEW procedure I_AM_A_REFRESH returns TRUE.)
BEFORE
Specify BEFORE to cause Oracle to fire the trigger before executing the triggering event. For row triggers, the trigger is fired before each affected row is changed.
Restrictions on BEFORE Triggers
■
■
You cannot specify a BEFORE trigger on a view or an object view.
You can write to the :NEW value but not to the :OLD value.
AFTER
Specify AFTER to cause Oracle to fire the trigger after executing the triggering event. For row triggers, the trigger is fired after each affected row is changed.
Restrictions on AFTER Triggers
■
■
You cannot specify an AFTER trigger on a view or an object view.
You cannot write either the :OLD or the :NEW value.
Note: When you create a materialized view log for a table, Oracle implicitly creates an AFTER ROW trigger on the table. This trigger inserts a row into the materialized view log whenever an INSERT, UPDATE, or DELETE statement modifies the table’s data. You cannot control the order in which multiple row triggers fire. Therefore, you should not write triggers intended to affect the content of the materialized view.
15-98 Oracle9i SQL Reference

CREATE TRIGGER
See Also: CREATE MATERIALIZED VIEW LOG on page 14-34 for more information on materialized view logs
INSTEAD OF
Specify INSTEAD OF to cause Oracle to fire the trigger instead of executing the triggering event. INSTEAD OF triggers are valid for DML events on views. They are not valid for DDL or database events.
If a view is inherently updatable and has INSTEAD OF triggers, then the triggers take preference. In other words, Oracle fires the triggers instead of performing DML on the view.
If the view belongs to a hierarchy, then the trigger is not inherited by subviews.
Note: Oracle fine-grained access control lets you define row-level security policies on views. These policies enforce specified rules in response to DML operations. If an INSTEAD OF trigger is also defined on the view, then Oracle will not enforce the row-level security policies, because Oracle fires the INSTEAD OF trigger instead of executing the DML on the view.
Restrictions on INSTEAD OF Triggers
■INSTEAD OF triggers are valid only for views. You cannot specify an INSTEAD OF trigger on a table.
■You can read both the :OLD and the :NEW value, but you cannot write either the :OLD or the :NEW value.
Note: You can create multiple triggers of the same type (BEFORE, AFTER, or INSTEAD OF) that fire for the same statement on the same table. The order in which Oracle fires these triggers is indeterminate. If your application requires that one trigger be fired before another of the same type for the same statement, combine these triggers into a single trigger whose trigger action performs the trigger actions of the original triggers in the appropriate order.
See Also: "Creating an INSTEAD OF Trigger: Example" on page 15-108
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-99

CREATE TRIGGER
dml_event_clause
The dml_event_clause lets you specify one of three DML statements that can cause the trigger to fire. Oracle fires the trigger in the existing user transaction.
See Also: "Creating a DML Trigger: Examples" on page 15-107
DELETE
Specify DELETE if you want Oracle to fire the trigger whenever a DELETE statement removes a row from the table or removes an element from a nested table.
INSERT
Specify INSERT if you want Oracle to fire the trigger whenever an INSERT statement adds a row to table or adds an element to a nested table.
UPDATE
Specify UPDATE if you want Oracle to fire the trigger whenever an UPDATE statement changes a value in one of the columns specified after OF. If you omit OF, then Oracle fires the trigger whenever an UPDATE statement changes a value in any column of the table or nested table.
For an UPDATE trigger, you can specify object type, varray, and REF columns after OF to indicate that the trigger should be fired whenever an UPDATE statement changes a value in one of the columns. However, you cannot change the values of these columns in the body of the trigger itself.
Note: Using OCI functions or the DBMS_LOB package to update LOB values or LOB attributes of object columns does not cause Oracle to fire triggers defined on the table containing the columns or the attributes.
Restrictions on Triggers on UPDATE Operations
■You cannot specify UPDATE OF for an INSTEAD OF trigger. Oracle fires INSTEAD OF triggers whenever an UPDATE changes a value in any column of the view.
■You cannot specify a nested table or LOB column in the UPDATE OF clause.
See Also: AS subquery of CREATE VIEW on page 16-39 for a list of constructs that prevent inserts, updates, or deletes on a view
15-100 Oracle9i SQL Reference

CREATE TRIGGER
Performing DML operations directly on nested table columns does not cause Oracle to fire triggers defined on the table containing the nested table column.
ddl_event
Specify one or more types of DDL statements that can cause the trigger to fire. You can create triggers for these events on DATABASE or SCHEMA unless otherwise noted. You can create BEFORE and AFTER triggers for these events. Oracle fires the trigger in the existing user transaction.
Restriction on Triggers on DDL Events You cannot specify as a triggering event any DDL operation performed through a PL/SQL procedure.
See Also: "Creating a DDL Trigger: Example" on page 15-107
The following ddl_event values are valid:
ALTER Specify ALTER to fire the trigger whenever an ALTER statement modifies a database object in the data dictionary.
Restriction on Triggers on ALTER Operations The trigger will not be fired by an
ALTER DATABASE statement.
ANALYZE Specify ANALYZE to fire the trigger whenever Oracle collects or deletes statistics or validates the structure of a database object.
ASSOCIATE STATISTICS Specify ASSOCIATE STATISTICS to fire the trigger whenever Oracle associates a statistics type with a database object.
AUDIT Specify AUDIT to fire the trigger whenever Oracle tracks the occurrence of a SQL statement or tracks operations on a schema object.
COMMENT Specify COMMENT to fire the trigger whenever a comment on a database object is added to the data dictionary.
CREATE Specify CREATE to fire the trigger whenever a CREATE statement adds a new database object to the data dictionary.
Restriction on Triggers on CREATE Operations The trigger will not be fired by a
CREATE DATABASE or CREATE CONTROLFILE statement.
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-101

CREATE TRIGGER
DISASSOCIATE STATISTICS Specify DISASSOCIATE STATISTICS to fire the trigger whenever Oracle disassociates a statistics type from a database object.
DROP Specify DROP to fire the trigger whenever a DROP statement removes a database object from the data dictionary.
GRANT Specify GRANT to fire the trigger whenever a user grants system privileges or roles or object privileges to another user or to a role.
NOAUDIT Specify NOAUDIT to fire the trigger whenever a NOAUDIT statement instructs Oracle to stop tracking a SQL statement or operations on a schema object.
RENAME Specify RENAME to fire the trigger whenever a RENAME statement changes the name of a database object.
REVOKE Specify REVOKE to fire the trigger whenever a REVOKE statement removes system privileges or roles or object privileges from a user or role.
TRUNCATE Specify TRUNCATE to fire the trigger whenever a TRUNCATE statement removes the rows from a table or cluster and resets its storage characteristics.
DDL Specify DDL to fire the trigger whenever any of the preceding DDL statements is issued.
database_event
Specify one or more particular states of the database that can cause the trigger to fire. You can create triggers for these events on DATABASE or SCHEMA unless otherwise noted. For each of these triggering events, Oracle opens an autonomous transaction scope, fires the trigger, and commits any separate transaction (regardless of any existing user transaction).
See Also: "Creating a Database Event Trigger: Example" on page 15-108
SERVERERROR Specify SERVERERROR to fire the trigger whenever a server error message is logged.
The following errors do not cause a SERVERERROR trigger to fire:
■
■
ORA-01403: data not found
ORA-01422: exact fetch returns more than requested number of rows
15-102 Oracle9i SQL Reference

CREATE TRIGGER
■ORA-01423: error encountered while checking for extra rows in exact fetch
■ORA-01034: ORACLE not available
■ORA-04030: out of process memory
LOGON Specify LOGON to fire the trigger whenever a client application logs onto the database.
LOGOFF Specify LOGOFF to fire the trigger whenever a client applications logs off the database.
STARTUP Specify STARTUP to fire the trigger whenever the database is opened.
SHUTDOWN Specify SHUTDOWN to fire the trigger whenever an instance of the database is shut down.
SUSPEND Specify SUSPEND to fire the trigger whenever a server error causes a transaction to be suspended.
Notes:
■Only AFTER triggers are relevant for LOGON, STARTUP,
SERVERERROR, and SUSPEND.
■Only BEFORE triggers are relevant for LOGOFF and SHUTDOWN.
■AFTER STARTUP and BEFORE SHUTDOWN triggers apply only to DATABASE.
See Also: PL/SQL User’s Guide and Reference for more information on autonomous transaction scope
ON table | view
The ON clause lets you determine the database object on which the trigger is to be created.
table | view
Specify the schema and table or view name of one of the following on which the trigger is to be created:
■Table or view
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-103

CREATE TRIGGER
■
■
Object table or object view
A column of nested-table type
If you omit schema, then Oracle assumes the table is in your own schema. You can create triggers on index-organized tables.
Restriction on Schema You cannot create a trigger on a table in the schema SYS.
NESTED TABLE Clause
Specify the nested_table_column of a view upon which the trigger is being defined. Such a trigger will fire only if the DML operates on the elements of the nested table.
Restriction on Triggers on Nested Tables You can specify NESTED TABLE only for
INSTEAD OF triggers.
DATABASE
Specify DATABASE to define the trigger on the entire database. The trigger fires whenever any database user initiates the triggering event.
SCHEMA
Specify SCHEMA to define the trigger on the current schema. The trigger fires whenever any user connected as schema initiates the triggering event.
See Also: "Creating a SCHEMA Trigger: Example" on page 15-109
referencing_clause
The referencing_clause lets you specify correlation names. You can use correlation names in the PL/SQL block and WHEN condition of a row trigger to refer specifically to old and new values of the current row. The default correlation names are OLD and NEW. If your row trigger is associated with a table named OLD or NEW, use this clause to specify different correlation names to avoid confusion between the table name and the correlation name.
■If the trigger is defined on a nested table, then OLD and NEW refer to the row of the nested table, and PARENT refers to the current row of the parent table.
■If the trigger is defined on an object table or view, then OLD and NEW refer to object instances.
15-104 Oracle9i SQL Reference

CREATE TRIGGER
Restriction on the referencing_clause The referencing_clause is not valid with INSTEAD OF triggers on CREATE DDL events.
FOR EACH ROW
Specify FOR EACH ROW to designate the trigger as a row trigger. Oracle fires a row trigger once for each row that is affected by the triggering statement and meets the optional trigger constraint defined in the WHEN condition.
Except for INSTEAD OF triggers, if you omit this clause, then the trigger is a statement trigger. Oracle fires a statement trigger only once when the triggering statement is issued if the optional trigger constraint is met.
INSTEAD OF trigger statements are implicitly activated for each row.
Restriction on Row Triggers This clause is valid only for DML event triggers (not DDL or database event triggers).
WHEN Clause
Specify the trigger restriction, which is a SQL condition that must be satisfied for Oracle to fire the trigger. See the syntax description of condition in Chapter 5, "Conditions". This condition must contain correlation names and cannot contain a query.
The NEW and OLD keywords, when specified in the WHEN clause, are not considered bind variables, so are not preceded by a colon (:). However, you must precede NEW and OLD with a colon in all references other than the WHEN clause.
See Also: "Calling a Procedure in a Trigger Body: Example" on page 15-108
Restrictions on Trigger Conditions
■If you specify this clause for a DML event trigger, then you must also specify FOR EACH ROW. Oracle evaluates this condition for each row affected by the triggering statement.
■You cannot specify trigger restrictions for INSTEAD OF trigger statements.
■You can reference object columns or their attributes, or varray, nested table, or LOB columns. You cannot invoke PL/SQL functions or methods in the trigger restriction.
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-105

CREATE TRIGGER
pl/sql_block
Specify the PL/SQL block that Oracle executes to fire the trigger.
The PL/SQL block of a database trigger can contain one of a series of built-in functions in the SYS schema designed solely to extract system event attributes. These functions can be used only in the PL/SQL block of a database trigger.
Restrictions on Trigger Implementation
■The PL/SQL block of a trigger cannot contain transaction control SQL statements (COMMIT, ROLLBACK, SAVEPOINT, and SET CONSTRAINT) if the block is executed within the same transaction.
■You can reference and use LOB columns in the trigger action inside the PL/SQL block. You can modify the :NEW values but not the :OLD values of LOB columns within the trigger action.
See Also:
■PL/SQL User’s Guide and Reference for information on PL/SQL, including how to write PL/SQL blocks
■Oracle9i Application Developer’s Guide - Fundamentals for information on these functions
■"Calling a Procedure in a Trigger Body: Example" on page 15-108
call_procedure_statement
The call_procedure_statement lets you call a stored procedure, rather than specifying the trigger code inline as a PL/SQL block. The syntax of this statement is the same as that for CALL on page 12-68, with the following exceptions:
■You cannot specify the INTO clause of CALL, because it applies only to functions.
■You cannot specify bind variables in expr.
■To reference columns of tables on which the trigger is being defined, you must specify :NEW and :OLD.
See Also: "Calling a Procedure in a Trigger Body: Example" on page 15-108
15-106 Oracle9i SQL Reference

CREATE TRIGGER
Examples
Creating a DML Trigger: Examples This example shows the basic syntax for a BEFORE statement trigger named . You would write such a trigger to place restrictions on DML statements issued on a table (such as when such statements could be issued).
CREATE TRIGGER schema.trigger_name BEFORE
DELETE OR INSERT OR UPDATE ON schema.table_name
pl/sql_block
Oracle fires such a trigger whenever a DELETE, INSERT, or UPDATE statement affects the table. This trigger is a BEFORE statement trigger, so Oracle fires it once before executing the triggering statement.
The next example shows a partial BEFORE row trigger. The PL/SQL block might specify, for example, that an employee’s salary must fall within the established salary range for the employee’s job:
CREATE TRIGGER hr.salary_check
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees FOR EACH ROW
WHEN (new.job_id <> ’AD_VP’) pl/sql_block
Oracle fires this trigger whenever one of the following statements is issued:
■An INSERT statement that adds rows to the employees table
■An UPDATE statement that changes values of the salary or job_id columns of the employees table
salary_check is a BEFORE row trigger, so Oracle fires it before changing each row that is updated by the UPDATE statement or before adding each row that is inserted by the INSERT statement.
salary_check has a trigger restriction that prevents it from checking the salary of the administrative vice president (AD_VP).
Creating a DDL Trigger: Example This example creates an AFTER statement trigger on any DDL statement CREATE. Such a trigger can be used to audit the creation of new data dictionary objects in your schema.
CREATE TRIGGER audit_db_object AFTER CREATE
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-107

CREATE TRIGGER
ON SCHEMA pl/sql_block
Calling a Procedure in a Trigger Body: Example You could create the salary_ check trigger described in the preceding example by calling a procedure instead of providing the trigger body in a PL/SQL block. Assume you have defined a procedure hr.salary_check, which verifies that an employee’s salary is in an appropriate range. Then you could create the trigger salary_check as follows:
CREATE TRIGGER hr.salary_check
BEFORE INSERT OR UPDATE OF salary, job_id ON hr.employees FOR EACH ROW
WHEN (new.job_id <> ’AD_VP’)
CALL check_sal(:new.job_id, :new.salary, :new.last_name);
The procedure check_sal could be implemented in PL/SQL, C, or Java. Also, you can specify :OLD values in the CALL clause instead of :NEW values.
Creating a Database Event Trigger: Example This example shows the basic syntax for a trigger to log all errors. The hypothetical PL/SQL block does some special processing for a particular error (invalid logon, error number 1017). This trigger is an AFTER statement trigger, so it is fired after an unsuccessful statement execution (such as unsuccessful logon).
CREATE TRIGGER log_errors AFTER SERVERERROR ON DATABASE
BEGIN
IF (IS_SERVERERROR (1017)) THEN <special processing of logon error>
ELSE
<log error number> END IF;
END;
Creating an INSTEAD OF Trigger: Example In this example, an oe.order_info view is created to display information about customers and their orders:
CREATE VIEW order_info AS
SELECT c.customer_id, c.cust_last_name, c.cust_first_name, o.order_id, o.order_date, o.order_status
FROM customers c, orders o
WHERE c.customer_id = o.customer_id;
Normally this view would not be updatable, because the primary key of the orders table (order_id) is not unique in the result set of the join view. To make this view updatable, create an INSTEAD OF trigger on the view to process INSERT
15-108 Oracle9i SQL Reference

CREATE TRIGGER
statements directed to the view (the PL/SQL trigger implementation is shown in italics):
CREATE OR REPLACE TRIGGER order_info_insert INSTEAD OF INSERT ON order_info
DECLARE
duplicate_info EXCEPTION;
PRAGMA EXCEPTION_INIT (duplicate_info, -00001); BEGIN
INSERT INTO customers
(customer_id, cust_last_name, cust_first_name) VALUES (
:new.customer_id, :new.cust_last_name, :new.cust_first_name);
INSERT INTO orders (order_id, order_date, customer_id) VALUES (
:new.order_id, :new.order_date, :new.customer_id);
EXCEPTION
WHEN duplicate_info THEN RAISE_APPLICATION_ERROR (
num=> -20107,
msg=> ’Duplicate customer or order ID’); END order_info_insert;
/
You can now insert into both base tables through the view (as long as all NOT NULL columns receive values):
INSERT INTO order_info VALUES
(999, ’Smith’, ’John’, 2500, ’13-MAR-2001’, 0);
Creating a SCHEMA Trigger: Example The following example creates a BEFORE statement trigger on the sample schema hr. When a user connected as hr attempts to drop a database object, Oracle fires the trigger before dropping the object:
CREATE OR REPLACE TRIGGER drop_trigger BEFORE DROP ON hr.SCHEMA
BEGIN RAISE_APPLICATION_ERROR (
num => -20000,
msg => ’Cannot drop object’);
END;
/
SQL Statements: CREATE SYNONYM to CREATE TRIGGER 15-109

CREATE TRIGGER
15-110 Oracle9i SQL Reference

16
SQL Statements: CREATE TYPE to DROP ROLLBACK SEGMENT
This chapter contains the following SQL statements:
■CREATE TYPE
■CREATE TYPE BODY
■CREATE USER
■CREATE VIEW
■DELETE
■DISASSOCIATE STATISTICS
■DROP CLUSTER
■DROP CONTEXT
■DROP DATABASE LINK
■DROP DIMENSION
■DROP DIRECTORY
■DROP FUNCTION
■DROP INDEX
■DROP INDEXTYPE
■DROP JAVA
■DROP LIBRARY
■DROP MATERIALIZED VIEW
SQL Statements: CREATE TYPE to DROP ROLLBACK SEGMENT 16-1

■DROP MATERIALIZED VIEW LOG
■DROP OPERATOR
■DROP OUTLINE
■DROP PACKAGE
■DROP PROCEDURE
■DROP PROFILE
■DROP ROLE
■DROP ROLLBACK SEGMENT
16-2 Oracle9i SQL Reference