PLSQL程序设计(基础篇).doc_第1页
PLSQL程序设计(基础篇).doc_第2页
PLSQL程序设计(基础篇).doc_第3页
PLSQL程序设计(基础篇).doc_第4页
PLSQL程序设计(基础篇).doc_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PL/SQL程序设计(上册)写在前面之所以不怕麻烦把有关PL/SQL的知识写下来,一方面,是为了加深理解,便于以后随时翻阅,另一方面,是因为自己看书总是不能从头看到尾,仔仔细细,喜欢跳跃式阅读,导致学习过程中,容易有遗漏。所以,将学习到的知识总结起来,方便监督自己,方便大家查阅。本文所记录的内容当然不是本人凭经验而写,而是学习的笔记,参考的资料以Oracle9i PLSQL Fundamentals和Oracle9i Develop PLSQL Program Units 为核心,其次,还包括精通Oracle10g PLSQL编程和Oracle PLSQL Best Practices等。由于是学习笔记么,说是教程,其实是在吸引大家的注意,呵呵,主要是想在方便大家查阅和入门者入门外,希望大家多多指教,多多提出意见,共同把这块知识学熟、学通、学透。Quasar Weis Email: Quasar Weis QQ: 734089783Quasar Weis Real Name: WeiZhaozhe of NEU目录PL/SQL程序设计(上册)1第一章 认识PL/SQL3第二章 SQL回顾5第三章PL/SQL的基本结构7第四章PL/SQL的数据类型及使用10第五章 流程控制29第六章 游标35第七章 异常处理46第八章 下册预知49第一章 认识PL/SQL这一章主要记录了两个问题:1 什么是PL/SQL? 2 PL/SQL有什么优势?下面从这两个问题展开论述。什么是PL/SQL?PL/SQL即procedural language/standard query language, PL/SQL是具备程序设计语言特性(如:定义变量、流程控制、面向对象等)的、关系数据库标准查询语言SQL的过程性拓展(procedural extension)。SQL是非过程语言,非过程,让我理解,就是不用你了解语句的处理过程,而直接达到开发者的目的。如:select name from student这条语句,就是向数据库说:“我要学生的姓名”,然后数据库就会返回相应的字段值而我们并不知道它是如何处理的也基本无法控制。而PL/SQL语言,则具备程序设计语言甚至高级程序设计语言的特点,更好地满足我们对数据的操作。PL/SQL有什么优势?PL/SQL的优势可以概括为以下五点(待补充):1 具备程序设计语言的特性(模块化、信息隐藏、面向对象等);2 异常处理,PL/SQL具备异常处理的机制;3 可移植,想想Java吧,看看两者有什么共同之处?PL/SQL的JVM就是Oracle Server,呵呵4 改善性能,一方面,通过PL/SQL语句块(Block)可以一次性向Oracle Server发送多个SQL语句,减少网络的传输;另一方面,有些PL/SQL可以在客户端执行(前提是某些客户端含有PL/SQL引擎),可以有效的减少与Oracle Server的交互;再有,PL/SQL通常会存储在Oracle数据库中,这对于网络程序来说真是天降福音,因为,这样一系列的处理交互,都可以以一个调用数据库本身存在的程序而完成,大大提高了性能。5 可以与SQL交互,在PL/SQL中可以嵌入SQL的DML、DQL、TCL(事务控制语言)语句。第二章 SQL回顾你都开始对PL/SQL感性趣了,那么SQL肯定是多多少少听说过的,呵呵,就回顾一些基础吧,那些拓展的内容,建议是遇见了再研究吧。DQL:源码dql.sql:select dname, max(sal) - 5 对列筛选(分组字段或聚集函数)from emp left outer join dept - 1 确定表using(deptno)where deptno 0 - 2 确定行(记录)group by dname - 3 将行分组 having max(comm) is null or max(comm) 0 - 4 对组筛选 order by dname - 6 对结果集排序如上的源码表示了SQL语句的执行顺序,这个一定要理解好啊!思考题:问题:为什么带有group by的select和having只能含有分组字段和聚集函数呢?答:因为group by分组后,只能对组进行操作了。也就是说,无论你是筛选行having还是列select,都要以组为单位进行,所以只能使用组共有的属性,除了分组字段外,只有像什么每组的最大值啊、最小值啊、平均值啊等等这些组的特性或叫 组员共有的特性。所以在使用时一定注意,带有group by后,having和select中只能有-分组字段和聚集函数DML:insert into values就不再重复了,不过听说现在可以一次性向多个表中插入呢,使用insert into all和insert into first,具体用法如下:insert into all/first when 条件 then into 表1when 条件 then into 表2when 条件 then into 表3else into 表4select from 表源至于ALL和FIRST的区别就是:如果是ALL,就会插入所有满足条件的表,而如果是FIRST直插入第一个满足条件的表。TCL:commit;rollback to A;savepoint A;不多写了,因为我也只知道这点儿了,呵呵,不过听说SQL有个优化hint挺好玩,如:insert /+append+/ into table values XXX;还有对Group by的拓展rollup和cube,还有grouping函数、group set等,以后再研究把,谁让俺是菜鸟呢?第三章PL/SQL的基本结构本章将从PL/SQL的分类、PL/SQL的基本结构以及第一个PL/SQL程序展开。PL/SQL的分类:按照PL/SQL的运行环境,可以分为客户端PL/SQL和服务器端PL/SQL。通常,我们(指开发者)接触到的PL/SQL都是存储在服务器Oracle数据库中的,所以主要学习这一种就可以了,至于客户端的PL/SQL,我也不太了解啊,o()o 唉希望大虾在与我联系,加上啊!按照形式,可分为命名的PL/SQL和匿名的PL/SQL,其中,命名的,又可以分为子程序和触发器,而子程序又可以分为包、函数、过程。是不是有点儿?不过不要紧,等你看过整个文章,再回来看就是很简单了。PL/SQL的基本结构如下:Declare在这里可以定义变量、常量、异常等。Begin 在这儿可以写一些执行SQL或PL/SQL语句。Exception这儿可以捕获并处理异常怎样在发生异常后让程序继续执行其他语句呢? 答:写在这块儿不就得了,呵呵 End;结束了,别忘了“;”啊,呵呵你的第一个程序?也是我的,“hello, world!”有人说hello world太老套了,boring,有什么,在你什么都不懂时还能开发出更高级的么,我们就hello world呵呵。源码:说明:源码都是由PL/SQL Developer 8开发,于Oracle10g测试- Created on 2010-4-27 by Quasar /*这就是你的第一个程序了,也是我的,哈哈*/declare msg varchar2(15); -定义变量begin msg := Hello World; -赋值 dbms_output.put_line(msg); -内置包使用 end;运行结果:Hello WorldPL/SQL的注释可以通过这个程序看出来啊,自己看吧,不多说了第四章PL/SQL的数据类型及使用本章将介绍PL/SQL的数据类型,有些数据类型很“简单”,有些很难理解,不过都是因为这些数据类型你没有使用过,用几次就知道了,在这里,先认识认识它们,不熟也没关系。PL/SQL的变量类型可以分为标量、复合类型、参照类型和LOB类型四类,下面就分别介绍给大家。标量,就是单值变量,这么说应该可以理解吧。常用的类型如下:字符串:varchar2(n)、char(n)、long、long raw在程序设计中,常常用到字符串的处理,在PL/SQL中,有很好的支持,不但有字符串函数,还有对正则表达式的支持。我们最常用的数据类型就是varchar2(n)了,n用于最大字符长度。其中,char和long、long raw不推荐使用,原因是:前者浪费资源后者不够灵活。数字:number(m, n)、binary_integer、binary_float、binary_double对于数字类型,number是不错的选择,那么m, n代表什么呢?如果定义为number(6, 2)则代表整数位最大长度是4,小数位最大长度是2,你猜猜吧,m和n的含义。其中,binary_integer在定义表时是很常用的。binary_float和binary_double是Oracle 10g的新数据类型,注意在赋值时格式分别如下:223.4323f和23423.4545d,像Java吧,可能都遵循IEEE-754的浮点数标准吧。布尔:Boolean 布尔值分别为:TRUE、FALSE、NULL日期:Date和TimestampDate默认只显示日期,而Timestamp默认情况下会显示时间信息,还有上下午标志呢,Timestamp是Oracle 9i新加入的数据类型。标量的定义格式:vname DATATYPE CONSTANTNOT NULL := / DEFAULT exp 例如:name varchar2(30); REAL_NAME varchar2(30) constant default 魏照哲; name varchar2(10) := hello; 下面是一个标量使用的例子程序:源码:scalar.tst例子程序来自scott/scott用户或hr/hr用户(alter user scott account unlock解锁)- Created on 2010-4-27 by Quasardeclare eno number(4); empname varchar2(3); empjob varchar2(9);begin select empno, ename, job into eno, empname, empjob from emp where empno = 7788; dbms_output.put_line(Oracle第一个员工的信息:); dbms_output.put_line(员工号:|eno); dbms_output.put_line(员工姓名:|empname); dbms_output.put_line(职位:|empjob);end;运行结果:如上就是说varchar2不够长啊,呵呵,交给你个定义标量scalar的法宝:%TYPE,通过它你就可以使用字段的数据类型了,避免类型不匹配等错误。更改程序empname的定义如下:empname emp.ename%TYPE;运行结果:Oracle第一个员工的信息:员工号:7788员工姓名:SCOTT职位:ANALYST接下来就是复合变量,即多值变量,包括:记录、索引表、嵌套表、变长数组。其中,后三者有可叫做集合(collection)。分别针对不同的数据结构使用,如记录是单行多列时使用,其他三个是多行单列,行和列就代表数据库表的行和列,慢慢体会啊记录:记录,用于存储单行多列,即数据库表中的一条记录。记录的定义有两中格式,一种是自定义记录类型,然后通过自定义类型定义;一种是通过表或游标的%ROWTYPE属性定义,还记得字段的%TYPE么,差不多。游标在后文中介绍。自定义:TYPE rname_type IS RECORD (col1 CTYPE,col2 CTYPE,col3 CTYPE);ranme rname_type;光说不练犯晕啊,呵呵,下面就看一些记录的应用吧。源码record.tst:- Created on 2010-4-27 by Quasar declare -通过自定义和%ROWTYPE属性定义变量 type emp_basic_record is record ( eno emp.empno%type, empname emp.ename%type, empjob emp.job%type ); emp_basic_info emp_basic_record; emp_detail_info emp%rowtype; begin select empno, ename, job into emp_basic_info from emp where empno = 7788; dbms_output.put_line(员工7788基本信息:); dbms_output.put_line(姓名:|emp_basic_info.empname); dbms_output.put_line(工作:|emp_basic_info.empjob); -来了一个新的scott员工 select ename, job, mgr, sal into emp_detail_info.ename, emp_detail_info.job, emp_detail_info.mgr, emp_detail_info.sal from emp where empno = 7788; emp_detail_info.empno := 8899; emp_detail_info.hiredate := sysdate; -入职吧 insert into emp values emp_detail_info; commit; dbms_output.new_line; dbms_output.put_line(入职员工:|emp_detail_info.empno); -老的scott受不了小的scott,让他改名为 lit scott emp_detail_info.ename := lit scott; update emp set row = emp_detail_info where emp.empno = 8899; commit; dbms_output.new_line; dbms_output.put_line(入职员工改名为:|emp_detail_info.ename); -小scott被fire了 delete from emp where emp.empno = emp_detail_info.empno; commit; dbms_output.new_line; dbms_output.put_line(员工离职,是谁?|emp_detail_info.ename); end;运行结果:员工7788基本信息:姓名:SCOTT工作:ANALYST 入职员工:8899 入职员工改名为:lit scott 员工离职,是谁?lit scott以上的代码说明了记录类型的变量在select into、insert、update、delete中的应用,极其记录子元素的使用。其中有个新的关键自,就是row代表表中的一行,猜也猜到了吧!集合:PL/SQL表(传统叫做索引表,又叫index_by table),是一种PL/SQL特有的、单维的、无容量限制的、松散存储的列表结构。用于存储多行单列的数据,有点儿类似高级语言中的数组,而记录跟C语言中的结构体类似。不可以作为表的字段类型。注意:在Oracle9i以后,叫做PL/SQL表了,因为索引的类型不再局限在binary_integer了,可以是varchar2和pls_integer。也叫做关联表(associative table).下面就看看怎么使用吧!源码plsqltable.tst:- Created on 2010-4-27 by Quasar declare type names_type is table of emp.ename%type index by binary_integer; names names_type; type ano_names_type is table of emp.ename%type index by varchar2(10); ano_names ano_names_type;begin names(2) := Elaine; names(-18) := Soprano; ano_names(girl) := Elaine; ano_names(man) := Soprano; dbms_output.put_line(ano_names(girl); dbms_output.put_line(names(-18); end;运行结果:ElaineSoprano以上是PLSQL TABLE的使用,其索引不仅仅可以是binary_integer哦! 嵌套表(nested table),它与plsql表不同,定义需要create语句,也正因为此,可以作为数据库表的字段。它也是单维的、容量无限的,初始情况下是密集存储的,但是经过删除则变为稀疏的了。索引是1到很大的整数啊! 定义格式之类的啊,说一些理论还不如让你看源码,呵呵,但还是补充一句,定义分为两种:SQL定义和编程定义,格式如下:create or replace type XXX is table of XXX;type XXX is table of XXX;首先,定义类型createnestedtable.sql:源码nestedtable.tst:- Created on 2010-4-27 by Quasar declare insert_table nested_names_type := nested_names_type(Jack, Quasar, Patrick, Shu); get_nested_names nested_names_type; type ano_nested_names_type is table of varchar2(30); prog_nested_names ano_nested_names_type := ano_nested_names_type();begin insert into test_nested_table values(1234, insert_table); commit; select tnt.nested_names into get_nested_names from test_nested_table tnt where id = 1234; for i in get_nested_names.first.get_nested_names.last loop dbms_output.put_line(get_nested_names(i); end loop; prog_nested_names.extend(2); prog_nested_names(1) := Quasar; prog_nested_names(2) := Elaine; end;运行结果:JackQuasarPatrickShu以上的程序说明了嵌套表的使用特点,类型定义可以在SQL语句中,也可以在PLSQL程序中,而且前者可以作为表的字段类型,注意的是必须使用nested table XXX store as XXX,后面学的varray就不用指定存储表,因为它是存储在所在表中。使用前要使用构造函数初始化,向Java一样,然后,在使用时,一般使用内置extend拓展并初始化单个元素。变长数组varray和嵌套表很像啊,区别就是varray容量有限是紧凑储存的而且使用它作为字段时不需要指定存储表。不多说了,直接看源码吧。首先,定义必须的前提createvarray.sql:源码varray.tst:- Created on 2010-4-27 by Quasar declare type prog_vr_names_type is varray(10) of varchar2(20); prog_vr_names prog_vr_names_type := prog_vr_names_type(); put_vr_names varray_type := varray_type(Jacky, Christfa); get_vr_names varray_type; begin prog_vr_names.extend(3); prog_vr_names(1) := Elaine; prog_vr_names(3) := Jobh; insert into test_varray values(1234, put_vr_names); commit; select tv.vr_names into get_vr_names from test_varray tv where tv.id = 1234; dbms_output.put_line(共取出记录:|get_vr_names.count|条!);end;运行结果:那还用问,必须的,两条啊! 以上学习了复合类型的使用,后面还要学习集合类型的函数使用,不过,我猜我现在对集合类型的了解有点混乱,先给大家列个表吧,然后再继续学习集合类型。特性索引表嵌套表变长数组存储类型稀疏初始稀疏一直稀疏容量限制无限无限有限可以用于表字段类型不可以可以,但必须指定存储表可以初始化前空集合NULLNULL元素初始化默认为空构造函数+extend构造函数+extend索引类型数字、字符串1- 很大1 很大差不多得了,主要是会用,呵呵,下面就学学集合函数吧!集合提供给大家如下函数,见下表:函数作用用法索引表嵌套表变长数组EXTEND增加一个空元素extend(n)NYYDELETE删除元素delete全部 delete(n)delete(m,n)NYYTRIM从尾部删除trim一个trim(n)NY Y还有就是一些其他的函数了,包括:EXISTS, COUNT, LIMIT(只适用于VARRAY),FIRST和LAST下标, PRIOR和NEXT下标。 集合的操作不只是这些,不过我是一时接受不了太多.还包括集合赋值、集合比较啊,使用时再细细体会吧!希望大虾赐教啊!在这一部分当中,批量绑定很重要啊,能够大大提高在处理集合时的效率,感觉也比较常用,主要是forall和bulk collect两种语法,下面就学学批量绑定(bulk binding)吧!FORALL:使用格式:FORALL index IN start.end FORALL index IN INDICES OF collectionFORALL index IN VALUES OF indexs_collectionBULK COLLECT:使用格式: .BULK COLLECT INTO collection源码bulkbinding.tst:- Created on 2010-4-28 by Quasar declare type dname_table_type is table of dept_bck.dname%type; v_dname_table dname_table_type; v_return_table dname_table_type; v_dname dept_bck.dname%type; type index_table_type is table of binary_integer; v_index_table index_table_type := index_table_type(2,4);begin -bulk collect select dname bulk collect into v_dname_table from dept_bck; -forall in . forall i in v_dname_table.first.v_dname_table.last update dept_bck set dname = v_dname_table(i) returning dname bulk collect into v_return_table; -DML returning dbms_output.put_line(DML影响的行数bulkbinding:|v_return_table.COUNT); commit; -plain insert insert into dept_bck values(90, YYYY, XXXX) returning dname into v_dname; dbms_output.put_line(插入:|v_dname|sql%rowcount); -implicit cursor or SQL cursor -forall in indices of . v_dname_table(2) := null; forall i in indices of v_dname_table update dept_bck set dname = v_dname_table(i); dbms_output.put_line(第2个元素影响的行数为:|sql%bulk_rowcount(2); commit; -forall in values of . forall i in values of v_index_table update dept_bck set dname = v_dname_table(i); commit;end; 以上代码介绍了bulk binding中forall和bulk collect的使用,其中,forall针对集合的不连续性,又有forall in indices of 和 forall in values of 变体,挺好的啊!哈哈哈除了批量绑定forall和bulk collect之外,你发现什么了?对了,sql%bulk_rowcount是专门为批量绑定而设的游标属性,就是决定了在批量操作中,某个元素所影响的行数。还有returning之句,可以获得DML的影响结果记录。游标,很常用的,这里隐隐约约提到了隐式游标,后文会开一章详细讨论游标CURSOR!参照变量: 参照变量是存放数值指针的变量,可以通过参照变量,共享相同的对象,降低占用空间。参照变量包括游标变量(ref cursor)和对象类型便来那个(ref object_type)两种,其中,两者都将在后文中介绍,不过,还是先认识以下游标变量吧,感性的认识哦!源码refcursor.tst:- Created on 2010-4-29 by Quasardeclare type emp_ref_cur_type is ref cursor; v_emp_ref_cur emp_ref_cur_type; -v_emp emp%rowtype; type emp_table_type is table of emp%rowtype; emp_table emp_table_type;begin open v_emp_ref_cur for select * from emp; fetch v_emp_ref_cur bulk collect into emp_table; - bulk collect close v_emp_ref_cur; dbms_output.put_line(员工信息表单如下:); for i in emp_table.first.emp_table.last loop dbms_output.put_line(工号:|emp_table(i).empno); dbms_output.put_line(姓名:|emp_table(i).ename); dbms_output.put_line(工作:|emp_table(i).job); dbms_output.put_line(工资:|emp_table(i).sal); dbms_output.put_line(补助:|nvl(emp_table(i).comm, 0); dbms_output.new_line; end loop;end;以上讲了标量、复合变量(记录和集合)、参照变量(游标变量和对象类型便变量),还差一个就是大对象LOB了,在这里就介绍以下,后面另开辟一章单独讲解对它的处理。LOB:大对象在Oracle中有两种:内部LOB,外部LOB;内部LOB包括CLOB、NCLOB、BLOB;外部LOB只包含BFILE。内部LOB存储在数据库中,数据的操作支持事务。外部的LOB存储在OS操作系统中,如BFILE,数据库存放的是在OS中的文件指针。CLOB/NCLOB用于存储字符文件,BLOB用于存储二进制文件。BFILE用于存储二进制文件,如:电影。学习了这章,你有点儿迷糊,是啊,文章结构弄错了,应该先学下一章,流程控制,哈哈哈第五章 流程控制在上一章节的例子中,你可能认识了循环,还有些什么流程控制呢?那还用说,无非那主要的三种:顺序、选择、循环,还有那臭名昭著的goto,没什么可说的,就直接代码展示吧,呵呵,其实是不会写选择结构:语法:if XXX thenelsif XXX thenelsif XXX then else XXXend if;case when XXX thenwhen XXX thenelse XXXend case;循环结构语法:loop exit when end loop;while loop end loop;for XXX in . loopend loop;顺序结构:goto label;源码control.tst:- Created on 2010-4-29 by Quasar declare dept_record dept%rowtype; emp_record emp%rowtype; cursor dept_cur is select * from dept; type emp_table_type is table of emp_record%type; emp_table emp_table_type;begin if dept_cur%isopen then -if null; else open dept_cur; dbms_output.put_line(open.); end if; /* open后才可以使用属性 found notfound rowcount的默认值 */ dbms_output.put_line(cursor%isopen的初始值:|BooleanToChar(dept_cur%isopen); dbms_output.put_line(cursor%found的初始值:|BooleanToChar(dept_cur%found); dbms_output.put_line(cursor%notfound的初始值:|BooleanToChar(dept_cur%notfound); dbms_output.put_line(cursor%count的初始值:|dept_cur%rowcount); while TRUE loop - while fetch dept_cur into dept_record; if dept_cur%found then dbms_output.put_line(dept_record.dname| locating in |dept_record.loc); else dbms_output.put_line(no data end!); exit; end if; end loop; /* 取值后 */ dbms_output.put_line(cursor%isopen的初始值:|BooleanToChar(dept_cur%isopen); dbms_output.put_line(cursor%found的初始值:|BooleanToChar(dept_cur%found); dbms_output.put_line(cursor%notfound的初始值:|BooleanToChar(dept_cur%notfound); dbms_output.put_line(cursor%count的初始值:|dept_cur%rowcount); if dept_cur%isopen then close dept_cur; end if; /* select * bulk collect into emp_table from emp; dbms_output.new_line; for i in emp_table.first.emp_table.last loop - for case emp_table(i).empno when 7788 then dbms_output.put_line(This is the first employee:SCOTT!); else dbms_output.put_line(This is |emp_table(i).ename); end case; - case end loop;*/ end; 除了认识这些控制流程语句,还附加地通过这个了解了游标的属性,下一章就是处理多行数据时最常用的、最好用的、最简便的游标了,哈哈哈,拭目以待吧!呵呵呵第六章 游标游标,cursor是oracle9i之前处理多行数据的唯一选择,不过现在你可以使用前面介绍的select XX bulk collect into from了。虽然如此,游标的灵活与简便性还是不可代替的。游标可以分为隐式游标和显示游标。隐式游标具备游标的特性,是在Oracle执行SQL语句时提供给用户的游标,命名为SQL,可以通过SQL%XXX访问游标的四个属性:ISOPEN/FOUND/NOTFOUND/ROWCOUNT(注意这个属性,可能跟你理解的不同啊),这几个属性的含义分别是:除了isopen外,在通过fetch之后,是否找到数据和已经取得几条的意思,在第五章的control.tst中有关这方面的测试,回去看吧!再就是显示游标了,显示游标可以分为:0 普通显示游标1 参数游标、2 游标变量(参照变量的一种)、3 用于DML的游标(简称DML游标)、4 游标表达式(又叫嵌套游标),就这些了,下面就一个一个认识吧。在后面还会涉及到特殊的针对游标的“游标for循环”。显示游标在这个显示游标中,我们将学习使用游标的声明、打开、处理、关闭固定的操作和处理时获得游标数据的三种FETCH语句:FETCH XXX INTO XXX, XXX; (取得一条)FETCH XXX BULK COLLECT INTO XXX; (取得全部)FETCH XXX BULK COLLECT INTO XXX LIMIT XXX; (取得n条)除了按照正常的套路处理游标,还可以使用最简便的游标FOR循环处理游标,游标FOR循环会默认地打开、处理、关闭游标,很好吧,哈哈哈源码plaincursor.tst:- Created on 2010-4-29 by Quasardeclare cursor dept_cursor is -declare select * from dept; d_record dept_cursor%rowtype; type d_table_type is table of d_record%type; d_table d_table_type; type d_varray_type is varray(2) of d_record%type; d_varray d_varray_type; begin -游标for循环1 for dept_record in dept_cursor loop dbms_output.put_line(DEPT:|dept_record.dname); end loop; dbms_output.new_line; -最简单的游标for循环2 for dept_record in (select * from dept) loop dbms_output.put_line(DEPT:|dept_record.dname); end loop; -fetch into dbms_output.new_line; open dept_cursor; - open loop fetch dept_cursor into d_record; -fetch exit when dept_cursor%notfound; dbms_output.put_line(DEPT:|d_record.dname); end loop; close dept_cursor; -close -fetch bulk collect into (without limit) dbms_output.new_line; open dept_cursor; fetch dept_cursor bulk collect into d_table; close dept_cursor; for i in d_table.first.d_table.last loop dbms_output.put_line(DEPT:|d_table(i).dname); end loop; -fetch bulk collect into li

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论