CURSOR Handling in PLSQL
CURSOR Handling in PLSQL
CURSOR Handling in PLSQL
By
Parteek Bhatia
Assistant Professor
Dept of Comp Sc & Engg
Thapar University
Patiala
Definition
Implicit Cursors
Explicit Cursors
BEGIN
DELETE EMP WHERE EMPNO=&EMPNO;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE(‘RECORD NOT DELETED’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘RECORD DELETED’);
END IF;
END
DECLARE
N NUMBER;
BEGIN
DELETE EMP WHERE DEPTNO=&DEPTNO;
N:=SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE(‘TOTAL NUMBER OF RECORD
DELETED’ || N);
END;
OPEN <cursor-name>;
Fetch data from the cursor one row at a time into memory variables.
FETCH <cursor-name> INTO <variables>;
Process the data held in the memory variables as required using a
loop.
Exit from the loop after processing is complete.
Close the cursor
Close <cursor-name>;
DECLARE
CURSOR C1 IS SELECT EMPNO, ENAME, JOB FROM EMP WHERE
DEPTNO=10;
REC C1%ROWTYPE; /*rec is a row type variable for cursor c1 record,
containing empno, ename and job*/
BEGIN
OPEN C1;
LOOP
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO REC;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('EMPNO '||REC.EMPNO);
DBMS_OUTPUT.PUT_LINE('ENAME '||REC.ENAME);
DBMS_OUTPUT.PUT_LINE('JOB '||REC.JOB);
END LOOP;
CLOSE C1;
END;
Workshop on Advanced Databases,
Chitkara University, By Parteek Bhatia
Consider a PL/SQL code to display the employee number and name of top 5
highest paid employees.
DECLARE
EMPNAME EMP.ENAME%TYPE;
EMPSAL EMP.SAL%TYPE;
CURSOR TEMP1 IS SELECT ENAME, SAL FROM EMP ORDER BY
SAL DESC;
BEGIN
OPEN TEMP1;
LOOP
FETCH TEMP1 INTO EMPNAME, EMPSAL;
EXIT WHEN TEMP1%ROWCOUNT>5 OR TEMP1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(EMPNAME || EMPSAL);
END LOOP;
CLOSE TEMP1;
END;
DECLARE
CURSOR TEMP1 IS SELECT ENAME, SAL FROM EMP
ORDER BY SAL DESC;
BEGIN
FOR REC IN TEMP1 LOOP
EXIT WHEN TEMP1%ROWCOUNT>5;
DBMS_OUTPUT.PUT_LINE(REC.ENAME || REC.SAL);
END LOOP;
END;
Syntax:
To declare
CURSOR cursor_name (variable_name datatype) IS
<SELECT statement…>
To Open
OPEN cursor_name (value/variable/expression);
DECLARE
CURSOR C1 (d number) IS SELECT EMPNO, ENAME, JOB FROM EMP WHERE
DEPTNO=d;
REC C1%ROWTYPE; /*rec is a row type variable for cursor c1 record,
containing empno, ename and job*/
BEGIN
OPEN C1(&d);
LOOP
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO REC;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('EMPNO '||REC.EMPNO);
DBMS_OUTPUT.PUT_LINE('ENAME '||REC.ENAME);
DBMS_OUTPUT.PUT_LINE('JOB '||REC.JOB);
END LOOP;
CLOSE C1;
END;
Workshop on Advanced Databases,
Chitkara University, By Parteek Bhatia
Workshop on Advanced Databases,
Chitkara University, By Parteek Bhatia
Consider a PL/SQL code to display the empno, ename, job of employees of a
particular department number whose value is passed as a parameter.
With For Loop
DECLARE
CURSOR C1(d number) IS SELECT EMPNO, ENAME, JOB
FROM EMP WHERE DEPTNO=d;
BEGIN
FOR REC IN C1(&d) LOOP
DBMS_OUTPUT.PUT_LINE('EMPNO '||REC.EMPNO);
DBMS_OUTPUT.PUT_LINE('ENAME '||REC.ENAME);
DBMS_OUTPUT.PUT_LINE('JOB '||REC.JOB);
END LOOP;
END;