#---------------------------------------------------------------------------------
# FOR_UPDATE
#---------------------------------------------------------------------------------
-- We cursor to update/delete the current row
--cursor must be for update.
--cursor must be open.
--if cursor is not open, this clause causes error.
--for update (of column.name)(no wait);
--if lock rows before you update or delete rows(nowait) returns an oracle error if the rows are locked by another session
--it tells oracle not to wait if requested rows have been locked by another user.
DECLARE
CURSOR XX_CUR IS SELECT ENAME, SAL FROM EMP;
FOR UPDATE OF SAL NOWAIT;
BEGIN
FOR i IN XX_CUR
LOOP
IF XX_CUR.SAL<5000 THEN
UPDATE EMP SET SAL =i.SAL*2
WHERE CURRENT OF XX_CUR;
END IF;
END LOOP;
END;
DECLARE
TYPE typ_all_objects IS TABLE OF all_objects%ROWTYPE;
tab_all_objects typ_all_objects;
CURSOR bulk_collect_limit is
SELECT * FROM all_objects;
BEGIN
OPEN bulk_collect_limit;
LOOP
FETCH bulk_collect_limit BULK COLLECT INTO tab_all_objects LIMIT 20000 ;
EXIT WHEN tab_all_objects.COUNT = 0;
-- processing codes
dbms_output.put_line(lpad(tab_all_objects.COUNT,5,' ') || ' Rows');
END LOOP;
CLOSE bulk_collect_limit;
END;
DECLARE
TYPE typ_all_objects IS TABLE OF all_objects%ROWTYPE;
tab_all_objects typ_all_objects := typ_all_objects();
l_start number;
BEGIN
l_start := dbms_utility.get_time;
FOR cur_rec IN (SELECT * FROM all_objects) LOOP
tab_all_objects.extend;
tab_all_objects(tab_all_objects.last) := cur_rec;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Simple Cursor took '|| (dbms_utility.get_time - l_start) ||
' to process '|| tab_all_objects.count||' rows; ');
l_start := dbms_utility.get_time;
SELECT *
BULK COLLECT INTO
tab_all_objects
FROM all_objects;
DBMS_OUTPUT.PUT_LINE('Bulk Collect took '|| (dbms_utility.get_time - l_start) ||
' to process '|| tab_all_objects.count||' rows; ');
END;
# FOR_UPDATE
#---------------------------------------------------------------------------------
-- We cursor to update/delete the current row
--cursor must be for update.
--cursor must be open.
--if cursor is not open, this clause causes error.
--for update (of column.name)(no wait);
--if lock rows before you update or delete rows(nowait) returns an oracle error if the rows are locked by another session
--it tells oracle not to wait if requested rows have been locked by another user.
DECLARE
CURSOR XX_CUR IS SELECT ENAME, SAL FROM EMP;
FOR UPDATE OF SAL NOWAIT;
BEGIN
FOR i IN XX_CUR
LOOP
IF XX_CUR.SAL<5000 THEN
UPDATE EMP SET SAL =i.SAL*2
WHERE CURRENT OF XX_CUR;
END IF;
END LOOP;
END;
DECLARE
TYPE typ_all_objects IS TABLE OF all_objects%ROWTYPE;
tab_all_objects typ_all_objects;
CURSOR bulk_collect_limit is
SELECT * FROM all_objects;
BEGIN
OPEN bulk_collect_limit;
LOOP
FETCH bulk_collect_limit BULK COLLECT INTO tab_all_objects LIMIT 20000 ;
EXIT WHEN tab_all_objects.COUNT = 0;
-- processing codes
dbms_output.put_line(lpad(tab_all_objects.COUNT,5,' ') || ' Rows');
END LOOP;
CLOSE bulk_collect_limit;
END;
DECLARE
TYPE typ_all_objects IS TABLE OF all_objects%ROWTYPE;
tab_all_objects typ_all_objects := typ_all_objects();
l_start number;
BEGIN
l_start := dbms_utility.get_time;
FOR cur_rec IN (SELECT * FROM all_objects) LOOP
tab_all_objects.extend;
tab_all_objects(tab_all_objects.last) := cur_rec;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Simple Cursor took '|| (dbms_utility.get_time - l_start) ||
' to process '|| tab_all_objects.count||' rows; ');
l_start := dbms_utility.get_time;
SELECT *
BULK COLLECT INTO
tab_all_objects
FROM all_objects;
DBMS_OUTPUT.PUT_LINE('Bulk Collect took '|| (dbms_utility.get_time - l_start) ||
' to process '|| tab_all_objects.count||' rows; ');
END;