PLSQL Cursors
-
Upload
spinnaresh -
Category
Technology
-
view
6.061 -
download
4
description
Transcript of PLSQL Cursors
PL/SQL Cursors
By Praveen & Naresh
What is Cursors ?
SQL: > SELECT * FROM employee;
Oracle RDBMS : Assigns a private work area for that stmt.
contd..
PL/SQL cursor is a mechanism by which
“ you can NAME that work area
and
manipulate the information within it”
Declare/Open/Fetch/Close
CURSOR emp_cur IS SELECT * FROM employee ;
Open emp_cur ;
Fetch emp_cur INTO emp_rec;
CLOSE emp_cur ;
Types of cursors
Two Types:
1) Implicit
2) Explicit
Cursor Attributes
Attribute:
%FOUND
%ISOPEN
%NOTFOUND
%ROWCOUNT
Implicit Cursors
• DML Statements• INSERT, UPDATE, DELETE• SELECT statement with INTO clause
Single Row Implicit Cursors
DECLARE
e_id employee.empid%TYPE;
e_name employee.empname%TYPE;
BEGIN
SELECT empid, empname INTO e_id, e_name
FROM employee where empid=23;
dbms_output.put_line( SQL%ROWCOUNT );
END;
/
Multiple Row Implicit Cursors(1)
BEGIN
UPDATE employee SET emp_sal= emp_sal + 5000
where emp_deptid=1;
IF SQL%FOUND THEN
dbms_output.put_line('Updated:'|| SQL%ROWCOUNT );
ELSE
dbms_output.put_line( 'Nothing Updated' );
END;
/
Multiple Row Implicit Cursors(2)
BEGIN
FOR e_cursor IN ( SELECT e_name FROM employee ) LOOP
dbms_output.put_line( e_cursor.e_name );
END LOOP;
END;
/
Cursor FOR Loop
Scope : Inside FOR Loop
Cursor Index : - a pointer to Query work area.- Query work area is a memory region ( context
area )
Note:SQL%ROWCOUNT attribute returns NULL.
Explicit Cursors
• Define inside declaration block• Static or dynamic SELECT stmt.• Open/Fetch/Close
Syntax
• OPEN cursor_name [ (param1 , param2 ,....) ]
• FETCH cursor_name INTO (variable1,variable2,....)
• FETCH cursor_name INTO record_variable;
• CLOSE cursor_name;
Static Explicit Cursors
• SQL SELECT – behavior doesn't change
Static CursorDECLARE
eid employee.empid%TYPE;
ename employee.empname%TYPE;
CURSOR cur IS
SELECT empid, empname FROM employee ;
BEGIN
OPEN cur ;
LOOP
FETCH cur INTO eid , ename;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line( 'NAME' || cur.ename );
END LOOP;
CLOSE cur ;
END;
/
Eg- Cursor For LoopDECLARE
CURSOR C IS
SELECT empid AS eid , empname AS ename FROM employee ;
BEGIN
FOR i IN C LOOP
dbms_output.put_line( 'NAME' || i.ename );
END LOOP;
END;
/
Static Cursor( Record)DECLARE
TYPE emp_record IS RECORD ( eid NUMBER, ename VARCHAR2(30) );
employee EMP_RECORD;
CURSOR cur IS SELECT empid, empname FROM employee ;
BEGIN
OPEN cur ;
LOOP
FETCH cur INTO employee;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line( 'NAME' || employee.ename );
END LOOP;
CLOSE cur ;
END;
/
Static Cursor( Record+FOR Loop)
DECLARE
TYPE emp_record IS RECORD ( eid NUMBER, ename VARCHAR2(30) );
explicit_employee EMP_RECORD;
CURSOR cur IS SELECT empid, empname FROM employee ;
BEGIN
FOR i IN cur LOOP
explicit_employee := i;
dbms_output.put_line( 'NAME' || explicit_employee.ename );
END LOOP;
END;
/
Note: No Data Found , No error is raised
Static Cursor( No rows)DECLARE
TYPE emp_record IS RECORD ( eid NUMBER, ename VARCHAR2(30) );
employee EMP_RECORD;
CURSOR cur IS SELECT empid, empname FROM employee where empid = -1 ;
BEGIN
OPEN cur ;
LOOP
FETCH cur INTO employee;
IF cur%NOTFOUND THEN
IF cur%ROWCOUNT = 0 THEN
dbms_output.put_line( 'No Data Found' );
END IF;
EXIT;
ELSE
dbms_output.put_line( 'NAME' || employee.ename );
END IF;
END LOOP;
CLOSE cur ;
END;
/
Thanks