PL/SQL Explicit Cursors

 

Explicit Cursors

An explicit cursor is defined in the declaration section of the PL/SQL Block. It iscreated on a SELECT Statement which returns more than one row. We can provide a suitable name for the cursor.

The General Syntax for creating a cursor is as given below:

CURSOR cursor_name IS select_statement;

  • cursor_name – A suitable name for the cursor.
  • select_statement – A select query which returns multiple rows.

How to use Explicit Cursor?


There are four steps in using an Explicit Cursor.
  • DECLARE the cursor in the declaration section.
  • OPEN the cursor in the Execution Section.
  • FETCH the data from cursor into PL/SQL variables or records in the Execution Section.
  • CLOSE the cursor in the Execution Section before you end the PL/SQL Block.

1) Declaring a Cursor in the Declaration Section:

   DECLARE
   CURSOR emp_cur IS 
   SELECT * 
   FROM emp_tbl
   WHERE salary > 5000; 

      In the above example we are creating a cursor ‘emp_cur’ on a query which returns the records of all the
      employees with salary greater than 5000. Here ‘emp_tbl’ in the table which contains records of all the
      employees.

2) Accessing the records in the cursor:
      Once the cursor is created in the declaration section we can access the cursor in the execution
      section of the PL/SQL program.

How to access an Explicit Cursor?

These are the three steps in accessing the cursor.
1) Open the cursor.
2) Fetch the records in the cursor one at a time.
3) Close the cursor.

General Syntax to open a cursor is:

OPEN cursor_name;

General Syntax to fetch records from a cursor is:

FETCH cursor_name INTO record_name;
OR
FETCH cursor_name INTO variable_list;

General Syntax to close a cursor is:

CLOSE cursor_name;

When a cursor is opened, the first row becomes the current row. When the data is fetched it is copied to the record or variables and the logical pointer moves to the next row and it becomes the current row. On every fetch statement, the pointer moves to the next row. If you want to fetch after the last row, the program will throw an error. When there is more than one row in a cursor we can use loops along with explicit cursor attributes to fetch all the records.

Points to remember while fetching a row:

· We can fetch the rows in a cursor to a PL/SQL Record or a list of variables created in the PL/SQL Block.
· If you are fetching a cursor to a PL/SQL Record, the record should have the same structure as the cursor.
· If you are fetching a cursor to a list of variables, the variables should be listed in the same order in the fetch statement as the columns are present in the cursor.

General Form of using an explicit cursor is:

 DECLARE
    variables;
    records;
    create a cursor;
 BEGIN 
   OPEN cursor;
   FETCH cursor;
     process the records;
   CLOSE cursor;
 END;

Lets Look at the example below

Example 1:

1> DECLARE 
2>    emp_rec emp_tbl%rowtype;
3>    CURSOR emp_cur IS 
4>    SELECT *
5>    FROM 
6>    WHERE salary > 10; 
7> BEGIN 
8>    OPEN emp_cur; 
9>    FETCH emp_cur INTO emp_rec; 
10>      dbms_output.put_line (emp_rec.first_name || '  ' || emp_rec.last_name); 
11>   CLOSE emp_cur; 
12> END; 

In the above example, first we are creating a record ‘emp_rec’ of the same structure as of table ‘emp_tbl’ in line no 2. We can also create a record with a cursor by replacing the table name with the cursor name. Second, we are declaring a cursor ‘emp_cur’ from a select query in line no 3 - 6. Third, we are opening the cursor in the execution section in line no 8. Fourth, we are fetching the cursor to the record in line no 9. Fifth, we are displaying the first_name and last_name of the employee in the record emp_rec in line no 10. Sixth, we are closing the cursor in line no 11.

What are Explicit Cursor Attributes?

Oracle provides some attributes known as Explicit Cursor Attributes to control the data processing while using cursors. We use these attributes to avoid errors while accessing cursors through OPEN, FETCH and CLOSE Statements.

When does an error occur while accessing an explicit cursor?

a) When we try to open a cursor which is not closed in the previous operation.
b) When we try to fetch a cursor after the last operation.

These are the attributes available to check the status of an explicit cursor.

Attributes

Return values

Example

%FOUND

TRUE, if fetch statement returns at least one row.

Cursor_name%FOUND

FALSE, if fetch statement doesn’t return a row.

%NOTFOUND

TRUE, , if fetch statement doesn’t return a row.Cursor_name%NOTFOUND
FALSE, if fetch statement returns at least one row.

%ROWCOUNT

The number of rows fetched by the fetch statement

Cursor_name%ROWCOUNT

If no row is returned, the PL/SQL statement returns an error.

%ISOPEN

TRUE, if the cursor is already open in the program

Cursor_name%ISNAME

FALSE, if the cursor is not opened in the program.

Using Loops with Explicit Cursors:

Oracle provides three types of cursors namely SIMPLE LOOP, WHILE LOOP and FOR LOOP. These loops can be used to process multiple rows in the cursor. Here I will modify the same example for each loops to explain how to use loops with cursors.

Cursor with a Simple Loop:
1> DECLARE 
2>   CURSOR emp_cur IS 
3>   SELECT first_name, last_name, salary FROM emp_tbl; 
4>   emp_rec emp_cur%rowtype; 
5> BEGIN 
6>   IF NOT sales_cur%ISOPEN THEN 
7>      OPEN sales_cur; 
8>   END IF; 
9>   LOOP 
10>     FETCH emp_cur INTO emp_rec; 
11>     EXIT WHEN emp_cur%NOTFOUND; 
12>     dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name 
13>     || ' ' ||emp_cur.salary); 
14>  END LOOP; 
15>  END; 
16>  / 

In the above example we are using two cursor attributes %ISOPEN and %NOTFOUND.
In line no 6, we are using the cursor attribute %ISOPEN to check if the cursor is open, if the condition is true the program does not open the cursor again, it directly moves to line no 9.
In line no 11, we are using the cursor attribute %NOTFOUND to check whether the fetch returned any row. If there is no rows found the program would exit, a condition which exists when you fetch the cursor after the last row, if there is a row found the program continues.

We can use %FOUND in place of %NOTFOUND and vice versa. If we do so, we need to reverse the logic of the program. So use these attributes in appropriate instances.

Cursor with a While Loop:

Lets modify the above program to use while loop.

1> DECLARE 
2>  CURSOR emp_cur IS 
3>  SELECT first_name, last_name, salary FROM emp_tbl; 
4>  emp_rec emp_cur%rowtype; 
5> BEGIN 
6>   IF NOT sales_cur%ISOPEN THEN 
7>      OPEN sales_cur; 
8>   END IF; 
9>   FETCH sales_cur INTO sales_rec;  
10>  WHILE sales_cur%FOUND THEN  
11>  LOOP 
12>    dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name 
13>    || ' ' ||emp_cur.salary); 
15>    FETCH sales_cur INTO sales_rec; 
16>  END LOOP; 
17> END; 
18> / 

In the above example, in line no 10 we are using %FOUND to evaluate if the first fetch statement in line no 9 returned a row, if true the program moves into the while loop. In the loop we use fetch statement again (line no 15) to process the next row. If the fetch statement is not executed once before the while loop the while condition will return false in the first instance and the while loop is skipped. In the loop, before fetching the record again, always process the record retrieved by the first fetch statement, else you will skip the first row.

Cursor with a FOR Loop:

When using FOR LOOP you need not declare a record or variables to store the cursor values, need not open, fetch and close the cursor. These functions are accomplished by the FOR LOOP automatically.

General Syntax for using FOR LOOP:

FOR record_name IN cusror_name 
LOOP 
    process the row...
END LOOP; 

Let’s use the above example to learn how to use for loops in cursors.

1> DECLARE 
2>  CURSOR emp_cur IS 
3>  SELECT first_name, last_name, salary FROM emp_tbl; 
4>  emp_rec emp_cur%rowtype; 
5> BEGIN 
6>  FOR emp_rec in sales_cur 
7>  LOOP  
8>  dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name 
9>    || ' ' ||emp_cur.salary);  
10> END LOOP; 
11>END;
12> /

In the above example, when the FOR loop is processed a record ‘emp_rec’of structure ‘emp_cur’ gets created, the cursor is opened, the rows are fetched to the record ‘emp_rec’ and the cursor is closed after the last row is processed. By using FOR Loop in your program, you can reduce the number of lines in the program.

NOTE: In the examples given above, we are using backward slash ‘/’ at the end of the program. This indicates the oracle engine that the PL/SQL program has ended and it can begin processing the statements.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值