Thursday, 6 December 2018

For Update

#---------------------------------------------------------------------------------
# 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;