`
insertyou
  • 浏览: 906108 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PL/SQL -->隐式游标(SQL%FOUND)

 
阅读更多

--===============================

-- PL/SQL -->隐式游标(SQL%FOUND)

--===============================

PL/SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括

声明游标,打开游标,从游标提取数据,关闭游标。该方式多用于处理select语句返回的多行数据的情形。而隐式游标则由则由系统自动定义

,当DML被使用时,Oracle为每一个不属于显示游标的DML语句都创建一个隐式游标,其声明、打开、关闭都是系统自动进行。多用于配合DML

返回单行数据的处理。

有关显示游标的使用,请参考:PL/SQL -->

一、隐式游标的定义及其属性

定义

隐式游标则由则由系统自动定义,非显示定义游标的DML语句即被赋予隐式游标属性。其过程由oracle控制,完全自动化。隐式游标

的名称是SQL,不能对SQL游标显式地执行OPEN,FETCH,CLOSE语句。

属性

类似于显示游标,隐式游标同样具有四种属性,只不过隐式游标以SQL%开头,而显示游标以Cursor_name%开头

通过SQL%总是只能访问前一个DML操作或单行SELECT操作的游标属性,用于判断DML执行的状态和结果,进而控制程序的流程

SQL%ISOPEN

游标是否打开。当执行select into ,insert update,delete时,Oracle会隐含地打开游标,且在该语句执行完毕或隐含地关闭

游标,因为是隐式游标,故SQL%ISOPEN总是false

SQL%FOUND

判断SQL语句是否成功执行。当有作用行时则成功执行为true,否则为false

SQL%NOTFOUND

判断SQL语句是否成功执行。当有作用行时否其值为false,否则其值为true

SQL%ROWCOUNT

在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为,如果没有

成功,SQL%ROWCOUNT的值为,同时产生一个异常NO_DATA_FOUND

二、演示

1.SQL%FOUND的使用

DECLARE

v_empno emp.empno%TYPE:=&no;

BEGIN

UPDATE emp SET sal=sal+200 --根据给定的empno,更新一条记录

WHERE empno=v_empno;

IF SQL%FOUND THEN --使用SQL游标属性SQL%FOUND作为判断条件

COMMIT;

DBMS_OUTPUT.PUT_LINE('SQL code is executed successful');

ELSE

DBMS_OUTPUT.PUT_LINE('The Employee is not exist');

ROLLBACK;

END IF;

END;

Enter value for no: 7788

old 2: v_empno emp.empno%TYPE:=&no;

new 2: v_empno emp.empno%TYPE:=7788;

SQL code is executed successful

PL/SQL procedure successfully completed

2.SQL游标的综合应用(根据SQL游标的不同属性返回不同的结果)

DECLARE

v_dept emp.deptno%TYPE := &no;

BEGIN

IF SQL%ROWCOUNT >= 0 THEN --判断更新前SQL%ROWCOUNT的属性

DBMS_OUTPUT.PUT_LINE('SQL%ROWCOUNT value is ' || SQL%ROWCOUNT ||

'before updated');

ELSE

DBMS_OUTPUT.PUT_LINE('SQL%ROWCOUNT value is NULL before updated');

END IF;

UPDATE emp SET sal = sal + 200 WHERE deptno = v_dept;

IF SQL%FOUND THEN --判断SQL%FOUND的属性

DBMS_OUTPUT.PUT_LINE('SQL code is executed successful');

DBMS_OUTPUT.PUT_LINE('SQL%Found is TRUE');

ELSE

DBMS_OUTPUT.PUT_LINE('No such department');

DBMS_OUTPUT.PUT_LINE('SQL%Found is FALSE');

END IF;

IF SQL%NOTFOUND THEN --判断SQL%NOTFOUND的属性

DBMS_OUTPUT.PUT_LINE('SQL%NotFound is TRUE');

ELSE

DBMS_OUTPUT.PUT_LINE('SQL%NotFound is FALSE');

END IF;

IF SQL%ISOPEN THEN --判断SQL%ISOPEN的属性

DBMS_OUTPUT.PUT_LINE('SQL%ISOPEN is TRUE');

ELSE

DBMS_OUTPUT.PUT_LINE('SQL%ISOPEN is FALSE');

END IF;

DBMS_OUTPUT.PUT_LINE('The rows updated is :' || SQL%ROWCOUNT ||

' rows by SQL Cursor'); --判断SQL%ROWCOUNT的属性

END;

Enter value for no: 10 --下面是成功更新后的结果

SQL%ROWCOUNT value is NULL before updated

SQL code is executed successful

SQL%Found is TRUE

SQL%NotFound is FALSE

SQL%ISOPEN is FALSE

The rows updated is :3 rows by SQL Cursor

Enter value for no: 80 --下面是未成功更新后的结果

SQL%ROWCOUNT value is NULL before updated

No such department

SQL%Found is FALSE

SQL%NotFound is TRUE

SQL%ISOPEN is FALSE

The rows updated is :0 rows by SQL Cursor

3.SELECT INTO时,隐式游标的使用

SELECT INTO用于将单行结果集放置到变量之中。

SELECT INTO处理的结果包括两种种情况

查询结果返回单行,SELECT INTO被成功执行

查询结果没有返回行,PL/SQL将抛出no_data_found异常

查询结果返回多行,PL/SQL将抛出too_many_rows 异常

对于上述两种异常发生时,类似于普通异常处理,程序控制权转移到异常处理部分(如没有异常处理则程序中断)。对于异常被激后发

SQL游标的四个属性在此将不可使用,如下面的例子:

DECLARE

v_ename emp.ename%TYPE;

BEGIN

SELECT ename INTO v_ename FROM emp WHERE empno=&no;

IF SQL%ROWCOUNT=0 OR SQL%NOTFOUND THEN

DBMS_OUTPUT.PUT_LINE('The record '||&no||' is not exist!');

ELSE

DBMS_OUTPUT.PUT_LINE('The name for record '||&no||' is '||v_ename );

END IF;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('No data found for '||&no);

END;

Enter value for no:70

No data found for 70

Enter value for no:7788

The name for record 7788 is SCOTT

从上面的演示中可以看到,当select into没有返回行时,IF SQL%ROWCOUNT=0 OR SQL%NOTFOUND THEN 语句并没有被执行。

使用下面改进过的代码来执行,即可以将SQL游标属性判断放置到EXCEPTION部分

DECLARE

v_ename emp.ename%TYPE;

BEGIN

SELECT ename INTO v_ename FROM emp WHERE empno=&no;

IF SQL%NOTFOUND THEN

DBMS_OUTPUT.PUT_LINE('The record '||&no||' is not exist!');

ELSE

DBMS_OUTPUT.PUT_LINE('The name for record '||&no||' is '||v_ename );

END IF;

EXCEPTION

WHEN NO_DATA_FOUND THEN

IF SQL%NOTFOUND THEN

DBMS_OUTPUT.PUT_LINE('The record '||&no||' is not exist!');

DBMS_OUTPUT.PUT_LINE('No data found for '||&no);

ELSE

DBMS_OUTPUT.PUT_LINE('The name for record '||&no||' is '||v_ename );

END IF;

END;

Enter value for no:80

The record 80 is not exist!

No data found for 80

更多关于隐式游标的探讨,请参考:IMPLICIT CURSOR ATTRIBUTE SQL%NOTFOUND NOT WORKING

三、更多参考

有关SQL请参考

SQL 基础--> 子查询

SQL 基础-->多表查询

SQL基础-->分组与分组函数

SQL 基础-->常用函数

SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

有关PL/SQL请参考

PL/SQL --> 语言基础

PL/SQL --> 流程控制

PL/SQL --> 存储过程

PL/SQL --> 函数

PL/SQL --> 游标

PL/SQL -->隐式游标(SQL%FOUND)

PL/SQL --> 异常处理(Exception)

PL/SQL --> PL/SQL记录

PL/SQL --> 包的创建与管理

PL/SQL --> 包重载、初始化

PL/SQL --> DBMS_DDL包的使用

PL/SQL --> DML 触发器

PL/SQL --> INSTEAD OF 触发器

分享到:
评论

相关推荐

    PL/SQL中用到的几种不同类型的游标写法(转)

    PL/SQL为每个SQL语句自动提供隐式游标,用户无需显式声明。当执行一个DML(数据操纵语言)语句如INSERT、UPDATE或DELETE时,隐式游标会指向受影响的最后一行。例如: ```sql BEGIN UPDATE employees SET salary = ...

    PL/SQL语言的编译与游标编程实例(十).pdf

    在PL/SQL中,可以使用显式游标(Explicit Cursor)或隐式游标(Implicit Cursor)。 - 隐式游标是由数据库自动管理的游标,用于处理SELECT语句返回单行数据的情况。 - 显式游标需要用户在PL/SQL代码中声明、打开、...

    PL/SQL学习笔记

    PL/SQL是Oracle公司开发的一种过程化SQL扩展,它是Oracle数据库的重要组成部分,用于在数据库服务器上编写存储过程、函数、触发器、包等可执行代码。PL/SQL可以处理复杂的数据操作和业务逻辑,支持编程结构如循环、...

    PL/SQL学习资料

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它将SQL的查询功能与过程式编程语言(如Pascal或C)的控制结构结合在一起,为数据库开发提供了一种强大的工具。这个“PL/...

    PL/SQL学习笔记6

    显式游标需要显式声明和管理,而隐式游标则由PL/SQL自动处理。 - REF游标是一种引用类型,它像指针一样指向结果集的行,允许更灵活的数据操作。 2. **显式游标**: - 显式游标需通过`CURSOR`关键字声明,并指定一...

    PL/SQL 基本语句

    - **隐式游标**:自动创建并管理,主要用于SQL语句返回单行数据的情况。 - **游标变量和REFCURSOR**:用于传递游标给存储过程或函数,可以返回多行数据。 - **游标表达式**:支持对游标的高级操作,如FOR循环中...

    Oracle PL/SQL语言初级教程

    - 隐式游标:由PL/SQL自动管理,无需显式声明和打开。 #### 九、异常处理 - **机制**: PL/SQL采用了一种类似于ADA语言的异常处理机制,通过预定义或自定义异常来捕获和处理错误。 - **基本结构**: - EXCEPTION: ...

    13oracle的PL/SQL编程-定义并使用变量 PPT

    在PL/SQL中,未声明的变量默认被视为隐式声明,但这是不推荐的,因为它可能导致意外的错误和难以调试的代码。最佳实践是始终显式声明变量。 7. 常量与变量 常量在PL/SQL中是不可更改的值,它们在声明时被赋值且之后...

    第九讲 PL/SQL语言对数据库的交互作用.pdf

    隐式游标通常用于单条记录的查询处理,而显式游标则用于处理返回多行结果的查询。 文件中还详细介绍了显式游标的具体使用步骤: (1) 声明游标,定义游标的列和行。在PL/SQL程序中,使用DECLARE关键字定义游标; (2)...

    PL/SQL编程

    隐式游标是由PL/SQL在执行SELECT INTO语句时自动创建的,无需显式声明和打开。主要用于单行数据的处理。 #### 4.1.3 游标修改和删除操作 通过游标获取数据后,可以进行更新或删除操作。需要注意的是,在进行这类...

    绝对好的 oracle pl/sql 编程

    - **4.1.2 处理隐式游标**: 隐式游标由 PL/SQL 自动创建,主要用于 SELECT INTO 语句。 **4.2 游标变量** - **4.2.1 声明游标变量** - **4.2.2 游标变量操作** #### 五、异常错误处理 **5.1 异常处理概念** - *...

    PL/SQL 基础.doc

    PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和...

    PL/SQL手册———oracle10g

    - **隐式游标**:系统自动创建和管理的游标,通常用于简单的`SELECT INTO`语句。 - **Ref Cursor**:引用游标,用于在子程序间传递查询结果集。 ##### 异常处理 异常处理是PL/SQL的一个强大功能,可以处理运行时...

    database-pl-sql-language-reference.pdf

    - **隐式游标**:在执行某些SQL语句时自动创建和使用的游标。 2. **集合**:PL/SQL支持使用集合来处理多行数据,包括VARRAY(可变数组)、TABLE(表)和NESTED TABLE(嵌套表)。 3. **动态SQL**:通过执行...

    PL/SQL程序设计

    - **隐式游标**:由PL/SQL自动创建,主要用于单行查询。 - **显式游标**:由程序员定义,用于处理多行数据。 #### 五、异常错误处理 **5.1 异常类型** - **预定义异常**:Oracle提供的标准异常,如`NO_DATA_FOUND...

    oracle pl/sql入门教程

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库查询功能和PL的程序设计特性,为Oracle数据库的开发提供了一种高效、灵活的方式。本入门教程旨在帮助初学者快速理解并掌握Oracle PL/SQL的基础知识,通过...

    PL/SQL Developer8.04官网程序_keygen_汉化

    PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL ...

    pl/sql学习文档

    - **游标**是处理查询结果集的一种机制,分为隐式游标(SQL游标)和显式游标。SQL游标主要应用于单行操作,而显式游标用于处理多行结果。 - **SQL游标属性**: - `SQL%ISOPEN`:在执行时,系统会自动打开和关闭...

    PL/SQL学习资料(.doc)

    - **隐式游标**:由PL/SQL自动创建和管理的游标,主要用于简单的SELECT INTO语句。 **4.2 游标变量** - **声明**:使用DECLARE关键字声明游标。 - **打开和关闭**:使用OPEN和CLOSE语句来操作游标。 - **获取数据*...

Global site tag (gtag.js) - Google Analytics