Monday, March 18, 2019

WHERE CURRENT OF CLAUSE in Oracle

SQL> create table table_w(name varchar2(100),sal number);

Table created.

SQL> insert into table_w values('A',5000);

1 row created.

SQL> insert into table_w values('B',4000);

1 row created.

SQL> insert into table_w values('A',3000);

1 row created.

SQL> insert into table_w values('C',3000);

1 row created.

SQL> insert into table_w values('B',2000);

1 row created.

SQL> COMMIT;

Commit complete.


SQL> CREATE TABLE TABLE_W_BKP AS SELECT * FROM TABLE_W;

Table created.

                      
SET SERVEROUTPUT ON;
DECLARE
CURSOR C1 IS SELECT * FROM TABLE_W;
BEGIN
FOR I IN C1
LOOP
UPDATE TABLE_W SET SAL=SAL+1000 WHERE NAME=I.NAME;
COMMIT;
END LOOP;
END;
/                          

BEFORE :

SQL> SELECT * FROM TABLE_W;

NAME
                            SAL
--------------------------------------------------------------------
A
                           5000
B
                           4000
A
                           3000
C
                           3000
B
                           2000
                          
AFTER :

SQL> SELECT * FROM TABLE_W;

NAME                                      SAL
------------------------------------- ----------
A                                        7000
B                                        6000
A                                        5000
C                                        4000
B                                        4000

SET SERVEROUTPUT ON;
DECLARE
CURSOR C1 IS SELECT * FROM TABLE_W_BKP FOR UPDATE OF SAL NOWAIT;
BEGIN
FOR I IN C1
LOOP
UPDATE TABLE_W_BKP SET SAL=SAL+1000 WHERE CURRENT OF C1;
--OORA-01002: fetch out of sequence.-->If the cursor has been opened with the FOR UPDATE clause, fetching after a COMMIT has been issued --will return the error. Do not issue a COMMIT inside a fetch loop for a cursor that has been opened FOR UPDATE.
--COMMIT;
END LOOP;
COMMIT;
END;
/   

BEFORE :

SQL>  SELECT * FROM TABLE_W_BKP;    

NAME                                      SAL
------------------------------------- ----------
A                                        6000
B                                        4000
A                                        3000
C                                        3000
B                                        2000

AFTER :

SQL>  SELECT * FROM TABLE_W_BKP;

NAME                                      SAL
------------------------------------- ----------
A                                        7000
B                                        5000
A                                        4000
C                                        4000
B                                        3000

No comments:

Post a Comment

Delete Row Button to all records of Interactive Report in Oracle Apex

 1. add 'Delete' Del column to Report Query 2. Set the Following Properties for the DEL Column Type: Link Heading: Delete Targ...