`
Copperfield
  • 浏览: 255259 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:24687
社区版块
存档分类

第一章 PL/SQL一览

阅读更多

第一章 PL/SQL一览

游标

游标的类型有两种:隐式和显式。PL/SQL会为所有的SQL数据操作声明一个隐式的游标,包括只返回一条记录的查询操作。对于返回多条记录的查询,我们可以显式地声明一个游标来处理每一条记录。如下例:

DECLARE
  CURSOR c1 IS
    SELECT empno, ename, job
      FROM emp
     WHERE deptno = 20;

 

游标FOR循环

在大多需要使用显式游标的情况下,我们都可以用一个简单的游标FOR循环来代替OPENFETCHCLOSE语句。首先,游标FOR循环会隐式地声明一个代表当前行的循环索引(loop index)变量。下一步,它会打开游标,反复从结果集中取得数据并放到循环索引的各个域(field)中。当所有行都被处理过以后,它就会关闭游标。下面的例子中,游标FOR循环隐式地声明了一个emp_rec记录:

 

DECLARE

  CURSOR c1 IS

    SELECT ename, sal, hiredate, deptno

      FROM emp;

  ...

BEGIN

  FOR emp_rec IN c1 LOOP

    ...

    salary_total    := salary_total + emp_rec.sal;

  END LOOP;

END; 

为了使用每一个查询到的行中的每一个字段,我们可以使用点标志(dot notation),它的作用就像一个域选择器。

 

属性

PL/SQL的变量和游标都有着让我们能够直接引用它们各自的数据类型或结构的属性。数据库字段和表也有类似的属性。"%"是一个属性的指示符。

 

条件控制

IF-THEN-ELSE语句能让我们按照条件来执行一系列语句。IF用于检查条件;THEN决定在条件值为true的情况下执行;ELSE在条件值为falsenull的情况才执行。看一下下面的例子,这个程序用于处理银行事务。在我们从账户3取走$500元之前,它会先确认是否有足够的资金供我们支配。如果余额足够,程序就会更新账户(accounts)表的信息,否则的话,程序会向审核(audit)表插入一条余额不足的提示信息。


 

DECLARE

  acct_balance         NUMBER(11, 2);

  acct        CONSTANT NUMBER(4)     := 3;

  debit_amt   CONSTANT NUMBER(5, 2)  := 500.00;

BEGIN

  SELECT        bal

           INTO acct_balance

           FROM accounts

          WHERE account_id = acct

  FOR UPDATE OF bal;

  IF acct_balance >= debit_amt THEN

    UPDATE accounts

       SET bal = bal - debit_amt

     WHERE account_id = acct;

  ELSE

    INSERT INTO temp

         VALUES (acct, acct_balance, 'Insufficient funds');

    -- insert account, current balance, and message

  END IF;

  COMMIT;

END; 

要从多个条件值中选出对应的操作时,我们可以使用CASE结构。CASE表达式会计算条件值,然后相应的操作(这个操作有可能是一个完整的PL/SQL)

 

CASE

  WHEN shape = 'square' THEN

    area    := side * side;

  WHEN shape = 'circle' THEN

    BEGIN

      area    := pi *(radius * radius);

      DBMS_OUTPUT.put_line('Value is not exact because pi is irrational.');

    END;

  WHEN shape = 'rectangle' THEN

    area    := LENGTH * width;

  ELSE

    BEGIN

      DBMS_OUTPUT.put_line('No formula to calculate area of a' || shape);

      RAISE PROGRAM_ERROR;

    END;

END CASE; 


WHILE-LOOP语句会按照某个条件值执行。每次循环条件值都会被计算一次,如果条件值为true,循环内的语句就会被执行,然后再次回到循环顶部,重新计算条件值。如果条件值为false或是null的话,循环就会停止,控制权被移交给下一语句。

下面的例子中,我们要找出第一个工资高于$2500的且行政级别高于雇员编号7499雇员的员工:

DECLARE

  salary           emp.sal%TYPE     := 0;

  mgr_num          emp.mgr%TYPE;

  last_name        emp.ename%TYPE;

  starting_empno   emp.empno%TYPE   := 7499;

BEGIN

  SELECT mgr  INTO mgr_num  FROM emp  WHERE empno = starting_empno;

  WHILE salary <= 2500 LOOP

    SELECT sal, mgr, ename

      INTO salary, mgr_num, last_name

      FROM emp

     WHERE empno = mgr_num;

  END LOOP;

  INSERT INTO temp VALUES (NULL, salary, last_name);

  COMMIT;

EXCEPTION

  WHEN NO_DATA_FOUND THEN

    INSERT INTO temp

         VALUES (NULL, NULL, 'Not found');

 

    COMMIT;

END; 

 

EXIT-WHEN语句可以在需要继续执行循环的情况下退出循环。当遇到EXIT语句时,WHEN子句中的条件值就会被计算。如果条件为true,循环就会结束,控制权交给下一条语句。下面的例子中,在total的值超过2500时,循环就会结束:

LOOP

  ...

  total    := total + salary;

  EXIT WHEN total > 25000;   -- exit loop if condition is true

END LOOP;

-- control resumes here 


GOTO语句能让我们无条件地跳转到一个标签。标签就是一个用双尖括号夹起来的未声明标示符,它必须在一个可执行语句或是PL/SQL块之前。执行时,GOTO语句将控制权交给用标签作了标记的语句或块,如下例所示:

IF rating > 90 THEN

  GOTO calc_raise;   -- branch to label

END IF;

 

<<calc_raise>>

IF job_title = 'SALESMAN' THEN   -- control resumes here

  amount    := commission * 0.25;

ELSE

  amount    := salary * 0.10;

END IF; 

 

子程序

子程序有两种,分别是函数和过程。子程序很像一段小型的程序,由可选的声明部分,执行控制部分和可选的异常控制部分组成。

PROCEDURE award_bonus(emp_id NUMBER) IS

  bonus          REAL;

  comm_missing   EXCEPTION;

BEGIN   -- executable part starts here

  SELECT comm * 0.15

    INTO bonus

    FROM emp

   WHERE empno = emp_id;

 

  IF bonus IS NULL THEN

    RAISE comm_missing;

  ELSE

    UPDATE payroll

       SET pay = pay + bonus

     WHERE empno = emp_id;

  END IF;

EXCEPTION   -- exception-handling part starts here

  WHEN comm_missing THEN

    ...

END award_bonus; 

调用时,这个过程接受一个雇员编号。它使用编号来查询雇员的commission,同时计算出15%的奖金。然后,它检查bonus总值。如果奖金为空,就会抛出异常,否则雇员的工资记录就会被更新。

 

PL/SQL可以让我们把逻辑相关的类型、变量、游标和子程序放在一个包内,这样更加清楚易理解。包通常有两部分组成:包说明部分和包体部分。包说明部分是应用程序的接口,它"声明"了类型、常量、变量、异常、游标和可以使用的子程序。包体用于实现包说明部分声明的子程序和游标。

 

下面的例子是把两个雇用相关的过程进行打包:

CREATE PACKAGE emp_actions AS   -- package specification

  PROCEDURE hire_employee(empno NUMBER, ename CHAR, ...);

  PROCEDURE fire_employee(emp_id NUMBER);

END emp_actions;

 

CREATE PACKAGE BODY emp_actions AS   -- package body

  PROCEDURE hire_employee(empno NUMBER, ename CHAR, ...); IS

  BEGIN

    INSERT INTO emp

         VALUES (empno, ename, ...);

  END hire_employee;

  PROCEDURE fire_employee(emp_id NUMBER) IS

  BEGIN

    DELETE FROM emp

          WHERE empno = emp_id;

  END fire_employee;

END emp_actions; 

 

只有在包说明中声明的内容对应用程序是可见的,而包体中的内容是不可见,无法访问的。包被编译后会存放到数据库中,当我们首次调用包中的子程序时,整个包就会被加载到内存当中,所以,后续的调用不再涉及到磁盘的读取问题。因此,包可以提高效率改善性能。

PL/SQL块和子程序能够在编译成可执行的形式存放起来,所以调用存储过程是快速和高效的。而且,存储过程是在服务器端执行的,减少网络流量改善响应时间。可执行的代码会被自动地放到缓存然后在多个用户间共享。

分享到:
评论

相关推荐

    PL/SQL 用户指南与参考

    第一章 PL/SQL一览 第二章 PL/SQL基础 第三章 PL/SQL数据类型 第四章 PL/SQL的控制结构 第五章 PL/SQL集合与记录 第六章 PL/SQL与Oracle间交互 第七章 控制PL/SQL错误 第八章 PL/SQL子程序 第九章 PL/SQL包...

    PL-SQL用户指南与参考

    ·第十二章 PL/SQL应用程序性能调优 2008-04-08 · 第十一章 本地动态SQL 2008-04-08 · 第十章 PL/SQL对象类型 2008-04-08 · 第九章 PL/SQL包 2008-04-08 · 第八章 PL/SQL子程序...· 第一章 PL/SQL一览

    第16章Pl/sql编程基础

    pl/sql编程基础教程,内容丰富,适合初学者学习。

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    PL/SQL经典介绍

    第一章 PL-SQL一览 第二章 PL-SQL基础 第三章 PL-SQL数据类型 第四章 PL-SQL的控制结构 第五章 PL-SQL集合与记录(1) 第六章 PL-SQL集合与记录(2) 第七章 PL-SQL与Oracle间交互 第八章 控制PL-SQL错误 第九章 ...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    第2章 创建并运行PL/SQL代码 21 第3章 语言基础 50 第2部分 PL/SQL程序结构 第4章 条件和顺序控制 77 第5章 用循环进行迭代处理 96 第6章 异常处理 118 第3部分 PL/SQL数据 第7章 使用数据 159 第8章 字符串 182 第9...

    pl/sql developer11.0

    pl/sql developer11.0下载 pl/sql developer11.0下载 pl/sql developer11.0下载

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    Oracle PL/SQL语言初级教程

    Oracle公司已经将PL/SQL整合到Oracle 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本教程将以循速渐进的方式讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL/SQL程序,...

    Oracle PL/SQL程序设计(第5版)(套装上下册)

    《Oracle PL/SQL程序设计(第5版)(套装上下册)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何...

    PL/SQL Developer9.06

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

    PL/SQL User's Guide and Reference (官方CHM)

    PL/SQL, Oracle's procedural extension of SQL, is an advanced fourth-generation programming language (4GL). It offers modern features such as data encapsulation, overloading, collection types, ...

    PL/SQL 程序设计

    PL/SQL 程序设计 本章主要重点:  PL/SQL概述  PL/SQL块结构  PL/SQL流程  运算符和表达式  游标  异常处理  数据库存储过程和函数  包  触发器

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    一个对数据库的操作工具PL/SQL,能够对ORACLE\SQL进行很好的帮助操作!

    sql pl/sql存储过程

    第一章 PL/SQL 简介 安装scott/tigger用户模式 Example1 标准的PL/SQL块结构 PL/SQL块类型 Example2:子程序,函数,程序包 PL/SQL代码的执行 第二章 PL/SQL数据类型 预定义数据类型 数值数据类型 字符数据类型 字符...

    pl/sql develpment 8 下载

    pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl...

    pl/sql最新中文手册

    最新pl/sql7.0中文手册

    PL/SQL developer 12.07 注册码 可以使用

    PL/SQL developer 12.07 注册码 可以使用,不错,自己用过了,分享给大家

Global site tag (gtag.js) - Google Analytics