《应用于Web的面向对象关系型数据库管理系统Oracl.ppt》由会员分享,可在线阅读,更多相关《应用于Web的面向对象关系型数据库管理系统Oracl.ppt(276页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、应用于应用于Web的面向对象关系型数据库管理的面向对象关系型数据库管理系统:系统:OraclePL/SQL 简介 1wnt 2000(C)copyright本章目标本章目标iPL/SQL 简介简介 iPL/SQL 功能 i变量和常量变量和常量i对变量赋值 iPL/SQL 结构结构 i异常简介 预定义的异常 用户定义的异常2PL/SQL 简介简介 iSQL 是当今最为强大的数据检索机制之一是当今最为强大的数据检索机制之一 i它被认为是数据库技术的颠峰 iSQL 并不能完成一个过程语言所能完成的所有并不能完成一个过程语言所能完成的所有任务任务 iPL/SQL 的出现将 SQL 的强大功能和过程语言
2、的灵活性结合在了一起 3PL/SQL 简介(续)简介(续)iPL/SQL 是是 SQL 的扩展的扩展 i它是一种包含了过程语句和命令以及 SQL 命令的应用程序开发语言i此语言消除了数据库技术和过程编程语言之间此语言消除了数据库技术和过程编程语言之间的障碍的障碍 4PL/SQL 简介(续)简介(续)i它使用复杂的它使用复杂的 Oracle RDBMS中的工具并扩展中的工具并扩展了标准的了标准的 SQL 数据库语言数据库语言 i它允许使用所有的 SQL DML语句以及事务处理语句 i它允许使用诸如迭代循环和条件分支等流控制它允许使用诸如迭代循环和条件分支等流控制语句来处理数据语句来处理数据5PL
3、/SQL 功能功能 i消除了技术和过程语言之间的障碍消除了技术和过程语言之间的障碍i扩展了标准的 SQL 数据库语言i植根于植根于 SQLi使用控制、循环和分支等过程技术 i灵活、强大、简单易学灵活、强大、简单易学6PL/SQL 功能(续)功能(续)i它支持诸如游标操作、异常、函数和事务命令它支持诸如游标操作、异常、函数和事务命令的的 SQL i它不支持 DDL 和 DCLi它在逻辑上对语句分组并可将其作为单一程序它在逻辑上对语句分组并可将其作为单一程序块发送到块发送到 RDBMSi事务处理语言提供了过程解决方案 7PL/SQL 功能(续)功能(续)i变量和常量、强大的错误处理和函数变量和常量
4、、强大的错误处理和函数 i每个 PL/SQL 语句调用 SQL 并增强了性能 i减少了客户机减少了客户机/服务器环境中的网络流量服务器环境中的网络流量 i减少了应用程序与 RDBMS 之间的通信 8PL/SQL 功能(续)功能(续)i对诸如对诸如 SQL*Forms 等非过程工具增加了功能等非过程工具增加了功能 i使用 SQL*Forms 的开发人员可以输入使用单一触发器的整个 PL/SQL 程序块 i用用 PL/SQL 开发的应用程序可以移植到任何计开发的应用程序可以移植到任何计算机硬件和运行算机硬件和运行 Oracle 的操作系统的操作系统 i%TYPE 属性基于列定义的声明提供了与数据词
5、典的集成 9PL/SQL 结构结构 i一个标准一个标准 PL/SQL 代码段称作程序块代码段称作程序块 i一个程序块是由三个部分或节构成的 声明部分声明部分 可执行部分 异常处理部分异常处理部分 10PL/SQL 结构(续)结构(续)11PL/SQL 结构(续)结构(续)i声明部分声明部分 定义对象的可选部分 i可执行部分可执行部分 构成可执行语句的必要部分 i异常处理部分异常处理部分 构成错误处理代码的可选部分 12PL/SQL 结构(续)结构(续)iDECLARE表示程序块声明部分的开始 声明对于程序块而言是局部的 iBEGIN表示程序块可执行部分的开始 iEND表示程序块的结束 13PL
6、/SQL 结构(续)结构(续)i可以将语句在可以将语句在 PL/SQL 中分组中分组 i命名组称为子程序 i未命名组是匿名程序块未命名组是匿名程序块 i程序块可以包括称为嵌套程序块的多个块 i只允许在可执行程序和异常处理部分进行嵌套只允许在可执行程序和异常处理部分进行嵌套 i最多允许 200 级嵌套 14PL/SQL 结构(续)结构(续)i可以用任何编辑器编写可以用任何编辑器编写 PL/SQL程序,并将其程序,并将其保存为具有保存为具有.sql 扩展名的文件扩展名的文件i也可以使用 SQL*Plus中的“ED”命令创建 PL/SQL 程序文件i使用使用“”命令执行命令执行 PL/SQL 程序文
7、程序文件件 15变量变量 i可以使用变量存储查询结果以便以后处理,或可以使用变量存储查询结果以便以后处理,或使用变量来计算要插入到数据库表中的值使用变量来计算要插入到数据库表中的值 i在 SQL 或 PL/SQL语句中,都可以将 PL/SQL变量用于表达式的任何位置i在其他语句(包括声明性语句)中对其引用前在其他语句(包括声明性语句)中对其引用前必须先进行声明必须先进行声明 16变量(续)变量(续)i是通过指定数据类型的名称来声明的 i可以被声明为任何 Oracle 内部数据类型i示例 oldfare NUMBER(5);m_name VARCHAR(15);cont BOOLEAN;17常量
8、常量 i除了必须添加关键字除了必须添加关键字 CONSTANT 并赋值外,并赋值外,常量的声明方式与变量非常相似常量的声明方式与变量非常相似i示例 bonus_multiplier CONSTANT NUMBER(3,2):=0.33;18使用属性声明使用属性声明 iPL/SQL 对象(如变量和常量)和数据库对象(如列和表)与某些属性关联 i这些属性可以用于简化变量和常量声明 19%TYPE 属性属性 i提供变量或列的数据类型提供变量或列的数据类型 i在对引用到数据库中的列的变量进行声明时有用 需要知道列的确切数据类型 如果列定义发生变化,则变量的数据类型在运行时也将随之更改 i示例示例 ol
9、dfare fare.first_fare%TYPE;newfare oldfare%TYPE;20%ROWTYPE属性属性 i当记录变量具有与表或视图中的行或从游标获当记录变量具有与表或视图中的行或从游标获取的行相同的结构时有用取的行相同的结构时有用 i记录中的字段具有与表/视图中的列相同的名称和数据类型 i示例示例 emp_rec employee%ROWTYPE;i可以使用下列属性引用特定字段 emp_rec.emp_num;21使用赋值操作符进行赋值使用赋值操作符进行赋值 i通过使用赋值操作符通过使用赋值操作符“:=”,将变量放在将变量放在“:=”左侧,而将包含数据量、变量、算术操作符
10、或左侧,而将包含数据量、变量、算术操作符或 PL/SQL 函数调用的表达式放置在右侧来对变函数调用的表达式放置在右侧来对变量赋值量赋值i示例 emp_rec.dept_code:=MKTG;num:=100;22使用使用 SELECT INTO 进行赋值进行赋值 i还可以按如下方法使用 SELECT INTO 对变量赋值 SELECT INTO FROM WHERE;示例 SELECT first_fare INTO oldfareFROM fare WHERE route_code=SAN-LOU;23使用使用 SELECT INTO 进行赋值(续)进行赋值(续)iSELECT 语句执行后,
11、将出现下列情况之一 只检索了一行 检索了多行 不检索任何行 i仅当它检索一行时,SELECT 才成功操作 i其他两种情况将导致错误并产生异常处理程序 24接受用户输入的值接受用户输入的值 i使用使用“&”操作符及赋值操作符可以接受用户输操作符及赋值操作符可以接受用户输入的值入的值 i示例 mbranch_code:=&mcode;num:=#i“mcode”是绑定变量,不应该声明,但是需要是绑定变量,不应该声明,但是需要声明声明 mbranch_code25条件控制条件控制 i选择结构测试某个条件,然后根据条件在两序选择结构测试某个条件,然后根据条件在两序列语句中选择一列执行列语句中选
12、择一列执行 i有三种语句形式 IF-THENIF-THEN-ELSEIF-THEN-ELSIF26IF-THEN 结构结构 i仅当条件值为仅当条件值为 TRUE 时,才执行语句序列时,才执行语句序列 i如果条件判定为 FALSE 或 NULL,则不执行任何操作 i这两种情况下控制都将转到这两种情况下控制都将转到 IF-THEN structure 结构后的下一个语句结构后的下一个语句 IF THEN语句;END IF;27IF-THEN-ELSE 结构结构 i仅当条件值为仅当条件值为 FALSE 或或 NULL 时,才执行时,才执行 ELSE 子句中的语句序列子句中的语句序列 IF THEN语
13、句;ELSE语句;END IF;28IF-THEN-ELSIF 结构结构 i此结构可以从几个互斥的、排它的选项中选择此结构可以从几个互斥的、排它的选项中选择操作行为操作行为 iIF 语句可以具有任意数目的 ELSIF 子句 i最终的最终的 ELSE 是可选项是可选项i将按自顶向下的顺序逐项检测条件 29IF-THEN-ELSIF 结构(续)结构(续)IF THEN语句;ELSIF THEN语句;ELSIF THEN语句;ELSE语句;END IF;30循环控制循环控制 i使用使用 LOOP 或或 GOTO 语句可以重复或跳过程语句可以重复或跳过程序块的选取部分序块的选取部分 i有三种形式的 L
14、OOP 语句 LOOPWHILE-LOOPFOR-LOOP31LOOP 语句语句 iLOOP 将重复某些语句序列将重复某些语句序列 i被重复的语句位于关键词 LOOP 和 END LOOP 之间 i每执行一次循环迭代过程,就执行一次语句序每执行一次循环迭代过程,就执行一次语句序列,然后控制又回到循环的开始位置列,然后控制又回到循环的开始位置 LOOP语句;END LOOP;32EXIT 语句语句 i如果不需要或不可能让循环进一步处理,用于如果不需要或不可能让循环进一步处理,用于完成循环完成循环 i有两种形式的 EXIT 语句EXITEXIT-WHEN33EXIT 语句(续)语句(续)i强制循环
15、无条件完成强制循环无条件完成 i必须放在循环内 LOOP语句;IF THENEXIT;-立即退出循环 END IF;END LOOP;-控制到此处恢复 34EXIT-WHEN 语句语句 i允许循环有条件完成允许循环有条件完成 i在遇到 EXIT 语句时对 WHEN 子句中的条件进行判断 i如果判定条件为如果判定条件为 TRUE,则循环完成则循环完成 语句;EXIT WHEN;END LOOP;35WHILE-LOOP 语句语句 i将条件与将条件与 LOOP-END LOOP 中的语句序列相关中的语句序列相关联联 i在每次循环前判定条件 i如果条件值为如果条件值为 TRUE,就执行一次语句序列,
16、就执行一次语句序列,然后控制又回到循环的开始位置然后控制又回到循环的开始位置 i如果条件判定为 FALSE 或 NULL,则绕过循环,并且控制转到下一个语句 36WHILE-LOOP 语句(续)语句(续)i循环执行的次数取决于条件且只有完成循环后循环执行的次数取决于条件且只有完成循环后才可知才可知 WHILE LOOP语句;END LOOP;37FOR-LOOP 语句语句 i循环在指定的整数范围内进行循环在指定的整数范围内进行 i对于一定范围内的每个整数,都执行一次该语句i此范围为循环架构的一部分,它位于此范围为循环架构的一部分,它位于 FOR 和和 LOOP 之间之间 i当首次进入循环时,范
17、围只判定一次 i每执行一次循环,循环计数器就会增加38FOR-LOOP 语句(续)语句(续)i不能为循环计数器赋值不能为循环计数器赋值 i在运行时可以动态分配循环范围 FOR IN 逆转 lower_bound.higher_bound LOOP语句;END LOOP;39GOTO 语句语句 i无条件分支到一个标签无条件分支到一个标签 i执行时,语句将更改 PL/SQL 程序块的控制流i编制编制 GOTO 语句代码需要有两个部分语句代码需要有两个部分定义标签名称 使用 GOTO 语句将控制转到标签40GOTO 语句(续)语句(续)i标签名称标签名称 可以选择将其用于命名 PL/SQL程序块或程
18、序块中的语句使用尖括号进行定义使用尖括号进行定义()IF 条件 THEN语句;END IF;语句;GOTO if_fare_label;41GOTO 语句(续)语句(续)i在下列位置可以使用在下列位置可以使用 GOTO 语句来转移控制语句来转移控制 从程序块到可执行语句 从异常处理程序分支到封闭的程序块 42GOTO 语句(续)语句(续)i不允许不允许在下列位置使用 GOTO 语句来转移控制从某个从某个 IF 语句或循环子句内转到其他语句语句或循环子句内转到其他语句从封闭程序块转到某个子程序块从异常处理程序转到当前程序块从异常处理程序转到当前程序块子程序之外转到关键字转到关键字43NULL 语
19、句语句 i明确指定不进行操作(例如,除了将控制转移到下一个明确指定不进行操作(例如,除了将控制转移到下一个语句而不进行任何操作)语句而不进行任何操作)i它提高了可读性 IF newfare 90 THEN语句;ELSENULL;END IF;44注释的使用注释的使用 i添加注释可以提高程序的可读性并帮助理解添加注释可以提高程序的可读性并帮助理解iPL/SQL 支持两种注释样式单行注释单行注释i可以在行中的任何地方以双分号(-)开始i可以扩展到行尾多行注释多行注释i这些注释以/*开始并以*/结束 i可以跨越多行 45异常简介异常简介 i错误条件称为异常错误条件称为异常i错误发生时,产生异常,这些
20、异常包括常规执行停止并且控制转移到了 PL/SQL 程序块或子程序的异常处理部分 i要处理产生的异常,需要编写单独的称作异常要处理产生的异常,需要编写单独的称作异常处理程序的例程处理程序的例程 46异常介绍(续)异常介绍(续)i有两类异常预定义异常(内部异常)预定义异常(内部异常)用户定义的异常用户定义的异常 47异常的范围规则异常的范围规则 i不能在同一程序块两次声明异常,但可以在两不能在同一程序块两次声明异常,但可以在两个不同的程序块声明同一个异常个不同的程序块声明同一个异常i在程序块中声明的异常对于程序块是局部的,而对于所有子程序块则是全局的i封闭的程序块不能引用在子程序块中声明的异常,
21、因为程序块只能引用局部或全局异常48预定义异常预定义异常 i在在 PL/SQL 程序块验证一个程序块验证一个 Oracle 规则或超过了系统依规则或超过了系统依赖限制时隐式地发生赖限制时隐式地发生 i每个 Oracle 错误都有一个编号,但必须通过名称来处理异常 iPL/SQL 预定义了某些通用的预定义了某些通用的 Oracle 错误作为异常错误作为异常 iPL/SQL 在全局范围全局范围内声明这些预定义异常 49预定义异常(续)预定义异常(续)i某些预定义的异常 CURSOR_ALREADY_OPENNO_DATA_FOUNDTOO_MANY_ROWSVALUE_ERRORZERO_DIVI
22、DEi可以使用“OTHERS”异常来处理所有未在程序块中定义的其他错误50预定义异常(续)预定义异常(续)i示例 异常WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE(Route code not found);WHEN OTHERS THEN语句;END;i可选的可选的 OTHERS 异常处理程序总是程序块中的异常处理程序总是程序块中的最后一个处理程序最后一个处理程序 51预定义异常(续)预定义异常(续)i一个程序块仅可以有一个一个程序块仅可以有一个 OTHERS 处理程序处理程序 i使用 OTHERS 处理程序将确保可以处理所有异常i每次在程序块异常处
23、理部分中仅可以激活一个异常每次在程序块异常处理部分中仅可以激活一个异常 i如果嵌套程序块没有异常处理程序,则执行下一个外部程序块的异常处理程序52预定义异常(续)预定义异常(续)i可以在一个异常处理程序中通过关键字 OR 将异常分隔开来处理多个异常Exception WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN语句;WHEN OTHERS THEN语句;END;53用户定义的异常用户定义的异常i需要在需要在 PL/SQL 程序块、子程序或数据库触发程序块、子程序或数据库触发器的声明部分对用户定义的异常进行定义器的声明部分对用户定义的异常进行定义 i可以通过将
24、异常命名并定义为数据类型 EXCEPTION 进行声明 i示例 DECLAREpast_due EXCEPTION;zero_error EXCEPTION;54用户定义异常(续)用户定义异常(续)i与变量相同,用户定义的异常必须具有名称与变量相同,用户定义的异常必须具有名称 i与变量不同,不能为用户定义的异常赋值,并且不能将其用于 SQL 语句 i需要使用需要使用 RAISE 语句明确产生语句明确产生 55用户定义异常(续)用户定义异常(续)i仅当出现的错误无法完成处理时,程序块才仅当出现的错误无法完成处理时,程序块才 RAISE 一个异常一个异常i可以在表达式范围内的任意位置对给定表达式的
25、 RAISE 语句进行编码IF mrec.ss_fare=0 THENRAISE zero_error;END IF;56用户定义异常(续)用户定义异常(续)i处理程序中发生的异常被立即传送到封闭的程处理程序中发生的异常被立即传送到封闭的程序块,将对其进行搜索为新产生的异常查找一序块,将对其进行搜索为新产生的异常查找一个处理程序个处理程序 i从这里开始,将按常规方式发送异常 i要重新产生一个异常,应在局部处理程序中放要重新产生一个异常,应在局部处理程序中放入一个入一个 RAISE 语句语句57异常处理程序异常处理程序 i用于捕获已产生的异常用于捕获已产生的异常 i由 WHEN 子句构成,指定一
26、个异常,后跟一个当异常产生时要执行的语句序列i当异常在游标的当异常在游标的 FOR 循环中产生时,游标将被循环中产生时,游标将被隐式地关闭隐式地关闭i控制不返回到开始执行的地方不返回到开始执行的地方58错误函数错误函数 i可以在异常处理程序中使用两个错误函数SQLCODEi用于查找发生了什么错误 SQLERRMi用于获得错误消息i不能在 SQL 语句中直接使用i必须将这些值赋给必须将这些值赋给 SQL 语句中的局部变量语句中的局部变量 59错误函数(续)错误函数(续)iSQLCODE对于预定义的异常对于预定义的异常i错误返回一个负数并将控制传回给处理程序 i为“未找到数据”错误返回+100对于
27、用户定义的异常对于用户定义的异常 i返回+160错误函数(续)错误函数(续)iSQLERRM对于预定义的异常对于预定义的异常 i返回与发生的错误相关的消息 i消息以错误代码开始 对于用户定义的异常对于用户定义的异常 i返回“User-Defined Message”消息 还将接受一个错误号,并返回与该错误号相关的消息还将接受一个错误号,并返回与该错误号相关的消息 61错误函数(续)错误函数(续)DECLAREmsqlcode NUMBER;msqlmsg CHAR(255);BEGIN语句;EXCEPTIONWHEN OTHERS THENmsqlcode:=SQLCODE;msqlmsg:=
28、SQLERRM;DBMS_OUTPUT.PUT_LINE(Error occurred-|TO_CHAR(msqlcode)|msqlmsg);END;62应用于应用于Web的面向对象关系型数据库管理系统:的面向对象关系型数据库管理系统:Oracle游标和复合数据类型 63本章目标本章目标i游标简介i游标类型隐式游标显式游标i游标功能 i定义游标i操纵游标 i游标属性 64本章目标(续)本章目标(续)i游标 FOR 循环i参数化游标iUPDATE OF 和 CURRENT OF 的游标 iPL/SQL 表 iPL/SQL 记录65游标简介游标简介 i要处理要处理 SQL 语句,语句,PL/SQ
29、L 打开一个称作环境打开一个称作环境区域的工作区区域的工作区 iPL/SQL 使用该区域执行 SQL 语句和存储处理信息 i称作称作“游标游标”的的 PL/SQL 结构允许您命名环境结构允许您命名环境区域,访问其信息及在某些情况下控制其处理区域,访问其信息及在某些情况下控制其处理过程过程66游标简介(续)游标简介(续)i查询返回多行时,可以将游标显式地定义为查询返回多行时,可以将游标显式地定义为 在查询所返回的首行之外的处理 对当前正在处理的行进行跟踪 i由多行查询返回的行集称作活动集 67游标类型游标类型iPL/SQL 使用两类游标 隐式游标隐式游标i由 Oracle 自动定义并打开,用于处
30、理每个 SQL语句i最近打开的环境区域被称为“SQL%”游标 显式游标显式游标i如果查询返回多行,则可定义显式游标来对当前正在处理的行进行跟踪68游标功能游标功能i游标名是一个未声明的标识符,仅用于引用查询游标名是一个未声明的标识符,仅用于引用查询 i不能对游标赋值,也不能在表达式中使用游标名i显式游标可以有参数显式游标可以有参数i游标参数可以出现在查询中常量出现的任何位置上 i可以将游标参数初始化为默认值可以将游标参数初始化为默认值 69游标的功能(续)游标的功能(续)i可以将实参的不同值传递到游标,按需要采用或替换默可以将实参的不同值传递到游标,按需要采用或替换默认值认值i游标参数的范围对
31、于游标来讲是局部变量 i当游标为当游标为 OPENED 时,游标参数的值可以用于相关的时,游标参数的值可以用于相关的查询查询 70定义游标定义游标i可以通过在可以通过在 PL/SQL 程序块的声明部分命名游程序块的声明部分命名游标或将它与某个查询关联来定义一个游标标或将它与某个查询关联来定义一个游标CURSOR IS;i示例CURSOR emp_cur ISSELECT empno,ename,job,salFROM emp;71操纵游标操纵游标i可以使用下列语句操纵游标可以使用下列语句操纵游标OPENFETCHCLOSEi在使用 OPEN、CLOSE 或 FETCH 语句引用这些语句之前必须
32、对游标进行声明 72OPEN 语句语句 i初始化或打开游标初始化或打开游标 i在查询返回任何行之前必须打开游标 i打开游标将执行查询并识别活动集合打开游标将执行查询并识别活动集合 OPEN i示例OPEN emp_cur;73FETCH 语句语句 i一次只能在一个活动集合中检索行一次只能在一个活动集合中检索行 i可以重复执行,直到检索到了所有行 FETCH INTO var1,varN;ORFETCH INTO record_variable;i示例FETCH emp_cur INTO mrec;74CLOSE 语句语句 i关闭游标并让活动集合成为未定义内容关闭游标并让活动集合成为未定义内容
33、CLOSE;i示例CLOSE emp_cur;i只要游标关闭,可以通过使用只要游标关闭,可以通过使用 OPEN 语句重新语句重新打开它打开它 75显式游标的属性显式游标的属性i每个游标有四个属性可以用于访问游标的环境每个游标有四个属性可以用于访问游标的环境区域区域%NOTFOUND%FOUND%ROWCOUNT%ISOPENi要使用这些属性,只要简单地将它们添加到游标名后即可76显式游标的属性(续)显式游标的属性(续)i%NOTFOUND如果因为没有多行而使最后的 FETCH 失败,则判定为 TRUE如果最后的 FETCH 返回一行,则判定为 FALSEi%FOUND如果最后的 FETCH 返
34、回一行,则判定为 TRUE如果因为没有多行而使最后的 FETCH 失败,则判定为 FALSE 77显式游标的属性(续)显式游标的属性(续)i%ROWCOUNT返回当前从活动集合获取的行数i%ISOPEN如果打开显示游标,则判定为 TRUE如果关闭显示游标,则判定为 FALSE78显式游标的属性(续)显式游标的属性(续)i示例IF emp_cur%ISOPEN THENFETCH emp_cur INTO m_rec;IF emp_cur%FOUND THENmsr_no:=emp_cur%ROWCOUNT;END IF;ELSEOPEN emp_cur;END IF;79游标游标 FOR 循环
35、循环 i将它的循环索引声明为将它的循环索引声明为%ROWTYPE 的记录的记录i隐式地打开游标i从活动集反复获取行的值并传送到记录中的字段从活动集反复获取行的值并传送到记录中的字段i在处理完所有行,并且循环退出时,隐式地关闭游标80游标游标 FOR 循环(续)循环(续)i为满足与游标名相关的查询的每一行执行循环为满足与游标名相关的查询的每一行执行循环结构中的语句结构中的语句i游标 FOR 循环用于简化代码编写 81游标游标 FOR 循环(续)循环(续)DECLARECURSOR emp_cur ISSELECT empno,ename,job,sal FROM emp;BEGINFOR mre
36、c IN emp_curLOOPINSERT INTO tempVALUES(mrec.empno,mrec.ename,mrec.job,mrec.sal);END LOOP;END;82参数化的游标参数化的游标i游标也可接收参数游标也可接收参数i这些参数仅可用于游标的 SELECT 语句的输入i游标参数可以在查询中常量出现的任何位置上游标参数可以在查询中常量出现的任何位置上出现出现i可以在 OPEN 语句或游标 FOR 循环中提供参数值83参数化的游标(续)参数化的游标(续)DECLARECURSOR emp_cur ISSELECT empno,ename,job,sal FROM em
37、pWHERE job=pjob;mjob emp.job%TYPEBEGINmjob:=&job;FOR mrec IN emp_cur(mjob)LOOPstatements;END LOOP;END;84游标游标 FOR UPDATE OF 和和 CURRENT OFiCURRENT OF 子句用于在子句用于在 UPDATE 或或 DELETE 语句中以引用游标当前行语句中以引用游标当前行i必须使用 FOR UPDATE OF 子句声明游标,并在一行上打开并定位i如果游标没有打开,则如果游标没有打开,则 CURRENT OF 子句将子句将产生错误产生错误85游标游标 FOR UPDATE
38、OF 和和 CURRENT OF(续)(续)i如果游标已经打开,但没有处理 FETCH 或最后一个 FETCH 没有返回任何行,则将产生预定义例外 NO_DATA_FOUND86游标游标 FOR UPDATE OF 和和 CURRENT OF(续)(续)DECLARECURSOR emp_cur ISSELECT empno,ename,job,sal FROM empWHERE job=pjob FOR UPDATE OF sal;BEGINFOR mrec IN emp_cur LOOPUPDATE emp SET sal=sal*0.15WHERE CURRENT OF emp_cur;
39、END LOOP;END;87隐式游标的属性隐式游标的属性i虽然 OPEN、CLOSE 和 FETCH 语句不能用于操作 SQL%游标,但属性可以用于访问游标的环境区域i在游标自动打开之前,属性判定为 NULL88隐式游标的属性(续)隐式游标的属性(续)i下列四个游标属性可以用于访问 SQL%游标的环境区域SQL%NOTFOUNDSQL%FOUNDSQL%ROWCOUNTSQL%ISOPEN89隐式游标的属性(续)隐式游标的属性(续)iSQL%NOTFOUND如果 INSERT、UPDATE 或 DELETE 语句没有影响行,则判定为 TRUE,否则判定为 FALSEiSQL%FOUND逻辑上
40、与 SQL%NOTFOUND 相反 如果 INSERT、UPDATE 或 DELETE 影响了一行或多行,则判定为 TRUE,否则判定为 FALSE90隐式游标的属性(续)隐式游标的属性(续)iSQL%ROWCOUNT返回 INSERT、UPDATE 或 DELETE 语句影响的行数iSQL%ISOPENOracle 执行完与其关联的 SQL语句后,将自动关闭隐式游标 对于隐式游标,总是将 SQL%ISOPEN 判定为 FALSE91隐式游标的属性(续)隐式游标的属性(续)i示例DELETE FROM emp WHERE empno=7864;IF SQL%NOTFOUND THEN.END
41、IF;92PL/SQL 表表 iTABLE 类型的对象称为 PL/SQL 表i可以将其可视化为单维的、具有无限多个元素的垂直数组i表大小不受限制,即添加新行时它的大小将增加iPL./SQL 表使用主键,对行进行类似于数组那样的访问93PL/SQL 表(续)表(续)iPL/SQL 表的声明分为两个步骤 定义一个 TABLE 类型 TYPE IS TABLE OF列类型|变量数据类型 NOT NULLINDEX BY BINARY_INTEGER;声明该类型的 PL/SQL 表 ;94PL/SQL 表(续)表(续)i示例TYPE name_tab_typ IS TABLE OF CHAR(15)I
42、NDEX BY BINARY_INTEGER;name_table name_tab_typ;95PL/SQL 表(续)表(续)i可以通过使用具有类似于数组语法的主键值来引用行(I)其中 I 是索引下标 i示例name_table(3)96PL/SQL 表(续)表(续)i还可以将 PL/SQL 表达式的值赋予给特定行(I):=plsql_expression;i示例name_table(5):=MICKY;97PL/SQL 记录记录 i类型为 RECORD 的对象称为 PL/SQL 记录iPL/SQL 记录具有唯一命名的字段,这些字段可以属于不同的数据类型 98PL/SQL 记录(续)记录(续
43、)i通过两个步骤对 PL/SQL 记录进行了声明 定义一个 RECORD 类型 TYPE IS RECORD(fieldname1 NOT NULL:fieldnameN NOT NULL);(%TYPE 和%ROWTYPE 可用于指定 声明该类型的 PL/SQL记录;99PL/SQL 记录(续)记录(续)i只有对字段进行了初始化后才可以添加 NOT NULL 约束i示例TYPE route_rec_type IS RECORD(route_code VARCHAR2(7)NOT NULL:=SAN-LOU,first_fare fare.first_fare%TYPE,eco_fare fa
44、re.eco_fare%TYPE);route_rec route_rec_type;100PL/SQL 记录(续)记录(续)i可以在声明中初始化记录 i示例 TYPE timetype IS RECORD(tsecond SMALLINT:=0,tminute SMALLINT:=0,thour SMALLINT:=0);i声明了 timetype 类型的记录后,字段初始值为零 101PL/SQL 记录(续)记录(续)i可以使用点号引用记录中的字段.i示例route_rec.eco_fare102PL/SQL 记录(续)记录(续)i可以一次对所有字段赋值 通过将一个记录赋值给另一个具有相同类
45、型的记录 route_rec1:=route_rec2;使用 SELECT INTO 或 FETCH INTO 语句 SELECT route_code,first_fare,eco_fare INTO route_rec1 FROM fareWHERE route_code=SAN-LOU;(列名称必须按照与记录中字段相同的顺序出现)103PL/SQL 记录(续)记录(续)i一个记录可以是另一个记录的组件iPL/SQL 允许声明并引用嵌套记录104PL/SQL 记录(续)记录(续)i示例TYPE timetype IS RECORD(tminute SMALLINT,thour SMALLI
46、NT);TYPE meetingtype IS RECORD(mday DATE,mtime timetype);meeting meetingtype;seminar meetingtype;105PL/SQL 记录(续)记录(续)i示例(续)TYPE partytype IS RECORD(pday DATE,ptime timetype);party partytype;106PL/SQL 记录(续)记录(续)iPL/SQL 允许嵌套记录赋值给另一个具有相同数据类型的记录 seminar.time:=meeting.time;i如果所包括的记录属于不同的数据类型,也允许一个嵌套记录赋值给
47、另一个记录 party.time:=meeting.time;107应用于应用于Web的面向对象关系型数据库管理系统:的面向对象关系型数据库管理系统:OracleREF 游标、过程和函数 108本章目标本章目标i游标类型和变量 i子程序简介 i子程序的优点 i存储程序i函数iRETURN 语句 i过程和函数的参数模式 i查看存储子程序的错误 i存储子程序的优点 109游标类型和变量游标类型和变量iPL/SQL 程序不能将游标作为参数传递到另一程序不能将游标作为参数传递到另一个程序个程序iPL/SQL 程序仅能打开游标并处理程序自身内的相应信息i要解决功能限制,用程序可以声明两个不同的要解决功能
48、限制,用程序可以声明两个不同的游标类型及相应的游标变量游标类型及相应的游标变量 110游标类型和变量(续)游标类型和变量(续)i根据游标的不同声明方式,游标可以是 强型强型弱型111游标类型和变量(续)游标类型和变量(续)i强型游标 游标类型的声明包括为游标类型指定了形态或属性的游标类型的声明包括为游标类型指定了形态或属性的 RETURN 子句子句 强型游标类型限制随后使用该类型的游标变量的定义示例TYPE emp_cur IS REF CURSOR RETURN emp.empno%TYPE;emp_cursor1 cur_emp;112游标类型和变量(续)游标类型和变量(续)i弱型游标 程
49、序可以使用弱型游标类型声明任何形态的游标变量程序可以使用弱型游标类型声明任何形态的游标变量 因为没有返回值,所以游标变量的形态是独立的 这增加了游标变量的灵活性,有利于进一步的更改这增加了游标变量的灵活性,有利于进一步的更改 示例TYPE emp_cur IS REF CURSOR;113子程序子程序i子程序退出时,声明部分的对象是本地的并且子程序退出时,声明部分的对象是本地的并且终止其存在终止其存在 i可以使用支持 PL/SQL 的任何 Oracle 工具进行定义 i它们可以在它们可以在 PL/SQL 程序块、过程、函数和数程序块、过程、函数和数据包中声明据包中声明114子程序的优点子程序的
50、优点i具有可扩展性具有可扩展性 可以自定义 PL/SQL 语言以满足应用程序的需要 i提高可复用性和可维护性提高可复用性和可维护性子程序只要有效,就完全可以用于任何数目的应用程序中简化了维护/优化过程,因为如果定义更改只有子程序受到影响115子程序的优点(续)子程序的优点(续)i具有模块化特性具有模块化特性可以将程序拆分为可管理的、明确定义的逻辑块支持自顶向下的设计和逐步细化的解决问题的方法i抽象内容帮助抽象内容帮助允许与细节在精神上分离这种截取方式允许程序员在主程序的测试并调试完成后再进行过程/函数的定义116存储过程存储过程 i执行特定操作的子程序执行特定操作的子程序i存储于数据库中并可由