TheDeveloperBlog.com

Home | Contact Us

C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML

Oracle Cursor

Oracle cursor for beginners and professionals with examples on insert, select, update, delete, table, view, join, key, functions, procedures, indexes, cursor etc.

<< Back to ORACLE

Oracle Cursor

A cursor is a pointer to a private SQL area that stores information about the processing of a SELECT or DML statements like INSERT, UPDATE, DELETE or MERGE.

Cursor is a mechanism which facilitates you to assign a name to a SELECT statement and manipulate the information within that SQL statement.

How to declare cursor

Syntax

CURSOR cursor_name
IS
  SELECT_statement; 

Let's see how to define a cursor called c1. We are using a table name "course" having columns "course_id" and "course_name".

Example

CURSOR c1
IS
  SELECT course_id
  FROM courses
  WHERE course_name = name_in;

In the above example, the result set of this cursor is all course_id whose course_name matches the variable called name_in.

How to use cursor in a function

Example

CREATE OR REPLACE Function FindCourse
   ( name_in IN varchar2 )
   RETURN number
IS
 cnumber number;
CURSOR c1
   IS
     SELECT course_id
     FROM courses
     WHERE course_name = name_in;
BEGIN
 OPEN c1;
   FETCH c1 INTO cnumber;
 if c1%notfound then
      cnumber := 9999;
   end if;
 CLOSE c1;
RETURN cnumber;
END;

Output

Function created.
0.09 seconds

How to open a cursor

After the declaration of the cursor, you have to use the open statement to open the cursor.

Syntax

OPEN cursor_name;

Example

OPEN c1;

How to use open cursor in a function

This function specifies how to use the open statement.

Example

CREATE OR REPLACE Function FindCourse
  ( name_in IN varchar2 )
  RETURN number
IS
   cnumber number;
CURSOR c1
   IS
     SELECT course_id
     FROM courses
   WHERE course_name = name_in;
BEGIN
OPEN c1;
   FETCH c1 INTO cnumber;
if c1%notfound then
      cnumber := 9999;
 end if;
CLOSE c1;
RETURN cnumber;
END;

Output

Function created.
0.09 seconds

How to fetch rows from cursor

This statement is used after declaring and opening your cursor. It is used to fetch rows from cursor.

Syntax

FETCH cursor_name INTO variable_list; 

Parameters

1) cursor_name:It specifies the name of the cursor that you wish to fetch rows.

2) variable_list: It specifies the list of variables that you wish to store the cursor result set in.

Example:

Consider a cursor defined as

CURSOR c1
IS
   SELECT course_id
   FROM courses
   WHERE course_name = name_in;

Statement used for fetching data

FETCH c1 into cnumber;

Let's take an example to fetch course_id into the variable called cnumber.

CREATE OR REPLACE Function FindCourse
   ( name_in IN varchar2 )
   RETURN number
IS
   cnumber number;
 CURSOR c1
   IS
     SELECT course_id
     FROM courses
     WHERE course_name = name_in;
BEGIN
 OPEN c1;
   FETCH c1 INTO cnumber;
if c1%notfound then
  cnumber := 9999;
   end if;
 CLOSE c1;
RETURN cnumber;
END; 

How to close cursor

CLOSE statement is a final step and it is used to close the cursor once you have finished using it.

Syntax

CLOSE cursor_name;

Statement for closing cursor

CLOSE c1;

Example

The following example specifies how to close the cursor.

CREATE OR REPLACE Function FindCourse
   ( name_in IN varchar2 )
   RETURN number
IS
cnumber number;
CURSOR c1
   IS
     SELECT course_id
     FROM courses
     WHERE course_name = name_in;
BEGIN
OPEN c1;
   FETCH c1 INTO cnumber;
if c1%notfound then
      cnumber := 9999;
   end if;
CLOSE c1;
RETURN cnumber;
END;

Cursor within cursor

It is also possible to declare a cursor within a cursor. the following example specifies how to declare a cursor within a cursor.

In this example, there is a cursor named get_tables that retrieves the owner and table_name values. These values are then used in a second cursor called get_columns.

Example

CREATE OR REPLACE PROCEDURE MULTIPLE_CURSORS_PROC is
   v_owner varchar2(40);
   v_table_name varchar2(40);
   v_column_name varchar2(100);
   
   /* First cursor */
   CURSOR get_tables IS
     SELECT DISTINCT tbl.owner, tbl.table_name
     FROM all_tables tbl
     WHERE tbl.owner = 'SYSTEM';
     
   /* Second cursor */
   CURSOR get_columns IS
     SELECT DISTINCT col.column_name
     FROM all_tab_columns col
     WHERE col.owner = v_owner
     AND col.table_name = v_table_name;
     
   BEGIN
   
   -- Open first cursor
   OPEN get_tables;
   LOOP
      FETCH get_tables INTO v_owner, v_table_name;
      
      -- Open second cursor
      OPEN get_columns;
      LOOP
         FETCH get_columns INTO v_column_name;
      END LOOP;
     CLOSE get_columns;
    END LOOP;
   CLOSE get_tables;
  EXCEPTION
   WHEN OTHERS THEN
 raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end MULTIPLE_CURSORS_PROC;

Output

Procedure created.
0.16 seconds

Note: You have to continuously open and close the second cursor each time a new record is retrieved from the first cursor. That way, the second cursor will use the new variable values from the first cursor.

Next TopicOracle Trigger




Related Links:


Related Links

Adjectives Ado Ai Android Angular Antonyms Apache Articles Asp Autocad Automata Aws Azure Basic Binary Bitcoin Blockchain C Cassandra Change Coa Computer Control Cpp Create Creating C-Sharp Cyber Daa Data Dbms Deletion Devops Difference Discrete Es6 Ethical Examples Features Firebase Flutter Fs Git Go Hbase History Hive Hiveql How Html Idioms Insertion Installing Ios Java Joomla Js Kafka Kali Laravel Logical Machine Matlab Matrix Mongodb Mysql One Opencv Oracle Ordering Os Pandas Php Pig Pl Postgresql Powershell Prepositions Program Python React Ruby Scala Selecting Selenium Sentence Seo Sharepoint Software Spellings Spotting Spring Sql Sqlite Sqoop Svn Swift Synonyms Talend Testng Types Uml Unity Vbnet Verbal Webdriver What Wpf