1、 PL/SQL 程序设计- 1 -1目 录第一章 PL/SQL 程序设计简介 .41.2 SQL 与 PL/SQL.41.2.1 什么是 PL/SQL?.41.2.1 PL/SQL 的好处 .41.2.2 PL/SQL 可用的 SQL 语句 .51.3 运行 PL/SQL 程序 .5第二章 PL/SQL 块结构和组成元素 .62.1 PL/SQL 块 .62.2 PL/SQL 结构 .62.3 标识符 .62.4 PL/SQL 变量类型 .72.4.1 变量类型 .72.4.2 复合类型 .92.4.3 使用%ROWTYPE .112.4.4 LOB 类型* .112.4.5 Bind 变量
2、.112.4.6 INDEX BY TABLES.122.4.7 数据类型的转换* .132.5 运算符和表达式(数据定义) .132.5.1 关系运算符 .132.5.2 一般运算符 .132.5.3 逻辑运算符 .132.6 变量赋值 .132.6.1 字符及数字运算特点 .132.6.2 BOOLEAN 赋值 .132.6.3 数据库赋值 .132.6.4 可转换的类型赋值 .132.7 变量作用范围及可见性 .132.8 注释 .132.9 简单例子 .132.9.1 简单数据插入例子 .132.9.2 简单数据删除例子 .13第三章 PL/SQL 流程控制语句 .133.1 条件语句
3、 .133.2 CASE 表达式 .133.3 循环 .133.3 标号和 GOTO .133.4 NULL 语句 .13第四章 游标的使用 .13- 2 -24.1 游标概念 .134.1.1 处理显式游标 .134.1.2 处理隐式游标 .134.1.3 游标修改和删除操作 .13第五章 异常错误处理 .135.1 异常处理概念 .135.1.1 预定义的异常处理 .135.1.2 非预定义的异常处理 .135.1.3 用户自定义的异常处理 .135.1.4 用户定义的异常处理 .135.2 异常错误传播 .135.2.1 在执行部分引发异常错误 .135.2.2 在声明部分引发异常错误
4、.135.3 异常错误处理编程 .135.4 在 PL/SQL 中使用 SQLCODE, SQLERRM .13第六章 存储函数和过程 .136.1 引言 .136.2 创建函数 .136.3 存储过程 .136.3.1 创建过程 .136.3.2 调用存储过程 .136.3.3 开发存储过程步骤 .136.3.4 与过程相关数据字典 .13第七章 包的创建和应用 .137.1 引言 .137.2 包的定义 .137.3 包的开发步骤 .137.4 包定义的说明 .137.5 子程序重载 .137.6 删除过程、函数和包 .137.7 包的管理 .13第八章 触发器.138.1 触发器类型 .
5、138.1.1 DML 触发器 .138.1.2 替代触发器 .138.1.3 系统触发器 .138.2 创建触发器 .138.2.1 触发器触发次序 .138.2.2 创建 DML 触发器 .138.2.3 创建替代(Instead_of) 触发器 .138.2.3 创建系统事件触发器 .13- 3 -38.2.4 系统触发器事件属性 .138.2.5 使用触发器谓词 .138.2.6 重新编译触发器 .138.3 删除和使能触发器 .138.4 触发器和数据字典 .138.5 数据库触发器的应用举例 .13- 4 -4第一章 PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计
6、语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些客户端工具中,使用 PL/SQL语言也是该语言的一个特点。本章的主要内容是讨论引入PL/SQL语言的必要性和该语言的主要特点,以及了解PL/SQL 语言的重要性和数据库版本问题。还要介绍一些贯穿全书的更详细的高级概念,并在本章的最后就我们在本书案例中使用的数据库表的若干约定做一说明。本章主要重点: PL/SQL 概述 PL/SQL 块结构 PL/SQL 流程 运算符和表达式 游标 异常处理 数据库存储过程和函数
7、包 触发器1.2 SQL 与 PL/SQL1.2.1 什么是 PL/SQL?PL/SQL 是 Procedure Language 其中 执行部分是必须的。PL/SQL 块可以分为三类:1. 无名块:动态构造,只能执行一次。2. 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。3. 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。2.2 PL/SQL 结构 PL/SQL 块中可以包含子块; 子块可以位于 PL/SQL 中的任何部分; 子块也即 PL/SQL 中的一条命令;2.3 标识符PL/SQL 程序设计中的标识符定义与 SQL
8、 的标识符定义的要求相同。要求和限制有: 标识符名不能超过 30 字符; 第一个字符必须为字母; 不分大小写; 不能用-(减号); 不能是 SQL 保留字。- 7 -7提示: 一般不要把变量名声明与表中字段名完全一样 ,如果这样可能得到不正确的结果.例如:下面的例子将会删除所有的纪录,而不是 KING 的记录;DECLAREEname varchar2(20) :=KING;BEGINDELETE FROM emp WHERE ename=ename;END;变量命名在 PL/SQL 中有特别的讲究,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求,使得整个系统的文档在规范上达到要求。
9、下面是建议的命名方法:标识符 命名规则 例子程序变量 V_name V_name程序常量 C_Name C_company_name游标变量 Name_cursor Emp_cursor异常标识 E_name E_too_many表类型 Name_table_type Emp_record_type表 Name_table Emp记录类型 Name_record Emp_recordSQL*Plus 替代变量 P_name P_sal绑定变量 G_name G_year_sal2.4 PL/SQL 变量类型在前面的介绍中,有系统的数据类型,也可以自定义数据类型。下表是 ORACLE 类型和 P
10、L/SQL 中的变量类型的合法使用列表:2.4.1 变量类型在 ORACLE8i 中可以使用的变量类型有:类型 子类 说 明 范 围 ORACLE 限制CHAR CharacterStringRowidNchar定长字符串民族语言字符集032767可选,确省=12000VARCHAR2 Varchar, StringNVARCHAR2可变字符串民族语言字符集03276740004000BINARY_INTEGER带符号整数,为整数计算优化性能NUMBER(p,s)DecDouble precisionIntegerIntNumericReal小数, NUMBER 的子类型高精度实数整数, NU
11、MBER 的子类型整数, NUMBER 的子类型与 NUMBER 等价与 NUMBER 等价整数, 比 integer 小- 8 -8Small intLONG 变长字符串 0-214748364732,767 字节DATE 日期型 公元前 4712 年 1月 1 日至公元后4712 年 12 月 31 日BOOLEAN 布尔型 TRUE, FALSE,NULL不使用ROWID 存放数据库行号UROWID 通用行标识符,字符类型例 1. 插入一条记录并显示;DECLARERow_id UROWID;info VARCHAR2(40);BEGININSERT INTO dept VALUES (
12、90, SERVICE, BEIJING)RETURNING rowid, dname|:|to_char(deptno)|:|locINTO row_id, info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;其中:RETURNING 子句用于检索 INSERT 语句中所影响的数据行数,当 INSERT 语句使用 VALUES 子句插入数据时,RETURNING 字句还可将列表达式、ROWID 和 REF 值返回到输出变量中。在使用 RETURNING 子句是应注意以下几点限制:1 不能并行 DML
13、语句和远程对象一起使用;2 不能检索 LONG 类型信息;3 当通过视图向基表中插入数据时,只能与单基表视图一起使用。例 2. 修改一条记录并显示DECLARERow_id UROWID;info VARCHAR2(40);BEGINUPDATE dept SET deptno=80 WHERE DNAME=SERVICERETURNING rowid, dname|:|to_char(deptno)|:|locINTO row_id, info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;其中:RETU
14、RNING 子句用于检索被修改行信息:当 UPDATE 语句修改单行数据时,- 9 -9RETURNING 子句可以检索被修改行的 ROWID 和 REF 值,以及行中被修改列的列表达式,并可将他们存储到 PL/SQL 变量或复合变量中;当 UPDATE 语句修改多行数据时,RETURNING 子句可以将被修改行的 ROWID 和 REF 值,以及列表达式值返回到复合变量数组中。在 UPDATE 中使用 RETURNING 子句的限制与 INSERT 语句中对RETURNING 子句的限制相同。例 3. 删除一条记录并显示DECLARERow_id UROWID;info VARCHAR2(4
15、0);BEGINDELETE dept WHERE DNAME=SERVICERETURNING rowid, dname|:|to_char(deptno)|:|locINTO row_id, info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;其中:RETURNING 子句用于检索被修改行信息:当 UPDATE 语句修改单行数据时,RETURNING 子句可以检索被修改行的 ROWID 和 REF 值,以及行中被修改列的列表达式,并可将他们存储到 PL/SQL 变量或复合变量中;当 UPDATE 语
16、句修改多行数据时,RETURNING 子句可以将被修改行的 ROWID 和 REF 值,以及列表达式值返回到复合变量数组中。在 UPDATE 中使用 RETURNING 子句的限制与 INSERT 语句中对RETURNING 子句的限制相同。2.4.2 复合类型ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型- 记录和表 .2.4.2.1 记录类型记录类型是把逻辑相关的数据作为一个单元存储起来,它必须包括至少一个标量型或RECORD 数据类型的成员,称作 PL/SQL RECORD 的域 (FIELD),其作用是存放互不相同但逻辑相关的信息。定义记录类型语法如下:TYPE record_type IS RECORD(Field1 type1 NOT NULL := exp1 ,Field2 type2 NOT NULL := exp2 ,. . . . . .Fieldn typen NOT NULL := expn ) ;例 4 :