个性化阅读
专注于IT技术分析

PL-SQL游标

本文概要

当处理一个SQL语句中,Oracle创建称为上下文区域的存储区域。游标是一个指向这个上下文区域。它包含加工所需的声明的所有信息。在PL / SQL,上下文区域由游标控制。游标包含一个select语句,并通过它访问的数据行的信息。

游标被用于称为一个程序来读取和处理在同一时间由SQL语句,一个返回的行。有两种类型的游标:

  • 隐式游标
  • 显式游标

1)PL / SQL隐式游标

在执行SQL语句的隐式游标会自动通过Oracle生成,如果不使用显式游标的声明。

这些是默认创建的DML语句像INSERT,UPDATE,DELETE等被执行时处理语句。

ORCALE提供了一种称为隐式游标的属性来检查DML操作的状态某些属性。其中一些是:%FOUND,%NOTFOUND,%ROWCOUNT和%ISOPEN。

例如:当你执行像INSERT,UPDATE SQL语句,DELETE,那么游标属性告诉任何行是否会受到影响,有多少人受到影响。如果你在PL / SQL块运行SELECT INTO语句,隐式游标属性可以用来找出是否有任何行已被SELECT语句返回。如果没有选定的数据将会返回一个错误。

下表soecifies游标,它的每一个属性的状态。

属性描述
%FOUND如果INSERT、DELETE和UPDATE等DML语句至少影响一行或多行,或者SELECT INTO语句返回一行或多行,则它的返回值为TRUE。否则返回FALSE。
%未找到如果INSERT、DELETE和UPDATE等DML语句不影响任何行,或者SELECT INTO语句不返回任何行,那么它的返回值为TRUE。否则返回FALSE。它与%正好相反。
%ISOPEN它总是返回隐式游标FALSE,因为SQL游标正在执行其相关的SQL语句后自动关闭。
%ROWCOUNT它返回受DML语句(如INSERT、DELETE和UPDATE)影响的行数,或SELECT INTO语句返回的行数。

PL / SQL隐式游标实施例

创建客户表,并有记录:

ID名称年龄地址薪水
1Ramesh 23 Allahabad20000
2Suresh22坎普尔22000
3马赫什24Ghaziabad24000
4Chandan25Noida26000
Alex21巴黎28000
6苏尼塔20Delhi30000

让我们执行下面的程序通过5000更新每个客户的表,增加工资在这里,SQL%ROWCOUNT属性来确定受影响的行数:

创建过程:

DECLARE 
   total_rows number(2);
BEGIN
   UPDATE  customers
   SET salary = salary + 5000;
   IF sql%notfound THEN
      dbms_output.put_line('no customers updated');
   ELSIF sql%found THEN
      total_rows := sql%rowcount;
      dbms_output.put_line( total_rows || ' customers updated ');
   END IF; 
END;
/

输出:

6 customers updated
PL/SQL procedure successfully completed.

现在,如果你在客户表来检查的记录,你会发现,该行被更新。

select * from customers;
ID名称年龄地址薪水
1Ramesh 23 Allahabad25000
2Suresh22坎普尔27000
3马赫什24Ghaziabad29000
4Chandan25Noida31000
Alex21巴黎33000
6苏尼塔20Delhi35000

2)PL / SQL显式游标

显式游标由程序员定义,以获得对上下文区域更多的控制。这些游标应在PL / SQL块的声明部分来限定。它在返回多行SELECT语句创建的。

显式游标的语法

以下是创建一个显式游标的语法:

CURSOR cursor_name IS select_statement;;

步长

用显式游标工作时,你必须遵循这些步骤。

  1. 声明游标的内存初始化。
  2. 打开游标分配内存。
  3. 取游标检索数据。
  4. 关闭游标释放分配的内存。

1)声明游标

它定义了游标的名称和相关的SELECT语句。

语法显式游标decleration

CURSOR name IS
 SELECT statement;

2)打开游标

它是用来分配游标内存,可以很容易地获取由SQL语句转换为它返回的行。

语法游标打开:

OPEN cursor_name;

3)取游标

它用于在同一时间访问一个行。你可以从上面打开的游标如下读取行:

语法游标提取:

FETCH cursor_name INTO variable_list;

4)关闭游标

它是用来释放分配的内存。以下语法用于关闭上述打开的游标。

语法游标接近:

Close cursor_name;

PL / SQL显式游标示例

显式游标由程序员来获得对上下文区域更多的控制定义。它是在PL / SQL块的声明部分定义。它在返回多行SELECT语句创建的。

让我们举个例子来说明如何使用显式游标的。在这个例子中,我们使用的是已经创建CUSTOMERS表。

创建客户表,并有记录:

ID名称年龄地址薪水
1Ramesh 23 Allahabad20000
2Suresh22坎普尔22000
3马赫什24Ghaziabad24000
4Chandan25Noida26000
Alex21巴黎28000
6苏尼塔20Delhi30000

创建过程:

执行以下程序来检索客户的姓名和地址。

DECLARE
   c_id customers.id%type;
   c_name customers.name%type;
   c_addr customers.address%type;
   CURSOR c_customers is
      SELECT id,name,address FROM customers;
BEGIN
   OPEN c_customers;
   LOOP
      FETCH c_customers into c_id,c_name,c_addr;
      EXIT WHEN c_customers%notfound;
      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
   END LOOP;
   CLOSE c_customers;
END;
/

输出:

1  Ramesh  Allahabad
2  Suresh  Kanpur
3  Mahesh  Ghaziabad
4  Chandan  Noida
5  Alex  Paris
6  Sunita  Delhi
PL/SQL procedure successfully completed.
赞(0)
未经允许不得转载:srcmini » PL-SQL游标

相关推荐

评论 抢沙发

评论前必须登录!