Mega Code Archive

 
Categories / Oracle PLSQL Tutorial / PL SQL Programming
 

Use cursor variable in update statement

SQL> SQL> CREATE TABLE employee   2  (employee_id         NUMBER(7),   3   last_name           VARCHAR2(25),   4   first_name          VARCHAR2(25),   5   userid              VARCHAR2(8),   6   start_date          DATE,   7   comments            VARCHAR2(255),   8   manager_id          NUMBER(7),   9   title               VARCHAR2(25),  10   department_id       NUMBER(7),  11   salary              NUMBER(11, 2),  12   commission_pct      NUMBER(4, 2)  13  ); Table created. SQL> SQL> INSERT INTO employee VALUES (1, 'V', 'Ben', 'cv',to_date('03-MAR-90 8:30', 'dd-mon-yy hh24:mi'),NULL, NULL, 'PRESIDENT', 50, 2500, NULL); 1 row created. SQL> INSERT INTO employee VALUES (2, 'N', 'Haidy', 'ln', '08-MAR-90', NULL,1, 'VP, OPERATIONS', 41, 1450, NULL); 1 row created. SQL> INSERT INTO employee VALUES (3, 'N', 'Molly', 'mn', '17-JUN-91',NULL, 1, 'VP, SALES', 31, 1400, NULL); 1 row created. SQL> INSERT INTO employee VALUES (4, 'S', 'Mark', 'mq', '07-APR-90',NULL, 1, 'VP, FINANCE', 10, 1450, NULL); 1 row created. SQL> INSERT INTO employee VALUES (5, 'R', 'AUDRY', 'ar', '04-MAR-90',NULL, 1, 'VP, ADMINISTRATION', 50, 1550, NULL); 1 row created. SQL> INSERT INTO employee VALUES (6, 'U', 'MOLLY', 'mu', '18-JAN-91',NULL, 2, 'WAREHOUSE MANAGER', 41, 1200, NULL); 1 row created. SQL> INSERT INTO employee VALUES (7, 'M', 'ROBERTA', 'rm', '14-MAY-90',NULL, 2, 'WAREHOUSE MANAGER', 41, 1250, NULL); 1 row created. SQL> INSERT INTO employee VALUES (8, 'B', 'BEN', 'ry', '07-APR-90', NULL, 2,'WAREHOUSE MANAGER', 41, 1100, NULL); 1 row created. SQL> INSERT INTO employee VALUES (9, 'C', 'Jane', 'ac', '09-FEB-92',NULL, 2, 'WAREHOUSE MANAGER', 41, 1300, NULL); 1 row created. SQL> INSERT INTO employee VALUES (10, 'H', 'Mart', 'mh', '27-FEB-91', NULL, 2,'WAREHOUSE MANAGER', 41, 1307, NULL); 1 row created. SQL> SQL> DECLARE   2     CURSOR empCursor IS   3        SELECT employee_id, department_id, NVL(salary,0) salary, ROWID   4        FROM   employee;   5     lv_record_num PLS_INTEGER DEFAULT 0;   6  BEGIN   7     FOR empRecord IN empCursor LOOP   8        lv_record_num := lv_record_num + 1;   9       IF empRecord.department_id = 10 OR  10          empRecord.department_id = 41 THEN  11           IF empRecord.salary > 1000 THEN  12              empRecord.salary := empRecord.salary * 1.05;  13           ELSE  14              empRecord.salary := empRecord.salary * 1.10;  15           END IF;  16        ELSIF empRecord.department_id = 31 THEN  17           IF empRecord.salary > 1400 THEN  18              empRecord.salary := empRecord.salary * 1.05;  19           ELSE  20              empRecord.salary := empRecord.salary * 1.10;  21           END IF;  22        ELSIF empRecord.department_id = 50 THEN  23           IF empRecord.salary > 2000 THEN  24              empRecord.salary := empRecord.salary * 1.05;  25           ELSE  26              empRecord.salary := empRecord.salary * 1.10;  27           END IF;  28        END IF;  29        UPDATE employee  30        SET    salary = empRecord.salary  31        WHERE  rowid  = empRecord.ROWID;  32     DBMS_OUTPUT.PUT_LINE(' Employee: '   || empRecord.employee_id  ||  33        ' Department: ' || empRecord.department_id ||' New Salary: ' ||  34        to_char(empRecord.salary, '$999,999.99'));  35     END LOOP;  36     COMMIT;  37     DBMS_OUTPUT.PUT_LINE('Update Process Complete. ' ||  38        lv_record_num || ' Records Processed.');  39     EXCEPTION  40        WHEN OTHERS THEN  41           DBMS_OUTPUT.PUT_LINE('Error on Record ' || lv_record_num ||  42           ': Update Process Aborted.');  43           ROLLBACK;  44  END;  45  / Employee: 1 Department: 50 New Salary:    $2,625.00 Employee: 2 Department: 41 New Salary:    $1,522.50 Employee: 3 Department: 31 New Salary:    $1,540.00 Employee: 4 Department: 10 New Salary:    $1,522.50 Employee: 5 Department: 50 New Salary:    $1,705.00 Employee: 6 Department: 41 New Salary:    $1,260.00 Employee: 7 Department: 41 New Salary:    $1,312.50 Employee: 8 Department: 41 New Salary:    $1,155.00 Employee: 9 Department: 41 New Salary:    $1,365.00 Employee: 10 Department: 41 New Salary:    $1,372.35 Update Process Complete. 10 Records Processed. PL/SQL procedure successfully completed. SQL> SQL> drop table employee; Table dropped. SQL>