CodeSnip: Using Dynamic Cursor in a Procedure Using Oracle 9i
 
Published: 21 May 2008
Abstract
In this code snippet, Deepankar examines the usage of dynamic cursors in a procedure where the table name is passed as an input parameter. After listing the SQL code sample, he analyzes it and then provides a screenshot of the final output.
by Deepankar Sarangi
Feedback
Average Rating: This article has not yet been rated.
Views (Total / Last 10 Days): 22443/ 36

Introduction

When the table to be used inside a cursor is not known to the user while creating the procedure, a ref cursor can be used to pass the name of the table dynamically as the input parameter to the procedure. The procedure also serves the purpose of being used again and again for many different tables of similar type as per the business requirement.

Requirements

Oracle database 9i

Code

Listing 1

CREATE OR REPLACE
PROCEDURE referenced_cursor_p (in_table_nm IN VARCHAR2, in_job_name IN VARCHAR2)
as
       TYPE CUR_TYPE             IS REF CURSOR;
       managers                  CUR_TYPE;
       manager_name              VARCHAR2 (20);
       sql_stmt                  VARCHAR2 (200);
       job_name                  VARCHAR2 (20):=in_job_name;
BEGIN 
 
       /*Use of cursor in selecting the SALES Guys*/
       sql_stmt := 
'SELECT distinct ENAME FROM '||in_table_nm||' WHERE JOB ='''||job_name||'''';
       dbms_output.put_line('Use of cursor in selecting the Managers');
/*Opened the ref cursor where the table name is passed dynamically through a string*/
       Open managers for sql_stmt;
       loop
       FETCH managers INTO manager_name;
       EXIT WHEN managers%NOTFOUND;
       dbms_output.put_line(manager_name||' is a Manager');
       end loop;
END referenced_cursor_p;
Analysis

Here in the code section we have tried to select records from a table called EMP through a ref cursor. The string that selects the records for the cursor has been dynamically built up as per the choice of table name and the selection criteria.

This kind of cursor declaration is not possible with the knowledge of simple cursor where especially the table name is either not known or cannot be hard coded due to business requirements.

Also, this kind of cursor declaration makes the code reusable and more efficient.

Execution output

Figure 1

By applying a different table name with the kind of selection criteria we can fetch a different set of records using the same procedure.

Conclusion

By following the mentioned approach the user can use same procedure multiple times for a different set of tables again and again. The user also does not have to bother about the table name while declaring the cursor.



User Comments

Title: Auther   
Name: Deepankar Sarangi
Date: 2009-06-13 2:45:20 AM
Comment:
Hi Andrew,
In case you do not know the column(s) name in advance and wish to pass the column name dynamically just like the table name and job name you have to pass another in parameter carrying the column name.
Then your dynamic query would look as given below.

sql_stmt := 'SELECT distinct '||in_column_nm||' FROM '||in_table_nm||' WHERE JOB ='''||job_name||'''';

plz let me know in case any issue.....
Title: listing Table Contents   
Name: Andrew Snowball
Date: 2009-06-11 7:01:29 PM
Comment:
But what if you don't know the columns in the table(s).
This example only works if you know that whatever table you use will always contain a column named "ename"...

I need to extract data without knowing the columns.

~AS.
Title: Passing Table from .Net   
Name: Jegan
Date: 2008-05-30 1:42:32 AM
Comment:
Hi Deepankar Sarangi

This is goood,now i wanted to pass datatable from .Net to oracle stored procedure.
Pls reply

Jegan






Community Advice: ASP | SQL | XML | Regular Expressions | Windows


©Copyright 1998-2024 ASPAlliance.com  |  Page Processed at 2024-04-26 5:45:59 PM  AspAlliance Recent Articles RSS Feed
About ASPAlliance | Newsgroups | Advertise | Authors | Email Lists | Feedback | Link To Us | Privacy | Search