PL / SQL - 游标

在本章中,我们将讨论PL/SQL中的游标. Oracle创建了一个内存区域,称为上下文区域,用于处理SQL语句,该语句包含处理语句所需的所有信息;例如,处理的行数等.

游标是指向此上下文区域的指针. PL/SQL通过游标控制上下文区域.游标保存SQL语句返回的行(一个或多个).游标所持有的行集称为活动集.

您可以命名游标,以便在程序中引用它来获取并处理SQL语句返回的行,一次一个.有两种类型的游标和减号;

  • 隐式游标

  • 显式游标

隐式游标

每当执行SQL语句时,当没有明确的游标时,Oracle会自动创建隐式游标.声明.程序员无法控制隐式游标及其中的信息.

每当发出DML语句(INSERT,UPDATE和DELETE)时,隐式游标都与此语句相关联.对于INSERT操作,游标保存需要插入的数据.对于UPDATE和DELETE操作,游标标识将受影响的行.

在PL/SQL中,您可以将最新的隐式游标称为 SQL游标,它总是具有%FOUND,%ISOPEN,%NOTFOUND %ROWCOUNT 等属性. SQL游标具有其他属性,%BULK_ROWCOUNT %BULK_EXCEPTIONS ,旨在与 FORALL 语句一起使用.下表提供了最常用属性的描述 :

S.No属性&描述
1

%FOUND

如果INSERT,UPDATE或DELETE语句影响一行或多行或返回SELECT INTO语句,则返回TRUE一行或多行.否则,它返回FALSE.

2

%NOTFOUND

%FOUND的逻辑相反.如果INSERT,UPDATE或DELETE语句不影响任何行,或者SELECT INTO语句未返回任何行,则返回TRUE.否则,它返回FALSE.

3

%ISOPEN

对于隐式游标,始终返回FALSE,因为Oracle关闭了SQL游标执行相关的SQL语句后自动执行.

4

%ROWCOUNT

返回受INSERT,UPDATE影响的行数,或DELETE语句,或由SELECT INTO语句返回.

任何SQL游标属性都将是作为 sql%attribute_name 访问,如下例所示.

示例

我们将使用CUSTOMERS表我们已经在前面的章节中创建和使用过.

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

以下程序将更新表并将每位客户的工资提高500,并使用 SQL%ROWCOUNT 属性来确定受影响的行数 :

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

当在SQL提示符下执行上述代码时,它会产生以下结果 :

6 customers selected  

PL/SQL procedure successfully completed.

如果您检查customers表中的记录,您会发现行已更新并减去;

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2500.00 | 
|  2 | Khilan   |  25 | Delhi     |  2000.00 | 
|  3 | kaushik  |  23 | Kota      |  2500.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7000.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9000.00 | 
|  6 | Komal    |  22 | MP        |  5000.00 | 
+----+----------+-----+-----------+----------+

显式游标

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

创建显式游标的语法是 :

CURSOR cursor_name IS select_statement;

使用显式游标包括以下步骤 :

  • 声明用于初始化内存的游标

  • 打开用于分配内存的游标

  • 获取光标以检索数据

  • 关闭光标以释放分配的内存

声明光标

声明光标使用名称和关联的SELECT语句定义游标.例如 :

CURSOR c_customers IS 
   SELECT id, name, address FROM customers;

打开光标

打开光标为光标分配内存并准备好获取返回的行通过SQL语句进入它.例如,我们将打开上面定义的游标,如下所示 :

OPEN c_customers;

获取光标

获取光标涉及一次访问一行.例如,我们将从上面打开的游标中获取行,如下所示;

FETCH c_customers INTO c_id, c_name, c_addr;

关闭光标

关闭光标意味着释放已分配的内存.例如,我们将关闭上面打开的游标,如下所示;

CLOSE c_customers;

示例

以下是一个完整的示例,用于说明显式游标和minua的概念;

DECLARE 
   c_id customers.id%type; 
   c_name customerS.No.ame%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; 
/

当在SQL提示符下执行上述代码时,它会产生以下结果 :

 
 1 Ramesh Ahmedabad 
 2 Khilan Delhi 
 3 kaushik Kota 
 4 Chaitali Mumbai 
 5 Hardik Bhopal 
 6 Komal MP 
 PL/SQL程序成功完成.