PL / SQL游标
甲骨文创建的存储区,被称为上下文区域,用于处理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语句中使用。下表提供了最常用的属性的描述:
| 属性 | 描述 |
|---|---|
| %FOUND | 返回true如果一个INSERT,UPDATE或DELETE语句影响一个或多个行或SELECT INTO语句返回一行或多行。否则,它将返回FALSE。 |
| %未找到 | %的逻辑相反找到。它如果一个INSERT,UPDATE返回TRUE或DELETE语句影响任何行,或SELECT INTO语句返回任何行。否则,它将返回FALSE。 |
| %开了 | 始终返回FALSE的隐式游标,因为Oracle执行其相关的SQL语句之后自动关闭SQL游标。 |
| %ROWCOUNT | 返回受一个INSERT,UPDATE的行数,或DELETE语句,或者SELECT INTO语句返回。 |
任何SQL游标属性都将作为SQL%ATTRIBUTE_NAME如示例如下所示进行访问。
例:
我们将使用我们已经创建,并在前面的章节中使用客户表。
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.
如果您检查客户表中的记录,你会发现,各行已更新:
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;
例:
下面是一个完整的例子来说明明确游标的概念:
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;
/
当上述代码在SQL提示符执行时,它产生了以下结果:
1 Ramesh Ahmedabad 2 Khilan Delhi 3 kaushik Kota 4 Chaitali Mumbai 5 Hardik Bhopal 6 Komal MP PL/SQL procedure successfully completed.