第5讲-3_Oracle_编程(三).ppt
《第5讲-3_Oracle_编程(三).ppt》由会员分享,可在线阅读,更多相关《第5讲-3_Oracle_编程(三).ppt(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第5 5讲讲讲讲 ORACLEORACLE编程基础编程基础编程基础编程基础(三)(三)(三)(三)主要内容主要内容主要内容主要内容PL/SQLPL/SQL简介与运行环境简介与运行环境简介与运行环境简介与运行环境 PL/SQLPL/SQL程序块的组成程序块的组成程序块的组成程序块的组成 事务控制命令事务控制命令事务控制命令事务控制命令 PL/SQLPL/SQL流程控制流程控制流程控制流程控制游标的使用游标的使用游标的使用游标的使用 PL/SQLPL/SQL的异常处理的异常处理的异常处理的异常处理存储过程、函数、触发器存储过程、函数、触发器存储过程、函数、触发器存储过程、函数、触发器 游标提
2、取循环游标提取循环游标提取循环游标提取循环 带参数游标的使用带参数游标的使用带参数游标的使用带参数游标的使用游标的概念游标的概念游标的概念游标的概念 5.6 游标游标隐式游标隐式游标隐式游标隐式游标游标变量游标变量游标变量游标变量游标从字面来理解就是游动的光标。游标从字面来理解就是游动的光标。用用数数据据库库语语言言来来描描述述,游游标标就就是是映映射射在在结结果果集集中中一一行行数数据据上上的的位位置置实实体体,有有了了游游标标,用用户户就就可可以以访访问问结结果果集集中中的的任任意意一一行行数据了。数据了。将将游游标标放放至至在在某某一一行行后后,即即可可对对该该行行数数据据进进行行操操作
3、作,最最常常见见的操作是提取当前行数据。的操作是提取当前行数据。游标游标的的概念概念游标的基本概念 游标示意图 游游标标Oracle游标是一种用于轻松处理多行数据的机制游标是一种用于轻松处理多行数据的机制。没没有有游游标标,Oracle开开发发人人员员必必须须单单独独地地、显显式式地地取取回回并并管管理理游标查询选择的每一条记录。游标查询选择的每一条记录。游游标标包包含含一一个个跟跟踪踪当当前前访访问问的的记记录录的的指指针针,使使程程序序能能够够一一次次处理多条记录。处理多条记录。-游游标标工工作作区区中中,存存在在着着一一个个指指针针(POINTER),在在初初始始状状态态它它指指向向查查
4、询询结结果果的的首首记记录录。要要访访问问查查询询结结果果的的所所有有记记录录,可可以以通通过过FETCH语语句句,进行指针的移动来实现。进行指针的移动来实现。游标游标的概念的概念显式游标显式游标隐式游标隐式游标游标游标的类型的类型步骤一、声明游标步骤二、打开游标步骤三、提取数据显式游标显式游标步骤四、关闭游标 声明游标的语句格式如下声明游标的语句格式如下:DECLARE CURSOR 游标名游标名(参数参数,参数参数.)IS select_statement;声明游标目的:声明游标目的:(1)给游标命名;)给游标命名;(2)将一个查询与游标关联起来。)将一个查询与游标关联起来。例如:例如:d
5、eclare cursor c1(a number,b varchar2(20)isSelect EMPNO,ENAME,JOB from emp where deptno=b and sal=a;5.6.1.1 游标游标的声明的声明 打开游标的语句格式如下:打开游标的语句格式如下:OPEN cursor_name;打开游标将激活查询并识别活动集,可是在执行游标取回命令之打开游标将激活查询并识别活动集,可是在执行游标取回命令之前,并没有真正取回记录。前,并没有真正取回记录。OPEN命令还初始化了游标指针,使其指向活动集的第一条记录。命令还初始化了游标指针,使其指向活动集的第一条记录。游标被打开
6、后,直到关闭之前,取回到活动集的所有数据都是静游标被打开后,直到关闭之前,取回到活动集的所有数据都是静态的。换句话说,游标忽略所有在游标打开之后,对数据执行的态的。换句话说,游标忽略所有在游标打开之后,对数据执行的SQL DML命令命令(INSERT、UPDATE、DELETE和和SELECT),因此只有,因此只有在需要时才打开它在需要时才打开它要刷新活动集,只需关闭并重新打开游标即可。要刷新活动集,只需关闭并重新打开游标即可。5.6.1.2打开游标打开游标 提取数据使用提取数据使用FETCH语句,语句,FETCH命令的语句格式如下:命令的语句格式如下:FETCH cursor_name IN
7、TO variable_name,variable_name.FETCH cursor_name INTO record_name;cursor_name是已经打开的游标的标识;是已经打开的游标的标识;variable_name是已经被声明的是已经被声明的PL/SQL变量;变量;record_name是已经被声明的是已经被声明的PL/SQL记录。记录。INTO子句中的变量个数、顺序、数据类型必须与工作区中每子句中的变量个数、顺序、数据类型必须与工作区中每行记录的字段数、顺序以及数据类型一一对应。行记录的字段数、顺序以及数据类型一一对应。5.6.1.3 提取数据提取数据 在在使使用用FETCH语
8、语句句之之前前必必须须先先打打开开游游标标,这这样样才才能能保保证证工工作区中有数据作区中有数据。FETCH命令以每次一条记录的方式取回活动集中的记录。命令以每次一条记录的方式取回活动集中的记录。通通常常将将FETCH命命令令和和某某种种迭迭代代处处理理结结合合起起来来使使用用,在在迭迭代代处处理理中中,FETCH命命令令每每执执行行一一次次,游游标标前前进进到到活活动动集集的的下下一一条记录。条记录。执行执行FETCH命令后,活动集中的结果被取回到命令后,活动集中的结果被取回到PL/SQL变变量中,以便在量中,以便在PL/SQL块中使用。每取回一条记录,游标的指块中使用。每取回一条记录,游标
9、的指针就移向活动集的下一条记录。针就移向活动集的下一条记录。游标指针只能向下移动,不能回退。如果想查完第二条记游标指针只能向下移动,不能回退。如果想查完第二条记录后又回到第一条记录,则必须关闭游标,然后重新打开游录后又回到第一条记录,则必须关闭游标,然后重新打开游标。标。5.6.1.3 提取数据提取数据 关关闭闭游游标标的的作作用用在在于于,使使游游标标所所对对应应的的内内存存工工作作区区变变为为无效,并释放与游标相关的系统资源。无效,并释放与游标相关的系统资源。CLOSE语句的格式:语句的格式:CLOSE cursor_name;CLOSE语句关闭以前打开的游标,使得活动集不确定。语句关闭以
10、前打开的游标,使得活动集不确定。如如果果在在已已关关闭闭的的游游标标上上执执行行其其他他操操作作,将将引引起起预预定定义义例例外外:invaild-cursor,相当于相当于oracle错误错误ORA010015.6.1.4 关闭游标关闭游标 该例子用显式游标显示score_table表中的所有学生的数学成绩;SET SERVEROUTPUT ON;DECLARE v_name score_table.name%TYPE;v_maths score_table.maths%TYPE;CURSOR c IS SELECT name,maths FROM score_table;BEGIN OPE
11、N c;LOOP FETCH c INTO v_name,v_maths;EXIT WHEN c%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_name|的数学成绩是的数学成绩是|v_maths);END LOOP;CLOSE c;END;举举 例例 SET SERVEROUTPUT ON;DECLARE v_student score_table%ROWTYPE;CURSOR c IS SELECT*FROM score_table;BEGIN OPEN c;LOOPFETCH c INTO v_student;EXIT WHEN c%NOTFOUND;DBMS_OUTPU
12、T.PUT_LINE(v_student.name|数学成绩是|v_student.maths|语文成绩是|v_student.chinese);END LOOP;CLOSE c;END;举举 例例 每一个显式游标有四种属性:每一个显式游标有四种属性:%notfound,如如 果果 最最 后后 FETCH语语 句句 执执 行行 时时 返返 回回 一一 行行,则则 NOTFOUND为为FALSE;如如果果最最后后FETCH语语句句没没返返回回行行,则则NOTFOUND为为TRUE。可利用。可利用NOTFOUND退出循环。退出循环。例:例:LOOP FETCH C1 INTO My_ename,M
13、y_deptno;EXIT WHEN C1NOTFOUND;.ENDLOOP;当当 FETCH语语 句句 没没 有有 获获 取取 行行 时时,C1 NOFOUND为为TRUE,退出当前循环退出当前循环在第一个在第一个fetch执行之前,执行之前,%notfound返回返回null值。值。Fetch一个未打开的游标,将引起一个未打开的游标,将引起invaild_cursor例外。例外。5.6.1.5 游标属性游标属性%found,布布尔尔型型属属性性,为为%notfound 的的逻逻辑辑非非。如如果果最最后后FETCH语语句句执执行行时时返返回回行行。%FOUND为为TRUE;如如果果未未返返回
14、回行行,%FOUND则则为为FALSE。在在第第一一个个fetch执执行行之之前前,%found返返回回null值。值。%rowcount,返返回回游游标标打打开开后后,由由FETCH语语句句已已获获取取的的行行数数。在在fetch语句前,语句前,%rowcount返回返回0值。值。例如:例如:LoopFetch cursor_name into 实变量列表;实变量列表;If cursor_name%rowcount=0 then End if;End loop;游标属性游标属性%isopen,标标识识当当前前游游标标的的状状态态,true标标识识游游标标已已打打开,开,false标识游标未打
15、开。标识游标未打开。例如:例如:If cursor_name%isopen thenElseOpen cursor_name(实参列表);实参列表);End if;游标属性游标属性 SQL游标也可以叫做隐式游标。即游标也可以叫做隐式游标。即oracle执行执行sql语句时隐式创建的游标。语句时隐式创建的游标。和显式的游标不同,不能对一个和显式的游标不同,不能对一个SQL游标显式的执行游标显式的执行OPEN,CLOSE和和FETCH语句。语句。伴随着伴随着sql操作,操作,Oracle隐式打开隐式打开SQL游标、处理游标、处理SQL游标、然后再自动关闭游标、然后再自动关闭游标。游标。Oracle
16、提供隐式游标涉及的提供隐式游标涉及的sql语句有:语句有:insert、delete、update和和select into语语句。句。Oracle提供隐式游标主要目的是利用游标属性来确定提供隐式游标主要目的是利用游标属性来确定SQL语句运行的情况。语句运行的情况。注意:注意:使用使用select into语句返回的行数,即语句返回的行数,即%rowcount返回值不能多于返回值不能多于1行,否则,将行,否则,将引起引起too_many_rows例外。例外。隐式游标的隐式游标的isopen属性始终为属性始终为false.5.6.1.6 SQL游标游标 一、直到型循环一、直到型循环这种类型的提取
17、循环,游标处理使用的是简单的循环语法(这种类型的提取循环,游标处理使用的是简单的循环语法(LOOP.END LOOP)。显式游标属性控制该循环执行的次数,如下例所示:)。显式游标属性控制该循环执行的次数,如下例所示:SET SERVEROUTPUT ON;DECLARE v_studentfee student_fee.allfee%TYPE;v_studentname student_fee.name%TYPE;CURSOR c IS SELECT allfee,name FROM student_fee;BEGIN OPEN c;LOOP FETCH c INTO v_studentfee
18、,v_studentname;DBMS_OUTPUT.PUT_LINE(v_studentname|应交学费应交学费|v_studentfee|元元);EXIT WHEN c%NOTFOUND;END LOOP;CLOSE c;END;EXIT WHEN语句的位置应紧跟在语句的位置应紧跟在FETCH语句后面。语句后面。5.6.2 游标提取循环游标提取循环 二、二、WHILE循环循环同样我们也可以使用同样我们也可以使用WHILELOOP语法来构建游标提取循环,我们将上面的语法来构建游标提取循环,我们将上面的例子用例子用WHILE循环实现来说明这种循环。循环实现来说明这种循环。SET SERVER
19、OUTPUT ON;DECLARE v_studentfee student_fee.allfee%TYPE;v_studentname student_fee.name%TYPE;CURSOR c IS SELECT allfee,name FROM student_fee;BEGIN OPEN c;FETCH c INTO v_studentfee,v_studentname;WHILE c%FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_studentname|应交学费应交学费|v_studentfee|元元);FETCH c INTO v_studentfee,v_
20、studentname;END LOOP;CLOSE c;END;5.6.2 游标提取循环游标提取循环 三、三、FOR循环循环 系统自动打开游标,不用显式地使用系统自动打开游标,不用显式地使用OPEN语句打开;系统隐含地语句打开;系统隐含地定义了一个数据类型为定义了一个数据类型为%ROWTYPE的变量,并以此作为循环的计算器。系的变量,并以此作为循环的计算器。系统重复地自动从游标工作区中提取数据并放入计数器变量中统重复地自动从游标工作区中提取数据并放入计数器变量中(不需要使用不需要使用Fetch);当游标工作区中所有的记录都被提取完毕或循环中断时,系统自当游标工作区中所有的记录都被提取完毕或循
21、环中断时,系统自动地关闭游标动地关闭游标(不需要使用不需要使用close)。SET SERVEROUTPUT ON;DECLARE CURSOR c IS SELECT*FROM student_fee;BEGIN FOR v_student IN c LOOP DBMS_OUTPUT.PUT_LINE(v_student.name|应交学费应交学费|v_student.allfee|元元);END LOOP;END;5.6.2 游标提取循环游标提取循环 1、在获取游标数据时,为何要用循环?、在获取游标数据时,为何要用循环?思考题思考题 2、游标提取循环使用、游标提取循环使用for循环的例子中
22、,循环的例子中,v_student需要提前需要提前声明吗?声明吗?答:用答:用fetch获取数据时,每次只能获取一行数据,而满获取数据时,每次只能获取一行数据,而满足条件的行可能有很多行,因此为了获得所有数据,需足条件的行可能有很多行,因此为了获得所有数据,需要采用循环来实现。要采用循环来实现。答:答:v_student不需要在不需要在declare中声明,因为在中声明,因为在PL/SQL的的for循环中,变量可以不用声明,直接拿来使用。从示例循环中,变量可以不用声明,直接拿来使用。从示例中可以看到,中可以看到,v_student的类型为记录,这完全取决于语的类型为记录,这完全取决于语句句FO
23、R v_student IN c。带参数的游标声明语法如下:带参数的游标声明语法如下:CURSOR 游标名游标名(参数参数,参数参数.)IS select_statement;参数部分包括参数名和数据类型,定义参数的语法如下:参数部分包括参数名和数据类型,定义参数的语法如下:Parameter_name IN data_type:=|DEFAULT value;Parameter_name为参数名,为参数名,data_type为数据类型,为数据类型,IN表示表示参数默认为输入参数,参数默认为输入参数,DEFAULT value是参数的默认值。是参数的默认值。5.6.3 带参数游标的使带参数游标
24、的使用用 例如:例如:DECLARE CURSOR merchandise_cursor(PLACE in varchar2 DEFAULT 北京市北京市)ISSELECT 商品编号,商品名称,产地,单价商品编号,商品名称,产地,单价FROM 商品信息商品信息 WHERE 产地产地=PLACE;注:注:在指定数据类型时,不能使用长度约束,如在指定数据类型时,不能使用长度约束,如NUMBER(4)、VARCHAR(10)等都是错误的。等都是错误的。5.6.3 带参数游标的使带参数游标的使用用 例如:例如:OPEN merchandise_cursor;如果执行该语句,其输入参数将使用其默认值,即
25、查询所有如果执行该语句,其输入参数将使用其默认值,即查询所有产地为产地为“北京市北京市”的商品信息。如果要查询产地为的商品信息。如果要查询产地为“广州市广州市”的商品信息,则可以传递参数的商品信息,则可以传递参数“广州市广州市”,如下所示:,如下所示:OPEN merchandise_cursor(广州市广州市);5.6.3 带参数游标的使带参数游标的使用用 例如:例如:CURSOR C(score NUMBER)ISSELECT name FROM score_table WHERE mathsscore;可用下列打开游标语句可用下列打开游标语句:OPEN C1(80);表示成绩表中数学成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- _Oracle_ 编程
限制150内