The PLS-00436 restriction has been removed, which means you
can now reference the individual elements of a collection within the SET and
WHERE clauses of a DML statement in a FORALL construct. To see this in action,
create and populates a test table using the following code.
CREATE TABLE forall_test (id NUMBER,
description VARCHAR2(50)
);
INSERT INTO forall_test VALUES (1, 'ONE');
INSERT INTO forall_test VALUES (2, 'TWO');
INSERT INTO forall_test VALUES (3, 'THREE');
INSERT INTO forall_test VALUES (4, 'FOUR');
INSERT INTO forall_test VALUES (5, 'FIVE');
COMMIT;
The PL/SQL block below populates a collection with the existing data, amends the data in the collection, then updates the table with the amended data. The final query displays the changed data in the table.
DECLARE
TYPE t_forall_test_tab IS TABLE OF forall_test%ROWTYPE;
l_tab t_forall_test_tab;
BEGIN
-- Retrieve the existing data into a collection.
SELECT *
BULK COLLECT INTO l_tab
FROM forall_test;
-- Alter the data in the collection.
FOR i IN l_tab.first .. l_tab.last LOOP
l_tab(i).description := 'Description for ' || i;
END LOOP;
-- Update the table using the collection.
FORALL i IN l_tab.first .. l_tab.last
UPDATE forall_test
SET description = l_tab(i).description
WHERE id = l_tab(i).id;
COMMIT;
END;
/
SELECT * FROM forall_test;
ID DESCRIPTION
---------- ---------------------------
1 Description for 1
2 Description for 2
3 Description for 3
4 Description for 4
5 Description for 5
5 rows selected.
Notice both the SET and WHERE clauses contain references to individual columns in the collection. This makes using bulk-binds for DML even easier as we no longer need to maintain multiple collections if we need to reference columns in the WHERE clause. It can also improve performance of updates, as previous versions required updates of the whole row using the ROW keyword, which included potentially unnecessary updates of primary key and foreign key columns.
No comments:
Post a Comment