Cursor FOR UPDATE NOWAIT : Cursor for Update « Cursor « Oracle PL/SQL Tutorial






SQL>
SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
  2                    ENAME VARCHAR2(10),
  3                    JOB VARCHAR2(9),
  4                    MGR NUMBER(4),
  5                    HIREDATE DATE,
  6                    SAL NUMBER(7, 2),
  7                    COMM NUMBER(7, 2),
  8                    DEPTNO NUMBER(2));

Table created.

SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',    7902, TO_DATE('17-DEC-1980', 'DD-MON-YYYY'), 800, NULL, 20);

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'DD-MON-YYYY'), 1600, 300, 30);

1 row created.

SQL> INSERT INTO EMP VALUES (7521, 'WARD',  'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'DD-MON-YYYY'), 1250, 500, 30);

1 row created.

SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',  7839, TO_DATE('2-APR-1981',  'DD-MON-YYYY'), 2975, NULL, 20);

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-MON-YYYY'), 1250, 1400, 30);

1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON-YYYY'), 2850, NULL, 30);

1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON-YYYY'), 2450, NULL, 10);

1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON-YYYY'), 3000, NULL, 20);

1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MON-YYYY'), 5000, NULL, 10);

1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MON-YYYY'), 1500, 0, 30);

1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-YYYY'), 1100, NULL, 20);

1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YYYY'), 950, NULL, 30);

1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-YYYY'), 3000, NULL, 20);

1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON-YYYY'), 1300, NULL, 10);

1 row created.

SQL>
SQL>
SQL> DECLARE
  2     waitsecs CONSTANT PLS_INTEGER := 10;
  3
  4     CURSOR emp_cur IS SELECT ename, rowid FROM emp FOR UPDATE NOWAIT;
  5     emp_rec emp_cur%ROWTYPE;
  6
  7     resource_busy EXCEPTION;
  8     PRAGMA EXCEPTION_INIT (resource_busy, -54);
  9
 10     starttime PLS_INTEGER;
 11  BEGIN
 12     starttime := DBMS_UTILITY.GET_TIME;
 13     LOOP
 14        BEGIN
 15           OPEN emp_cur;
 16           EXIT;
 17        EXCEPTION
 18           WHEN resource_busy
 19           THEN
 20              IF DBMS_UTILITY.GET_TIME - starttime < waitsecs / 100
 21              THEN
 22                 DBMS_LOCK.SLEEP (1);
 23              ELSE
 24                 RAISE;
 25              END IF;
 26        END;
 27     END LOOP;
 28
 29     LOOP
 30        FETCH emp_cur INTO emp_rec;
 31        EXIT WHEN emp_cur%NOTFOUND;
 32        UPDATE emp SET sal = sal + 1000 WHERE ROWID = emp_rec.rowid;
 33     END LOOP;
 34
 35     CLOSE emp_cur;
 36     COMMIT;
 37  END;
 38  /

PL/SQL procedure successfully completed.

SQL>
SQL> drop table emp;

Table dropped.

SQL>
SQL>








25.10.Cursor for Update
25.10.1.Cursor for update
25.10.2.Using WHERE CURRENT OF
25.10.3.A complete example of using SELECT FOR UPDATE cursors
25.10.4.Cursor FOR UPDATE NOWAIT
25.10.5.Check error code and Raise the proper error