在本章中,无涯教程将讨论PL/SQL中的游标,Oracle创建一个内存区域,称为上下文区域,用于处理SQL语句,其中包含处理该语句所需的所有信息。
您可以命名游标,以便可以在程序中引用该游标以一次获取和处理SQL语句返回的行,游标有两种类型-
- Implicit 隐式游标
- Explicit 显式游标
隐式游标
当执行SQL语句时,当没有隐式游标时,Oracle会自动创建隐式游标,程序员无法控制隐式游标及其中的信息。
每当发出DML语句(INSERT,UPDATE和DELETE)时,隐式游标都会与此语句关联,对于INSERT操作,光标保存需要插入的数据,对于UPDATE和DELETE操作,游标标识将受到影响的行。
在PL/SQL中,您可以将最新的隐式游标称为 SQL游标,该游标始终具有诸如%FOUND,%ISOPEN,%NOTFOUND 和%ROWCOUNT 。 SQL游标具有其他属性,%BULK_ROWCOUNT 和%BULK_EXCEPTIONS ,旨在与 FORALL 语句一起使用。下表提供了最常用的属性的描述-
S.No | Attribute & 描述 |
---|---|
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.
如果您查看客户表中的记录,您会发现行已更新-
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.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 procedure successfully completed.
参考链接
https://www.learnfk.com/plsql/plsql-cursors.html
标签:语句,customers,name,游标,无涯,Cursors,SQL,隐式 From: https://blog.51cto.com/u_14033984/8937845