`

PL/SQL Step By Step(二)

阅读更多

    游标是PL/SQL非常重要的一部分,也是很多人为什么使用PL/SQL的原因。游标能够让开发者对数据库查询进行记录级别的控制。也就是说,可以对查询返回的数据一次一行进行步进,并且在两行之间停顿一段时间来进行一些特别的处理操作。

    游标分为两种:隐式游标和显式游标。下面我们先介绍隐式游标,一会在介绍更加强大的显示游标。

    1.隐式游标

    隐式游标是不需要定义的,说白了,隐式游标就是数据操作语言DML,例如SELECT语句。也就是我们上一讲中提到的PL/SQL处理部分中的语句。先看一个例子:

DECLARE
  v_port_name varchar2(80);
BEGIN;
  SELECT PORT_NAME 
  INTO v_port_name
  FROM PORTS
  WHERE PORT_ID = 100;
  DBMS_OUTPUT.PUT_LINE(v_port_name);
END;

    上面的这个SELECT语句就是一个隐式游标的例子。需要注意的是INTO关键字,基于SELECT语句的隐式游标必须使用INTO关键字用一系列变量来取得查询出来的各列的值。

    隐式游标从本质上来说就是嵌在PL/SQL中的SQL语句,只要是合法的SQL语句就行。这不局限于SELECT语句,还可以使DELETE,INSERT,UPDATE语句,甚至包括DECODE语句。我们前面提到,DECODE是唯一一个不能作为PL/SQL表达式的SQL函数,但是它依然是合法的SQL语句,因此嵌入PL/SQL也可以构成隐式游标,这一点需要注意。

    需要特别提一下:在隐式游标中定义的SELECT语句必须且只能返回一条记录,否则的话,Oracle会报错。这一点也非常重要。有人对这一点很困惑,但其实道理还是比较简单的:前面我们说了,基于SELECT语句的隐式游标必须使用INTO将查询到的结果的每一列以此存进定义的变量。大家都知道,变量一次只能处理一个值,所以隐式游标SELECT只允许返回一条记录。

    如果SELECT返回的记录超过一条,那么换成我们下面要讲的显式游标吧。

    2.显式游标

    显式游标是在PL/SQL生命部分定义,并且在处理部分使用的游标。他之所以叫显式游标是因为他在定义的的时候需要命名。在使用显式游标的时候,主要需要和四个关键词打交道,我们逐一讲解:

CURSOR
这个关键字用在PL/SQL声明部分,用来定义显示游标,其格式如下:
CURSOR cursor_name IS a_valid_select_statement

OPEN
这个关键词用在PL/SQL处理部分,用来解析显式游标中定义的SQL语句,并且为执行做准备

FETCH...INTO
这个关键词用来一次获取显式游标查询结果的一行记录,并且将每一行记录的各个字段
分别赋值给一系列变量。其格式为:
FETCH cursor_name INTO val1,...valn

CLOSE
关闭游标,这样PL/SQL解析程序可以释放内存。但是即使不写CLOSE语句,PL/SQL解析程序
最终还是会发现并释放显式游标占用的内存。

    说了这么多,我们看一个综合使用了隐式游标和显示有标的例子:

 DECLARE
  v_today DATE;
  --定义显式游标开始
  CURSOR cur_cruises IS
    SELECT C.CAPTAIN_ID,
           E.LAST_NAME || ',' || E.FIRST_NAME FULL_NAME
    FROM CRUISES C,
         EMPLOYEES E
    WHERE C.CAPTAIN_ID = E.EMPLOYEE_ID;
      AND E.START_DATE >= v_today
      AND E.END_DATE <= v_today;
    
  --定义显式游标结束
  
  v_captain_id NUMBER(3);
  v_full_name VARCHAR2(40);
BEGIN
  --使用隐式游标开始
  SELECT TRUNC(SYSDATE)
  INTO v_today
  FROM DUAL;
  --使用隐式游标结束
  
  OPEN cur_cruises; --打开游标
  
  LOOP
    FETCH cur_cruises INTO v_captain_id,v_full_name;--获取数据
    
    EXIT WHEN cur_cruises%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('Captain ID:' || v_captain_id);
    DBMS_OUTPUT.PUT_LINE('Name      :' || v_full_name);
  END LOOP;
  CLOSE cur_cruises;--关闭游标
  
END;

    这段代码的意图是非常显而易见的,必要的注释在代码中体现了。显式游标可以通过任何可独立运行的SQL语句来构建,除此之外,在显式游标的定义中可以使用之前定义的变量,上面的代码就是一个很好的例子。

    3.游标的属性

    上面的代码中出现了一个陌生的东西:%NOTFOUND。这是一种游标的属性。接下来,我们分别介绍游标的集中属性:

NOTFOUND
是一个BOOLEAN类型。当最近一次FETCH操作没有返回记录时,该属性值为真,否则为假。
FOUND
是一个BOOLEAN类型。当最近一次FETCH操作返回记录时,该属性值为真,否则为假。
ISOPEN
是一个BOOLEAN类型。判断游标是否已经打开。
ROWCOUNT
游标目前为止已经处理过的行数。

    上面的属性对于隐式游标和显示游标都是存在的。但是有一个问题,隐式游标是没有名字的,没办法向上面例子代码中显示游标一样使用后属性。可以通过下面这种方式:

BEGIN
  UPDATE EMPLOYEES
  SET SALARY = SALARY * 1.5;--加薪啦
  DBMS_OUTPUT.PUT_LINE('Rows Affacted:' || SQL%ROWCOUNT);
END;

通过使用SQL来引用最近的一个隐式游标。

    4.循环语句回顾

    上一篇博客中,我们介绍了PL/SQL循环语句的四种形式,并且提到了CURSOR循环。但是当时没介绍游标,所以没有详细讲解。现在有了游标的知识,我们来看看CURSOR循环到底是个什么东东。看一个例子:

BEGIN
  FOR rec_employee IN (SELECT EMPLOYEE_ID FROM EMPLOYEES)
  LOOP
    DBMS_OUTPUT.PUT_LINE('IN THE FOR LOOP' || rec_employee.EMPLOYEE_ID);
  END LOOP;
END;

    这种循环其实基本上和之前的数值FOR循环一样,只不过数值FOR循环通过一个计数变量来迭代,而这里顺着游标记录一条一条往下从而达到迭代效果。实际上,CURSOR FOR循环自动做了四件事情:

  1. 将rec_employee定义为%ROWTYPE类型。
  2. 定义了一个匿名的显示游标
  3. 自动从头到尾遍历查询出的记录
  4. 离开循环,执行CLOSE操作,关闭游标。

    5.补充

    上面提到了%ROWTYPE类型定义,这里补充一下PL/SQL中的两种高级的变量类型定义方法:%TYPE和%ROWTYPE。

    %TYPE:将变量定义为%TYPE左边的东西一样,例如:

DECLARE
  v_name SOMETABLE.USERNAME%TYPE;--将v_name变量定义为和SOMETABLE表的USERNAME字段一样的类型
BEGIN
  --DO STH
END;

    %ROWTYPE:将变量定义为和左边东西一行一样的类型(也就是所有字段类型一一对应),上面的rec_employee 就是个例子。

    这一讲就到这里,游标是PL/SQL中非常重要的语言特性和组成部分,需要重点掌握。

PS:

美好的周末又到了,可惜周六还是得八点半到实验室,祝博友们周末愉快!^_^      

 

 

0
0
分享到:
评论

相关推荐

    PL/SQL Developer 6.05注册版-1

    SQL Exporter did not export very old dates in date format - SQL Exporter could export floats with comma as decimal separator &lt;br&gt;PL/SQL Developer主要特性: PL/SQL编辑器,功能强大——该编辑器...

    PL/SQL Developer v8.0.zip

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

    PL/SQL Developer 7.1.5 注册版-3

    SQL Exporter did not export very old dates in date format - SQL Exporter could export floats with comma as decimal separator &lt;br&gt;PL/SQL Developer主要特性: PL/SQL编辑器,功能强大——该编辑器...

    PL/SQL Developer

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

    pl/sql developer 9 + 注册机

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

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

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

    PL/SQL Developer 7.1.5 注册版

    SQL Exporter did not export very old dates in date format - SQL Exporter could export floats with comma as decimal separator &lt;br&gt;PL/SQL Developer主要特性: PL/SQL编辑器,功能强大——该编辑器...

    PLSQL Developer 7.1.5

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

    PLSQL Developer(免安装、汉化版,很好用的) 8.0.3.1510.rar

     PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户...

    PLSQLDeveloper下载

    因为PL/SQL允许混合SQL申明和过程结构,因此可以在将申明发送到甲骨文系统去执行之前使用PL/SQL区段和副程序来组合SQL申明,没有PL/SQL,甲骨文需要就每次处理SQL申明,在网络环境中,这将影响交通流量,而且增加...

    PLSQLDeveloper_V8.0.2+汉化+注册码(2)

     PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户...

    PLSQLDeveloper_V8.0.2+汉化+注册码(1)

     PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户...

    plsqldev802安装

    PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户...

    PLSQL1.rar_step by step

    Pl SQL Introduction step by step programming details with examples

    PLSQL2.rar_step by step

    Pl SQL Introduction step by step programming details with examples

    plsql developer 7.0 最新中文手册.pdf

    PL/SQL Developer 是一个为 Oracle 数据库开发存储程序单元的集成开发环境(IDE),使用 PL/SQL Developer 你能方便地创建你的客户/服务器应用程序的服务器部分。 本手册'step by step '的让你学会plsql develper 的...

    Addison Wesley:Guerrilla Oracle 

    This concise tutorial walks you step-by-step through the process, showing you exactly what you need to know to install, create, and support a successful Oracle 8i or 9i environment with Web ...

    Expert Oracle Application Express(Apress,2ed,2015)

    The framework rests upon Oracle's powerful PL/SQL language, enabling power users and developers to rapidly develop applications that easily scale to hundreds, even thousands of concurrent users....

    Build Web Applications with Java

    There are many good books available in the market which independently teach Java, Web Servers, MVC based Frameworks, JSP, PL/SQL, AJAX, JavaScript, CSS, HTML5, UML, SDLC etc. This book covers all of ...

Global site tag (gtag.js) - Google Analytics