Using the FORALL statement v17
You can use collections to process DML commands more efficiently by passing all the values to be used for repetitive execution of a INSERT
, UPDATE
, DELETE
, or MERGE
command in one pass to the database server. The alternative is to reiteratively invoke the DML command with new values. Specify the DML command to process this way with the FORALL
statement. In addition, provide one or more collections in the DML command where you want to substitute different values each time the command is executed.
Syntax
index
is the position in the collection given in the insert_stmt
, update_stmt
, delete_stmt
, or merge_stmt
DML command that iterates from the integer value given as lower_bound
up to and including upper_bound.
Optionally, SAVE EXCEPTIONS
allows a FORALL statement to continue even if any of the DML statements fail. When a DML statement fails, SPL doesn't raise an exception, it saves information about the failure. After the FORALL statement completes, SPL raises a single exception for the FORALL statement. The error information is stored in the collection of records called SQL%BULK_EXCEPTIONS
, where:
SQL%BULK_EXCEPTIONS(i).ERROR_INDEX
records the nth number of the DML statement that failed.SQL%BULK_EXCEPTIONS(i).ERROR_CODE
records the database error code for the failure.SQL%BULK_EXCEPTIONS.COUNT
records the total number of the DML statements that failed.
How it works
If an exception occurs during any iteration of the FORALL
statement, all updates that occurred since the start of the execution of the FORALL
statement are rolled back.
Note
This behavior isn't compatible with Oracle databases. Oracle allows explicit use of the COMMIT
or ROLLBACK
commands to control whether to commit or roll back updates that occurred prior to the exception.
The FORALL
statement creates a loop. Each iteration of the loop increments the index
variable. You typically use the index
in the loop to select a member of a collection. Control the number of iterations with the lower_bound .. upper_bound
clause. The loop executes once for each integer between the lower_bound
and upper_bound
(inclusive), and the index increments by one for each iteration.
For example:
FORALL i IN 2 .. 5
This expression creates a loop that executes four times. In the first iteration, index (i)
is set to the value 2
. In the second iteration, the index is set to the value 3
, and so on. The loop executes for the value 5
and then terminates.
Using FORALL with CREATE
This example creates a table emp_copy
that's an empty copy of the emp
table. The example declares a type emp_tbl
that's an array. Each element in the array is of composite type, composed of the column definitions used to create the table emp
. The example also creates an index on the emp_tbl
type.
t_emp
is an associative array of type emp_tbl
. The SELECT
statement uses the BULK COLLECT INTO
command to populate the t_emp
array. After the t_emp
array is populated, the FORALL
statement iterates through the values (i)
in the t_emp
array index and inserts a row for each record into emp_copy
.
Using FORALL with UPDATE
This example uses a FORALL
statement to update the salary of three employees:
Using FORALL with DELETE
This example deletes three employees in a FORALL
statement:
Using FORALL with MERGE
This example merges (inserts and updates) the records of test_table2 using FORALL
statement:
Using FORALL with SAVE EXCEPTIONS
This example shows how to use the SAVE EXCEPTIONS
clause with the FORALL
statement: