What is PL/SQL?
PL/SQL is a procedural language that has both interactive
SQL and procedural programming language constructs such as iteration,
conditional branching.
What are the components of a
PL/SQL Block?
Declarative part
Executable part
Exception part
What are the datatypes a available
in PL/SQL?
Some scalar data types such as NUMBER, VARCHAR2, DATE,
CHAR, LONG, BOOLEAN. Some composite data types such as RECORD & TABLE.
What are % TYPE and % ROWTYPE?
What are the advantages of using these over datatypes?
% TYPE provides the data type of a variable or a database
column to that variable.
% ROWTYPE provides the record type that represents a
entire row of a table or view or columns selected in the cursor.
The advantages are:
I. Need not know about variable’s data type
ii. If the database definition of a column in a table
changes, the data type of a variable changes accordingly.
What is difference between %
ROWTYPE and TYPE RECORD?
% ROWTYPE is to be used whenever query returns an entire
row of a table or view. TYPE RECORD is to be used whenever query returns
columns of different table or views and variables.
Explain the two types of Cursors?
There are two types of cursors, Implicit Cursor and
Explicit Cursor.
PL/SQL uses Implicit Cursors for queries.
User defined cursors are called Explicit Cursors. They
can be declared and used.
What are the cursor attributes
used in PL/SQL?
% ISOPEN – Used to check whether a cursor is open or not.
% ROWCOUNT – Used to check the number of rows
fetched/updated/deleted.
% FOUND – Used to check whether cursor has fetched any
row. True if rows are fetched.
% NOT FOUND – Used to check whether cursor has fetched
any row. True if no rows are fetched.
What is a cursor for loop?
Cursor for loop implicitly declares %ROWTYPE as loop
index, opens a cursor, fetches rows of values from active set into fields in
the record and closes when all the records have been processed.
What is the difference between
implicit and explicit cursors?
An explicit cursor is declared opened and fetched from in
the program block where as an implicit cursor is automatically generated for
SQL statements that process a single row only.
What are the different types of
joins available in Oracle?
Equi Join: When primary and foreign key relationship
exists between the tables that are going to be joined.
Self Join: If comparison comes in a single table
Cartesian Join: When tables are joined without giving any
join condition.
Inner Join: The resultant set includes all the rows that
satisfy the join condition.
Outer Join: The resultant set includes the rows which
doesn’t satisfy the join condition. The outer join operator Plus sign (+)
will be included in the join condition.
What are SQLCODE and SQLERRM and
why are they important for PL/SQL developers?
SQLCODE returns the value of the error number for the
last error encountered. The SQLERRM returns the actual error message for the
last error encountered. They can be used in exception handling to report, or,
store in an error log table, the error that occurred in the code. These are
especially useful for the WHEN OTHERS exception.
What is an autonomous transaction?
An autonomous transaction is an independent transaction
that is initiated by another transaction (the parent transaction). An
autonomous transaction can modify data and commit or rollback independent of
the state of the parent transaction.
What is the difference between
View and Materialized view?
Materialized view will not be refreshed every time you
query the view. So to have good performance when data is not changed so
rapidly, we use Materialized views rather than normal views which always
fetches data from tables every time you run a query on it.
What is dynamic SQL?
Dynamic SQL allows you to construct a query, a DELETE
statement, a CREATE TABLE statement, or even a PL/SQL block as a string and
then execute it at runtime.
Can you use COMMIT in a trigger?
Yes but by defining an autonomous transaction.
What is the difference between
anonymous blocks and stored procedures?
Anonymous block is compiled only when called. Stored
procedure is compiled and stored in database with the dependency information as
well. Former is PL/SQL code directly called from an application. Latter is
stored in database. Former has declare statement. Latter doesn’t.
What is a package spec and package
body? Why the separation?
Spec declares public constructs. Body defines public
constructs, additionally declares and defines Private constructs.
Separation helps make development easier. Dependency is
simplified. You can modify body without invalidating dependent objects.
What is Correlated Subquery?
Correlated Subquery is a subquery that is evaluated once
for each row processed by the parent statement. Parent statement can be Select,
Update or Delete.
What is Sequence?
Sequences are used for generating sequence numbers
without any overhead of locking. Drawback is that after generating a sequence
number if the transaction is rolled back, then that sequence number is lost.
What is SQL Deadlock?
Deadlock is a unique situation in a multi user system
that causes two or more users to wait indefinitely for a locked resource. First
user needs a resource locked by the second user and the second user needs a
resource locked by the first user. To avoid dead locks, avoid using exclusive
table lock and if using, use it in the same sequence and use Commit frequently
to release locks.
What is SQL*Loader?
SQL*Loader is a product for moving data in external files
into tables in an Oracle database. To load data from external files into an
Oracle database, two types of input must be provided to SQL*Loader: the data
itself and the control file.
What is the use of CASCADE
CONSTRAINTS?
When this clause is used with the DROP command, a parent
table can be dropped even when a child table exists.
Explain forward declaration used
in functions?
A forward declaration means that modules (procedures and
functions) are declared in advance of their actual body definition.
This declaration makes that module available to be called by other modules even
before the program’s body is defined. A forward declaration consists simply of
the module header, which is just the name of the module followed by the
parameter list (and a RETURN clause in case the module is a function), no more
no less.
Forward declarations are required in one specific
situation: mutual recursion.
What are SQLCODE and SQLERRM and
why are they important for PL/SQL developers?
SQLCODE returns the value of the error number for the
last error encountered. The SQLERRM returns the actual error message for the
last error encountered. They can be used in exception handling to report, or,
store in an error log table, the error that occurred in the code. These are
especially useful for the WHEN OTHERS exception.
What is the difference between
Truncate and Delete Commands?
TRUNCATE is a DDL command whereas DELETE is a DML
command. Hence DELETE operation can be rolled back, but TRUNCATE operation
cannot be rolled back. WHERE clause can be used with DELETE and not with
TRUNCATE.
What is the Purpose of HAVING
Clause?
The HAVING clause is used in combination with the GROUP
BY clause. It can be used in a SELECT statement to filter the records that a
GROUP BY returns.
What is INLINE View in SQL?
The inline view is a construct in Oracle SQL where you
can place a query in the SQL FROM, clause, just as if the query was a table
name.
While creating a sequence, what
does cache and nocache options mean?
With respect to a sequence, the cache option specifies
how many sequence values will be stored in memory for faster access.
Does the view exist if the table
is dropped from the database?
Yes, in Oracle, the view continues to exist even after
one of the tables (that the view is based on) is dropped from the database.
However, if you try to query the view after the table has been dropped, you
will receive a message indicating that the view has errors.
What is an Index?
An index is a performance-tuning method of allowing
faster retrieval of records. An index creates an entry for each value that
appears in the indexed columns. By default, Oracle creates B-tree indexes.
What types of index data
structures can you have?
An index helps to faster search values in tables. The
three most commonly used index-types are:
- B-Tree: builds a tree of possible values with a list of row IDs that have the leaf value. Needs a lot of space and is the default index type for most databases.
- Bitmap: string of bits for each possible value of the column. Each bit string has one bit for each row. Needs only little space and is very fast. (However, domain of value cannot be large, e.g. SEX(m,f); degree(BS,MS,PHD)
- Hash: A hashing algorithm is used to assign a set of characters to represent a text string such as a composite of keys or partial keys, and compresses the underlying data. Takes longer to build and is supported by relatively few databases.
What is the difference between a
“where” clause and a “having” clause?
“Where” is a kind of restriction statement. You use where
clause to restrict all the data from DB. Where clause is used before result
retrieving. But Having clause is using after retrieving the data. Having clause
is a kind of filtering command.
Can a view be
updated/inserted/deleted? If Yes – under what conditions?
A View can be updated/deleted/inserted if it has only one
base table if the view is based on columns from one or more tables then insert,
update and delete is not possible.
What is tkprof and how is it used?
The tkprof tool is a tuning tool used to determine cpu and
execution times for SQL statements. You use it by first setting
timed_statistics to true in the initialization file and then turning on tracing
for either the entire database via the sql_trace parameter or for the session
using the ALTER SESSION command. Once the trace file is generated you run the
tkprof tool against the trace file and then look at the output from the tkprof
tool. This can also be used to generate explain plan output.
What is explain plan and how is it
used?
The EXPLAIN PLAN command is a tool to tune SQL
statements. To use it you must have an explain_table generated in the user you
are running the explain plan for. This is created using the utlxplan.sql
script. Once the explain plan table exists you run the explain plan command
giving as its argument the SQL statement to be explained. The explain_plan
table is then queried to see the execution plan of the statement. Explain plans
can also be run using tkprof.
What are the Lock types?
Share Lock: It allows the other users
for only reading not to insert or update or delete.
Exclusive Lock: Only one user can have the
privileges of insert or update and delete of particular object, others
can only read.
Update Lock: Multiple user can read, update
delete .
What is Pragma EXECPTION_INIT?
Explain the usage?
The PRAGMA EXECPTION_INIT tells the complier to associate an exception with an oracle error.
E.g. PRAGMA EXCEPTION_INIT (exception name, oracle error number)
What is Raise_application_error?
Raise_application_error is a procedure of package
DBMS_STANDARD which allows to issue a user_defined error messages from stored
sub-program or database trigger.
What are the modes for passing
parameters to Oracle?
There are three modes for passing parameters to
subprograms
IN – An In-parameter lets you pass values to the subprogram being called. In the subprogram it acts like a constant and cannot be assigned a value.
OUT – An out-parameter lets you return values to the caller of the subprogram. It acts like an initialized variable its value cannot be assigned to another variable or to itself.
INOUT – An in-out parameter lets you pass initial values to the subprogram being called and returns updated values to the caller.
IN – An In-parameter lets you pass values to the subprogram being called. In the subprogram it acts like a constant and cannot be assigned a value.
OUT – An out-parameter lets you return values to the caller of the subprogram. It acts like an initialized variable its value cannot be assigned to another variable or to itself.
INOUT – An in-out parameter lets you pass initial values to the subprogram being called and returns updated values to the caller.
What is the difference between
Package, Procedure and Functions?
A package is a database objects that logically groups
related PL/SQL types, objects, and Subprograms.
Procedure is a sub program written to perform a set of
actions and can return multiple values.
Function is a subprogram written to perform certain
computations and return a single value.
Unlike subprograms packages cannot be called, passed parameters or nested.
Unlike subprograms packages cannot be called, passed parameters or nested.
How do you make a Function and
Procedure as a Private?
Functions and Procedures can be made private to a package
by not mentioning their declaration in the package specification and by just
mentioning them in the package body.
What is Commit, Rollback and Save
point?
Commit – Makes changes to the current transaction
permanent. It erases the savepoints and releases the transaction locks.
Savepoint –Savepoints allow to arbitrarily hold work at
any point of time with option of later committing. They are used to divide
transactions into smaller portions.
Rollback – This statement is used to undo work.
What is the difference between
DDL, DML and DCL structures?
DDL statements are used for defining data. Ex: Create,
Alter, Drop, Truncate, Rename.
DML statements are used for manipulating data. Ex: Insert, update, truncate.
DCL statements are used for to control the access of data. Ex; Grant, Revoke.
TCL statements are used for data saving. Ex; Commit, Rollback, Savepoint.
DML statements are used for manipulating data. Ex: Insert, update, truncate.
DCL statements are used for to control the access of data. Ex; Grant, Revoke.
TCL statements are used for data saving. Ex; Commit, Rollback, Savepoint.
What is the difference between the
snapshot and synonym?
A snapshot refers to read-only copies of a master table
or tables located on a remote node. A snapshot can be queried, but not updated;
only the master table can be updated. A snapshot is periodically refreshed to
reflect changes made to the master table. In this sense, a snapshot is really a
view with periodicity.
A synonym is an alias for table, view, sequence or
program unit. They are of two types private and public.
What is the difference between
data types char and varchar?
Char reserves the number of memory locations mentioned in
the variable declarations, even though not used (it can store a maximum of 255
bytes). Where as Varchar does not reserve any memory locations when the
variable is declared, it stores the values only after they are assigned (it can
store a maximum of 32767 bytes).
Can one call DDL statements from
PL/SQL?
One can call DDL statements like CREATE, DROP, TRUNCATE,
etc. from PL/SQL by using the “EXECUTE IMMEDATE” statement.
Tell some new features in PL/SQL
in 10g?
-Regular expression functions REGEXP_LIKE, REGEXP_INSTR,
REGEXP_REPLACE, and REGEXP_SUBSTR
-Compile time warnings
- Conditional compilation
- Improvement to native compilation
- BINARY_INTEGER made similar to PLS_INTEGER
- Implicit conversion between CLOB and NCLOB
- Improved Overloading
- New datatypes BINARY_FLOAT, BINARY_DOUBLE
- Global optimization enabled
- PLS_INTEGER range increased to 32bit
- DYNAMIC WRAP using DBMS_DDL
What is Overloading in PL/SQL?
Overloading is an oops concept (Object Oriented
Programming). By using the same name we can write any number of Procedures or
functions in a package but either number of parameters in the procedure/function
must vary or parameter datatype must vary.
What is a mutating and
constraining table?
“Mutating” means “changing”. A mutating table is a table
that is currently being modified by an update, delete, or insert statement.
When a trigger tries to reference a table that is in state of flux (being
changed), it is considered “mutating” and raises an error since Oracle should
not return data that has not yet reached its final state.
Another way this error can occur is if the trigger has
statements to change the primary, foreign or unique key columns of the table
off which it fires. If you must have triggers on tables that have referential
constraints, the workaround is to enforce the referential integrity through
triggers as well.
What is Nested Table?
A nested table is a table within a table. A nested table
is a collection of rows, represented as a column within the main table. For
each record within main table, the nested table may contain multiple
rows. In a sense, it’s a way of storing a one-to many relationship within
one table.
What is Varying Array?
A varying array is a set of objects, each with the same
data types. The size of the array is limited when it is created. (When the
table is created with a varying array, the array is a nested table with a
limited set of rows). Varying arrays also known as VARRAYS, allows storing
repeated attributes in tables.
Give some most often used
predefined exceptions?
a) NO_DATA_FOUND (Select Statement returns no rows)
b) TOO_MANY_ROWS (Single row Select statement returns more than 1 row)
c) INVALID_CURSOR (Illegal cursor operations occurred)
d) CURSOR_ALREADY_OPEN (If cursor is opened & we are trying to reopen it)
e) INVALID_NUMBER (Conversion of Character to number fails)
f) ZERO_DIVIDE
g) DUP_VAL_ON_INDEX (Attempted to insert a duplicate value)
b) TOO_MANY_ROWS (Single row Select statement returns more than 1 row)
c) INVALID_CURSOR (Illegal cursor operations occurred)
d) CURSOR_ALREADY_OPEN (If cursor is opened & we are trying to reopen it)
e) INVALID_NUMBER (Conversion of Character to number fails)
f) ZERO_DIVIDE
g) DUP_VAL_ON_INDEX (Attempted to insert a duplicate value)
Give some important Oracle
supplied packages?
DBMS_SQL: It is used to write Procedures & Anonymous blocks
that use Dynamic SQL.
DBMS_JOB: Using it, we can submit PL/SQL programs for execution,
execute PL/SQL programs on a schedule, identify when programs should run,
remove programs from the schedule & suspend programs from running.
DBMS_OUTPUT: This package outputs values & messages from any
PL/SQL block.
UTL_FILE: With this package, you can read from & write to Operating
system files
UTL_HTTP: This package allows to make HTTP Requests directly from
the database.
What is Instead Of Trigger?
This trigger is used to perform DML operation directly on
the underlying tables, because a view cannot be modified by normal DML
Statements if it contains joins or Group Functions. These triggers are Only Row
Level Triggers. The CHECK option for views is not enforced when DML to the view
are performed by Instead of Trigger.
What is the Sequence of Firing
Database Triggers?
a) Before Row Level Trigger
b) Before Statement Level Trigger
c) After Row Level Trigger
d) Statement Operation
e) After Statement Level Trigger
b) Before Statement Level Trigger
c) After Row Level Trigger
d) Statement Operation
e) After Statement Level Trigger
What is the Difference between
PL/SQL Table & Nested Table?
PL/SQL Table: Index by Tables are not Stored in Database.
Nested Table: Nested Tables are Stored in Database as Database Columns.
Nested Table: Nested Tables are Stored in Database as Database Columns.
What is the Difference between
Nested Table & Varray?
Nested Table
a) This are Sparse
b) We can Delete its Individual Elements
c) It do not have an Upper Boundary
d) This are Stored in System Generated Table
a) This are Sparse
b) We can Delete its Individual Elements
c) It do not have an Upper Boundary
d) This are Stored in System Generated Table
Varray
a) This are Dense
b) We cannot Delete its Elements
c) This are Fixed Size & always need to specify the size
d) These are Stored in Tablespaces
a) This are Dense
b) We cannot Delete its Elements
c) This are Fixed Size & always need to specify the size
d) These are Stored in Tablespaces
What are the various SQL
Statements?
a) Data Retrieval: Select
b) DML: Insert, Update, Delete
c) DDL: Create, Alter, Drop, Rename, Truncate
d) Transaction Control: Commit, Rollback, Savepoint
e) DCL: Grant, Revoke
f) Session Control: Alter Session, Set Role
g) System Control: Alter System
h) Embedded SQL Statements: Open, Close, Fetch & Execute.
b) DML: Insert, Update, Delete
c) DDL: Create, Alter, Drop, Rename, Truncate
d) Transaction Control: Commit, Rollback, Savepoint
e) DCL: Grant, Revoke
f) Session Control: Alter Session, Set Role
g) System Control: Alter System
h) Embedded SQL Statements: Open, Close, Fetch & Execute.
What is Rowid?
It is a Hexadecimal Representation of a Row in a Table.
Rowid can only be Changed if we ‘Enable Row Movement’ on a Partitioned Table.
Rowid’s of Deleted Rows can be Reused if Transaction is Committed.
What is Partitioning?
It Enables Tables & Indexes or Index-Organized tables
to be subdivided into smaller manageable Pieces & these each small Piece is
called Partition.
They are of following Types:
a) Range Partitioning
b) Hash Partitioning
c) List Partitioning
d) Composite Range-Hash Partitioning
They are of following Types:
a) Range Partitioning
b) Hash Partitioning
c) List Partitioning
d) Composite Range-Hash Partitioning
What is a Cluster?
A cluster provides an optional method of storing table
data. A cluster is comprised of a group of tables that share the same data
blocks, which are grouped together because they share common columns and are
often used together. For example, the EMP and DEPT table share the DEPTNO
column. When you cluster the EMP and DEPT, Oracle physically stores all rows
for each department from both the EMP and DEPT tables in the same data blocks.
You should not use Clusters for tables that are frequently accessed
individually.
What is the Difference between
Nested Subquery & Correlated Subquery?
Nested Subquery
a) Inner Query runs first and executes once, returning values which are to be used by the Main query or outer query
b) Outer query is driver by Inner Query
a) Inner Query runs first and executes once, returning values which are to be used by the Main query or outer query
b) Outer query is driver by Inner Query
Correlated Subquery
a) A Correlated Subquery or Inner Query execute once for each candidate row considered by outer query
b) Inner Query is Driven by Outer Query
a) A Correlated Subquery or Inner Query execute once for each candidate row considered by outer query
b) Inner Query is Driven by Outer Query
What is the Difference between
Translate & Replace?
Translate function converts each character in String with
specified one whereas Replace function replaces part of the string in
continuity by another sub-string.
PL/SQL Collections
These are composite variables in PL/SQL and have internal
components that you can treat as individual variables. You can pass these
composite variables to subprograms as a parameters.
To create a collection or record variable, you first
define a collection or record type, and then you declare a variable of that
type.
- In a collection, the internal components are always of the same data type, and are called elements. You access each element by its unique subscript. Lists and arrays are classic examples of collections.
- In a record, the internal components can be of different data types, and are called fields. You access each field by its name. A record variable can hold a table row, or some columns from a table row. Each record field corresponds to a table column.
PL/SQL Collection Types:
PL/SQL has three collection types, whose characteristics
are summarized below.
1] Associative array (or index-by
table)
- Number of Elements: Unbounded
- Subscript Type: String or integer
- Dense or Sparse: Either
- Where Created: Only in PL/SQL block
2] Nested Table
- Number of Elements: Unbounded
- Subscript Type: Integer
- Dense or Sparse: Starts dense, can become sparse
- Where Created: Either in PL/SQL block or at schema level
Variable size Array (Varray)
- Number of Elements: Bounded
- Subscript Type: Integer
- Dense or Sparse: Always Dense
- Where Created: Either in PL/SQL block or at schema level
Note:
Unbounded means that, theoretically,
there is no limit to the number of elements in the collection. Actually, there
are limits, but they are very high.
Dense means that the collection has no gaps
between elements—every element between the first and last element is defined
and has a value (which can be
NULL
).
A collection that is created in a PL/SQL block is
available only in that block. A nested table type or varray type that is
created at schema level is stored in the database, and you can manipulate it
with SQL statements.
A collection has only one dimension, but you can model a
multidimensional collection by creating a collection whose elements are also
collections.
Associative Arrays (Index-By Tables):
An associative array (also called an index-by table) is a
set of key-value pairs. Each key is unique, and is used to locate the
corresponding value.
DECLARE |
||
02 |
--
Associative array indexed by string: |
|
03 |
|
|
04 |
TYPE
ODI_RUNS IS TABLE
OF NUMBER -- Associative array type |
05 |
INDEX
BY VARCHAR2(64); |
|
06 |
|
07 |
odi_batsman_runs
ODI_RUNS; -- Associative array
variable |
|
08 |
i VARCHAR2(64);
|
09 |
|
|
10 |
BEGIN |
11 |
-- Add new elements to
associative array: |
|
12 |
|
13 |
odi_batsman_runs('Virender
Sehwag' ) := 7380; |
|
14 |
odi_batsman_runs( 'Ricky Ponting')
:= 13082; |
15 |
odi_batsman_runs('Sachin
Tendulkar' ) := 17629; |
|
16 |
|
17 |
-- Print associative
array: |
|
18 |
|
19 |
i := odi_batsman_runs.FIRST ;
|
|
20 |
|
21 |
WHILE i IS
NOT NULL LOOP |
|
22 |
DBMS_Output.PUT_LINE
|
23 |
('Total ODI Runs on
Jan 2010 by ' ||
i || ' is ' || TO_CHAR(odi_batsman_runs(i))); |
|
24 |
i :=
odi_batsman_runs.NEXT(i); |
25 |
END
LOOP; |
|
26 |
END; |
Total ODI Runs on Jan 2010 by Ricky Ponting is 13082
Total ODI Runs on Jan 2010 by Sachin Tendulkar is 17629
Total ODI Runs on Jan 2010 by Virender Sehwag is 7380
Total ODI Runs on Jan 2010 by Sachin Tendulkar is 17629
Total ODI Runs on Jan 2010 by Virender Sehwag is 7380
- Like a database table, an associative array holds a data set of arbitrary size, and you can access its elements without knowing their positions in the array.
- An associative array does not need the disk space or network operations of a database table, but an associative array cannot be manipulated by SQL statements (such as INSERT and DELETE).
- An associative array is intended for temporary data storage.
- To make an associative array persistent for the life of a database session, declare the associative array (the type and the variable of that type) in a package, and assign values to its elements in the package body.
Nested Tables:
A nested table is like a one-dimensional array with an
arbitrary number of elements.
Within the database, a nested table is a column type that
holds a set of values. The database stores the rows of a nested table in no
particular order. When you retrieve a nested table from the database into a
PL/SQL variable, the rows are given consecutive subscripts starting at 1. These
subscripts give you array-like access to individual rows.
A nested table differs from an array in these important
ways:
- An array has a declared number of elements, but a nested table does not. The size of a nested table can increase dynamically.
- An array is always dense (that is, it always has consecutive subcripts). A nested array is dense initially, but it can become sparse, because you can delete elements from it.
Variable-Size Arrays (Varrays):
A variable-size array (varray) is an item of the data
type
VARRAY
. A varray has a maximum size, which you specify in its type
definition. A varray can contain a varying number of elements, from zero
(when empty) to the maximum size. A varray index has a fixed lower bound
of 1 and an extensible upper bound. To access an element of a varray, you use
standard subscripting syntax
DECLARE |
||
02 |
TYPE
nested_type IS TABLE
OF VARCHAR2(30); |
|
03 |
TYPE varray_type IS
VARRAY(5) OF
INTEGER ; |
|
04 |
v1
nested_type; |
05 |
v2 varray_type; |
|
06 |
BEGIN |
07 |
v1 := nested_type('Shipping' ,'Sales' ,'Finance' ,'Payroll' );
|
|
08 |
v2 :=
varray_type(1, 2, 3, 4, 5); -- Up to 5 integers |
09 |
FOR i IN
v1.FIRST
.. v1.LAST |
|
10 |
LOOP |
11 |
DBMS_OUTPUT.PUT_LINE('Element
#' ||
i || 'in the nested table = ' || v1(i)); |
|
12 |
END
LOOP ; |
13 |
|
|
14 |
FOR j IN v2.FIRST
.. v2.LAST |
15 |
LOOP |
|
16 |
DBMS_OUTPUT.PUT_LINE( 'Element #' || j || 'in the varray = ' || v2(j)); |
17 |
END
LOOP; |
|
18 |
END; |
Nested tables Vs. Varrays:
- Nested tables are unbounded and are initially dense but can become sparse through deletions. Varrays are always bounded and never sparse.
- When stored in the database, the order and subscripts of Nested tables are not preserved while varrays keep their ordering and subscripts.
- Nested table data is stored in a separate store table, a system-generated database table while a varray is stored as a single object in the database.
Autonomous Transactions in
Oracle
Autonomous Transaction is a new feature in ORACLE
starting from 8i. It allows setting up independent transactions that can be
called from within other transactions. It lets you suspend the main transaction
(without committing or rolling back), perform some DML operations, commit or
roll back those operations (without any effect on the main transaction), and
then return to the main transaction.
Being independent of the main transaction (almost like a
separate session), an autonomous transaction does not see the uncommitted
changes from the main transaction. It also does not share locks with the main
transaction. Changes committed by an autonomous transaction are visible to
other sessions/transactions immediately, regardless of whether the main transaction
is committed or not. These changes also become visible to the main transaction
when it resumes, provided its isolation level is set to READ COMMITTED (which
is the default).
The following types of PL/SQL blocks can be defined as
autonomous transactions:
- Stored procedures and functions.
- Local procedures and functions defined in a PL/SQL declaration block.
- Packaged procedures and functions.
- Type methods.
- Top-level anonymous blocks.
Any of the routines can be marked as autonomous simply by
using the following syntax anywhere in the declarative section of the routine
(putting it at the top is recommended for better readability):
DECLARE |
||
2 |
PRAGMA
AUTONOMOUS_TRANSACTION; |
|
3 |
BEGIN |
|
4 |
FOR
i IN 3 .. 10 LOOP |
5 |
INSERT
INTO at_test (id, description) |
|
6 |
VALUES
(i, 'Description for ' || i); |
7 |
END
LOOP; |
|
8 |
COMMIT; |
9 |
END ; |
Delete Duplicate Records in
Oracle
There are times when duplicate rows somehow creep
into a table. The best scenario to happen this is when the data is to be imported
from some other table or data and the Constraints are removed so that data
import successfully. Removing duplicate rows from Oracle tables with SQL
can be very tricky, and there are several techniques for identifying and
removing duplicate rows from tables:
CREATE TABLE dup_test ( |
||
02 |
Emp_Id VARCHAR2(5), |
|
03 |
Name
VARCHAR2(15), |
|
04 |
Phone NUMBER); |
05 |
|
|
06 |
INSERT INTO dup_test values ('100' ,'John' ,473256);
|
07 |
INSERT INTO dup_test values( '100', 'John',473256); |
08 |
INSERT INTO dup_test values ('101' ,'Dave' ,561982);
|
09 |
|
|
10 |
SELECT * FROM
dup_test; |
Use subquery to delete duplicate rows:
Here we see an example of using SQL to delete duplicate table
rows using an SQL subquery to identify duplicate rows, manually specifying
the join columns
DELETE FROM |
||
02 |
dup_test
A |
|
03 |
WHERE |
|
04 |
a.rowid
> |
05 |
ANY
( |
|
06 |
SELECT |
07 |
B.rowid |
|
08 |
FROM |
09 |
dup_test B |
|
10 |
WHERE |
11 |
A.Emp_Id = B.Emp_Id |
|
12 |
AND |
13 |
A.Name
= B.Name |
|
14 |
AND |
15 |
A.Phone = B.Phone |
|
16 |
); |
Use another table to delete duplicate
rows:
This is the simplest method to remove duplicity.
CREATE TABLE dup_test_1 as select
distinct * from dup_test; |
||
2 |
DROP TABLE dup_test; |
3 |
RENAME dup_test_1 to
dup_test; |
Use RANK to delete duplicate rows:
This is an example of the RANK function to identify and
remove duplicate rows from Oracle tables, which deletes all duplicate rows
while leaving the initial instance of the duplicate row:
DELETE FROM dup_test where rowid
in |
||
02 |
( |
03 |
select
"rowid" from |
|
04 |
(select
"rowid",
rank_n from |
05 |
(select
rank() over (partition by Emp_Id order by rowid)
rank_n, rowid as "rowid" |
|
06 |
from
dup_test |
07 |
)
|
|
08 |
) |
09 |
where
rank_n > 1 |
|
10 |
);
|
The Oracle DUAL table
The DUAL Dummy table (as it is sometimes called) is an
automatically-generated table assigned to SYS, but accessible to all users. It
has a single column “DUMMY” of type VARCHAR2(1) which has a single row with a
value of ‘X’.
SELECT * FROM DUAL;
D
-
X
D
-
X
DESC DUAL;
Name Null? Type
—————————————————————————-
DUMMY VARCHAR2(1)
Name Null? Type
—————————————————————————-
DUMMY VARCHAR2(1)
What is it used for?
It is useful because it always exists, and has a single row, which is handy
for select statements with constant expressions. You could just as easily do
this with any other table with a single row, but using DUAL makes it portable
among all Oracle installations.
SELECT 1+1 FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT USER FROM DUAL;
Why is it called “DUAL”?
The DUAL table was created by Chuck Weiss of Oracle corporation to provide
a table for joining in internal views:
“I created the DUAL table as an underlying object
in the Oracle Data Dictionary. It was never meant to be seen itself, but
instead used inside a view that was expected to be queried. The idea was that
you could do a JOIN to the DUAL table and create two rows in the result for
every one row in your table. Then, by using GROUP BY, the resulting join could
be summarized to show the amount of storage for the DATA extent and for the
INDEX extent(s). The name, DUAL, seemed apt for the process of creating a pair
of rows from just one.”
The original DUAL table had two rows in it (hence its name), but
subsequently it only had one row.
Exception Handling in Oracle
What is Exception Handling?
PL/SQL provides a feature to handle the Exceptions which
occur in a PL/SQL Block known as exception Handling. Using Exception Handling
we can test the code and avoid it from exiting abruptly.
An exception is an identifier in PL/SQL that is raised
during the execution of a block that terminates its main body of actions. A
block always terminates when PL/SQL raises an exception, but can you specify an
exception handler to perform final actions.
Types of Exception
There are 3 types of Exceptions.
a) Named System Exceptions
b) Unnamed System Exceptions
c) User-defined Exceptions
b) Unnamed System Exceptions
c) User-defined Exceptions
Named System Exceptions (or Predefined Oracle Server
Exceptions) and Unnamed System Exceptions (or Nonpredefined Oracle Server
Exceptions) are implicitly raised.
User-defined Exceptions are explicitly raised
DECLARE |
||
02 |
Declaration
section |
|
03 |
BEGIN |
|
04 |
Exception
section |
05 |
EXCEPTION
|
|
06 |
WHEN
ex_name1 THEN |
07 |
-Error handling statements
|
|
08 |
WHEN
ex_name2 THEN |
09 |
-Error handling statements
|
|
10 |
WHEN
Others THEN |
11 |
-Error handling statements
|
|
12 |
END; |
You can trap any error by including a corresponding
routine within the exception handling section of the PL/SQL block. Each handler
consists of a WHEN clause, which specifies an exception, followed by a sequence
of statements to be executed when that exception is raised.
The exception-handling section traps only those
exceptions that are specified; any other exceptions are not trapped unless you
use the OTHERS exception handler.
Exceptions Trapping Rules:
- Begin the exception-handling section of the block with the EXCEPTION keyword.
- You can define several exception handlers, each with its own set of actions, for the block.
- When an exception occurs, PL/SQL processes only one handler before leaving the block.
- Place the OTHERS clause after all other exception-handling clauses.
- WHEN OTHERS is the last clause and you can have only one OTHERS clause.
a) Named System Exceptions
System exceptions are automatically raised by Oracle,
when a program violates a RDBMS rule. There are some system exceptions which
are raised frequently, so they are pre-defined and given a name in Oracle which
are known as Named System Exceptions.
Few Predefined Exceptions:
- NO_DATA_FOUND (ORA-01403) — When a SELECT…INTO clause does not return any row from a table.
- TOO_MANY_ROWS (ORA-01422) — When you SELECT or fetch more than one row into a record or variable.
- ZERO_DIVIDE (ORA-01476) — When you attempt to divide a number by zero.
- CURSOR_ALREADY_OPEN (ORA-06511) — You tried to open a cursor that is already open.
- INVALID_CURSOR (ORA-01001) — Illegal cursor operation occurred. You tried to reference a cursor that does not yet exist. This may have happened because you’ve executed a FETCH cursor or CLOSE cursor before Opening the cursor.
- INVALID_NUMBER (ORA-01722) — You tried to execute an SQL statement that tried to convert a string to a number, but it was unsuccessful.
- DUP_VAL_ON_INDEX (ORA-00001) — Attempted to insert a duplicate value.
- LOGIN_DENIED (ORA-01017) — You tried to log into Oracle with an invalid username/password combination.
- NOT_LOGGED_ON (ORA-01012) — You tried to execute a call to Oracle before logging in.
- VALUE_ERROR (ORA-06502) — You tried to perform an operation and there was an error on a conversion, truncation, or invalid constraining of numeric or character data.
BEGIN |
||
2 |
Execution
section |
|
3 |
EXCEPTION
|
|
4 |
WHEN
NO_DATA_FOUND THEN |
5 |
dbms_output.put_line ('A
SELECT...INTO did not return any row.' ); |
|
6 |
END; |
Unnamed System Exceptions
Those system exception for which oracle does not provide
a name is known as unnamed system exception. These exceptions do not occur
frequently. These Exceptions have a code and an associated message.
There are two ways to handle unnamed system exceptions:
1. By using the WHEN OTHERS exception handler, or
2. By associating the exception code to a name and using it as a named exception.
1. By using the WHEN OTHERS exception handler, or
2. By associating the exception code to a name and using it as a named exception.
We can assign a name to unnamed system exceptions using a
Pragma called EXCEPTION_INIT. EXCEPTION_INIT
will associate a predefined Oracle error number to a programmer defined
exception name.
Steps to be followed to use unnamed system exceptions are
- They are raised implicitly.
- If they are not handled in WHEN Others they must be handled explicitly.
- To handle the exception explicitly, they must be declared using Pragma EXCEPTION_INIT as given above and handled referencing the user-defined exception name in the exception section.
DECLARE |
||
02 |
exception_name
EXCEPTION; |
|
03 |
PRAGMA |
|
04 |
EXCEPTION_INIT
(exception_name, Err_code); |
05 |
BEGIN |
|
06 |
Execution
section |
07 |
EXCEPTION
|
|
08 |
WHEN
exception_name THEN |
09 |
Handle the exception |
|
10 |
END; |
For Example:
Let’s trap for Oracle server error number –2292, which is
an integrity constraint violation.
1] Declare the name for the exception within the
declarative section.
exception EXCEPTION;
Where: exception is the name of the exception.
2.] Associate the declared exception with the standard
Oracle server error number using the
PRAGMA EXCEPTION_INIT statement.
PRAGMA EXCEPTION_INIT(exception, error_number);
Where: exception is the previously declared
exception.
error_number is a standard Oracle Server error
number.
3] Reference the declared exception within the
corresponding exception-handling routine
DEFINE p_deptno = 10 |
||
02 |
DECLARE |
03 |
e_emps_remaining
EXCEPTION; |
|
04 |
PRAGMA
EXCEPTION_INIT(e_emps_remaining, -2292); |
05 |
BEGIN |
|
06 |
DELETE
FROM departments |
07 |
WHERE
department_id = &p_deptno; |
|
08 |
COMMIT;
|
09 |
EXCEPTION |
|
10 |
WHEN
e_emps_remaining THEN |
11 |
DBMS_OUTPUT.PUT_LINE
('Cannot remove dept ' || |
|
12 |
TO_CHAR(&p_deptno)
|| '. Employees exist. '); |
13 |
END; |
User-defined Exceptions
Apart from system exceptions we can explicitly define
exceptions based on business rules. These are known as user-defined exceptions.
Steps to be followed to use user-defined exceptions:
• They should be explicitly declared in the declaration section.
• They should be explicitly raised in the Execution Section.
• They should be handled by referencing the user-defined exception name in the exception section.
• They should be explicitly declared in the declaration section.
• They should be explicitly raised in the Execution Section.
• They should be handled by referencing the user-defined exception name in the exception section.
DECLARE |
||
02 |
e_invalid_department
EXCEPTION; |
|
03 |
BEGIN |
|
04 |
UPDATE
departments |
05 |
SET
department_name = '&p_department_desc' |
|
06 |
WHERE
department_id =
&p_department_number; |
07 |
IF SQL%NOTFOUND THEN |
|
08 |
RAISE
e_invalid_department; |
09 |
END
IF; |
|
10 |
COMMIT;
|
11 |
EXCEPTION
|
|
12 |
WHEN
e_invalid_department THEN |
13 |
DBMS_OUTPUT.PUT_LINE('No
such department id.' ); |
|
14 |
END; |
Functions for Trapping Exceptions:
When an exception occurs, you can identify the associated
error code or error message by using two functions. Based on the values of the
code or message, you can decide which subsequent action to take based on the
error.
• SQLCODE: Returns the numeric value for
the error code.
• SQLERRM: Returns the message
associated with the error number.
You cannot use SQLCODE or SQLERRM directly in a SQL
statement. Instead, you must assign their values to local variables, then use
the variables in the SQL statement, as shown in the following example:
DECLARE |
||
02 |
err_num
NUMBER; |
|
03 |
err_msg VARCHAR2(100); |
|
04 |
BEGIN |
05 |
... |
|
06 |
EXCEPTION |
07 |
... |
|
08 |
WHEN
OTHERS THEN |
09 |
err_num := SQLCODE; |
|
10 |
err_msg
:= SUBSTR(SQLERRM, 1, 100); |
11 |
INSERT
INTO errors VALUES
(err_num, err_msg); |
|
12 |
END; |
RAISE_APPLICATION_ERROR ( ) :
RAISE_APPLICATION_ERROR is a built-in procedure in
oracle which is used to display the user-defined error messages along with the
error number whose range is in between -20000 and -20999.
Whenever a message is displayed using
RAISE_APPLICATION_ERROR, all previous transactions which are not committed
within the PL/SQL Block are rolled back automatically (i.e. change due to
INSERT, UPDATE, or DELETE statements).
RAISE_APPLICATION_ERROR raises an exception but does not
handle it.
RAISE_APPLICATION_ERROR is used for the following
reasons,
a) to create a unique id for an user-defined exception.
b) to make the user-defined exception look like an Oracle error.
a) to create a unique id for an user-defined exception.
b) to make the user-defined exception look like an Oracle error.
The General Syntax to use this procedure is:
RAISE_APPLICATION_ERROR
(error_number, error_message);
The Error number must be between -20000 and -20999
• The Error_message is the message you want to display when the error occurs.
• The Error_message is the message you want to display when the error occurs.
RAISE_APPLICATION_ERROR can be used in either (or both)
the executable section and the exception section of a PL/SQL program. The
returned error is consistent with how the Oracle server produces a predefined,
nonpredefined, or user-defined error. The error number and message is displayed
to the user.
BEGIN |
||
2 |
... |
3 |
DELETE FROM employees |
|
4 |
WHERE manager_id = v_mgr; |
5 |
IF SQL%NOTFOUND THEN |
|
6 |
RAISE_APPLICATION_ERROR
(-20202,'This is not a valid manager'); |
7 |
END IF; |
|
8 |
... |
What is Exception propagation in
Oracle?
Exceptions which are not handled in a sub block get
propagated to the outer block. When an exception occurs, it terminates from the
line where the exception occurs and the control goes to the calling program or
the next outer block. If not handled in the outer block, it terminates that
block and propagates to the next outer block and so on. And, if exception
occurs in the outermost block, then the whole program gets terminated.
No comments:
Post a Comment