隐式游标
每当执行 SQL 语句时,如果该语句没有显式游标,Oracle 就会自动创建隐式游标。程序员无法控制隐式游标及其中的信息。
每当发出 DML 语句(INSERT、UPDATE 和 DELETE)时,隐式游标都与该语句相关联。对于 INSERT 操作,游标保存需要插入的数据。对于 UPDATE 和 DELETE 操作,游标标识将受到影响的行。
在 PL/SQL 中,您可以将最近的隐式游标称为 SQL cursor,它总是具有诸如 %FOUND, %ISOPEN, %NOTFOUND, 和 %ROWCOUNT. SQL 游标具有附加属性,%BULK_ROWCOUNT 和 %BULK_EXCEPTIONS,专为与 FORALL陈述。下表提供了最常用属性的描述 -
序号 |
属性和描述 |
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 |
+----+----------+-----+-----------+----------+