PLSQL高级编程资料
- 格式:pdf
- 大小:209.56 KB
- 文档页数:50
第二部分PL/SQL程序设计基础陈卫星目录第一章PL/SQL 程序设计简介 (4)§1.2SQL与PL/SQL (4)§1.2.1 什么是PL/SQL? (4)§1.2.1 PL/SQL的好处 (4)§1.2.2 PL/SQL 可用的SQL语句 (5)§1.3运行PL/SQL程序 (5)第二章PL/SQL块结构和组成元素 (6)§2.1PL/SQL块 (6)§2.2PL/SQL结构 (6)§2.3标识符 (6)§2.4PL/SQL变量类型 (7)§2.4.1 变量类型 (7)§2.4.2 复合类型(记录和表) (9)§2.4.3 使用%ROWTYPE (10)§2.4.4 LOB类型* (11)§2.4.5 用户定义的子类型 (11)§2.4.6 数据类型的转换* (13)§2.5运算符和表达式(数据定义) (13)§2.5.1 关系运算符 (13)§2.5.2 一般运算符 (13)§2.5.3 逻辑运算符 (13)§2.6变量赋值 (14)§2.6.1 字符及数字运算特点 (14)§2.6.2 BOOLEAN 赋值 (14)§2.6.3 数据库赋值 (14)§2.6.4 可转换的类型赋值 (15)§2.7变量作用范围及可见性 (15)§2.8注释 (16)§2.9简单例子 (16)§2.9.1 简单数据插入例子 (16)§2.9.2 简单数据删除例子 (17)第三章PL/SQL流程控制语句 (18)§3.1条件语句 (18)§3.2循环 (19)§3.3标号和GOTO (21)§3.4NULL语句 (21)第四章游标的使用 (22)§4.1游标概念 (22)§4.1.1 处理显式游标 (22)§4.1.2 处理隐式游标 (26)§4.2游标循环小结 (27)§4.2.1 简单循环 (27)§4.2.2 WHILE循环 (28)§4.2.3 游标FOR循环语句 (28)§4.2.4 关于NO_DATA_FOUND 和%NOTFOUND的区别 (29)§4.2.5 游标修改和删除操作 (29)§4.3游标变量 (30)§4.3.1 声明游标变量 (30)§4.3.2 游标变量操作 (31)§4.3.3 游标变量应用 (31)第五章异常错误处理 (32)§5.1异常处理概念 (32)§5.1.1 预定义的异常处理 (33)§5.1.2 非预定义的异常处理 (34)§5.1.3 用户自定义的异常处理 (34)§5.1.4 用户定义的异常处理 (35)§5.2异常错误传播 (37)§5.2.1 在执行部分引发异常错误 (37)§5.2.2 在声明部分引发异常错误 (37)§5.3异常错误处理编程 (38)§5.4在PL/SQL中使用SQLCODE,SQLERRM (38)第六章存储函数和过程 (40)§6.1引言 (40)§6.2创建函数 (40)§6.3存储过程 (43)§6.3.1 创建过程 (43)§6.3.2 使用过程 (45)§6.3.3 开发存储过程步骤 (47)§6.3.4 与过程相关数据字典( P112) (48)§6.4过程和函数中的异常处理 (48)§6.4.1 使用系统定义的异常处理 (48)§6.4.2 使用用户定义的异常处理+ (49)第七章包的创建和应用 (50)§7.1引言 (50)§7.2包的定义 (50)§7.3包的开发步骤 (51)§7.4包定义的说明 (51)§7.5子程序重载 (59)§7.6删除过程、函数和包 (60)§7.7包的管理 (61)第八章触发器 (62)§8.1触发器类型 (62)§8.1.1 DML触发器 (62)§8.1.2 替代触发器 (62)§8.1.3 系统触发器 (62)§8.2创建触发器 (62)§8.2.1 触发器触发次序 (64)§8.2.2 创建DML触发器 (64)§8.2.3 创建替代(Instead_of)触发器 (65)§8.2.3 创建系统事件触发器 (65)§8.2.4 系统触发器事件属性 (66)§8.2.5 使用触发器谓词 (67)§8.2.6 重新编译触发器 (67)§8.3删除和使能触发器 (67)§8.4触发器和数据字典 (68)§8.5数据库触发器的应用举例 (68)§8.6数据库触发器的应用实例 (78)第一章PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。
实验四PL/SQL高级编程开发语言及实现平台或实验环境:Oracle 11g实践目的(1) 掌握游标、存储过程、存储函数、包、触发器的基本作用。
(2) 掌握存储过程、存储函数、包、触发器的建立、修改、查看、删除操作。
实验要求(1) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。
(2) 掌握游标、存储过程、存储函数、包、触发器的命令。
实验内容1.创建存储过程(1) 将下列的未命名的PL/SQL,转换成存储过程,存储过程名自己设定,注意比较未命名的PL/SQL 与命名的PL/SQL 的差别,如没有where current of 是什么情况。
declarecursor emp_cursor is select * from emp where deptno=10 for update;beginfor emp_record in emp_cursor loopdbms_output.put_line(emp_record.sal);update emp set sal=sal*1.1 where current of emp_cursor;end loop;end;/执行sal=sal*1.1语句时,只对当前游标所指向的对象进行操作。
执行sal=sal*1.1语句时,对所有找到的游标对象进行操作。
(2)(3)任选一个(2) 创建存储过程“dept_count_pro_学号后四位”,实现显示scott方案中dept 表中各本门编号与名称,并显示对应部门的员工姓名和工资。
显示结果可如下图,也可自己设计:(3) 创建存储过程“num_pro_学号后四位”,通过传入参数传入3个数,完成3 个数的从小到大排序,通过 3 个传出参数保存排序后的 3 个数,并执行该存储过程,显示排序结果。
(4)通过user_source 数据字典中查看存储过程。
2.创建函数(1)(2)任选一个(1) 创建存储函数“emp_fun_学号后四位”,通过传入参数传入员工的编号,根据传入的员工编号,检查该员工是否存在。
Oracle PL/SQL高级编程编者语:作者对Oracle开发管理有多年的经验,并在Oracle 数据库的基础上开发了自己的交易控制中间件,适用于金融、电信、交通等多个行业,现就主要开发资料参考资料共享给大家。
祝大家在Oracle平台上更上一层楼,共同进步。
Yangyb123@ 2006-2-14第一章集合 (3)1.1 索引表 (3)1.1.1 定义索引表 (3)1.1.2 将条目插入到索引表中 (3)1.1.3 对索引表中进行操作 (3)1.1.4 索引表中的函数 (4)1.2 嵌套表 (4)1.2.1 初始化嵌套表 (4)1.2.2 扩展嵌套表 (5)1.2.3 删除嵌套表中的条目 (5)1.3 变长数组 (6)1.3.1 定义变长数组 (6)1.3.2 扩展变长数组 (6)1.4 批绑定 (6)1.5 集合的异常处理 (7)第二章触发器 (7)2.1 触发器的创建 (7)2.2 触发器的管理 (7)2.3 触发器的新功能 (9)2.4 替代触发器 (11)2.5 触发器的局限性 (11)第三章对象 (11)3.1 对象的定义 (11)3.2 对象的存贮和检索 (12)第四章调试 (13)4.1 编写DEBUG程序包(例程) (13)4.2 调用函数 (13)第五章大对象类型 (14)5.1 大对象数据类型 (14)5.2 在Oracle8i数据库中使用外部文件: (15)5.3 DBMS_LOB 包 (15)5.3.1 函数说明 (15)5.3.2 应用举例 (18)5.3.3 内部 LOB 的函数和过程 (19)5.3.4 内部 LOB 的函数和过程的应用举例 (23)5.3.5 临时 LOB (23)第六章管理事务和锁定 (24)6.1 事务 (24)6.2 锁定 (25)第七章动态SQL (28)7.1 DBMS_SQL 程序包 (28)7.2 本机动态SQL (28)7.2.1 执行 DDL 语句 (28)7.2.2 使用绑定变量 (29)7.2.3 执行 PL/SQL 块 (29)第八章显示数据 (29)8.1 DBMS_OUTPUT 程序包 (29)8.1.1 开启屏幕显示 (30)8.1.2 关闭屏幕显示 (30)8.1.3 其他函数 (30)8.1.4 引发的异常 (30)8.2 UTL_FILE 程序包 (30)8.2.1 概述 (30)8.2.2 函数描述 (31)8.2.3 例程 (33)8.3 TEXT_IO 程序包 (34)第九章管理数据作业 (34)9.1 DBMS_JOB 包 (34)9.2 使用后台进程 (34)9.3 执行作业 (35)9.3.1 使用SUBMIT 将作业提交给作业队列 (35)9.3.2 使用RUN立即执行作业: (36)9.3.3 作业环境 (36)9.4 查看作业 (36)9.4.1 DBA_JOBS 视图的结构 (37)9.4.2 DBA_JOBS_RUNNING 视图的结构: (37)9.5 管理作业 (37)9.5.1 删除作业 (37)9.5.2 修改作业 (37)9.5.3 导入和导出作业 (38)9.5.4 处理损坏的作业 (38)9.5.5 例程 (38)第十章过程通信 (40)10.1 报警(DBMS_ALERT程序包) (40)10.1.1 建立报警的次序 (40)10.1.2 函数应用和说明 (40)10.1.3 应用举例 (42)10.2 DBMS_PIPE 程序包 (42)10.2.1 公有管道和私有管道 (43)10.2.2 使用管道 (43)10.2.3 DBMS_PIPE包的函数 (43)10.2.4 例程 (46)10.3 DBMS_ALERT 与 DBMS_PIPE 的比较 (47)第十一章 PL/SQL 和 JAVA (48)11.1 Oracle JAVA (48)11.2 装载、应用、删除JAVA (50)第一章集合1.1 索引表索引表是将数据保存在内存中!!!1.1.1 定义索引表-- 定义记录集TYPE yang_rec IS RECORD( ename varchar2(30), eid NUMBER );-- 定义索引表类型TYPE yang_tab IS TABLE OF yang_rec INDEX BY BINARY_INTEGER;-- 定义索引表对象的实例test_tab yang_tab;1.1.2 将条目插入到索引表中索引表中的每个元素都由一个唯一的整型值(索引)标识。
Oracle PL/SQL高级编程编者语:作者对Oracle开发管理有多年的经验,并在Oracle 数据库的基础上开发了自己的交易控制中间件,适用于金融、电信、交通等多个行业,现就主要开发资料参考资料共享给大家。
祝大家在Oracle平台上更上一层楼,共同进步。
Yangyb123@ 2006-2-14第一章集合 (3)1.1 索引表 (3)1.1.1 定义索引表 (3)1.1.2 将条目插入到索引表中 (3)1.1.3 对索引表中进行操作 (3)1.1.4 索引表中的函数 (4)1.2 嵌套表 (4)1.2.1 初始化嵌套表 (4)1.2.2 扩展嵌套表 (5)1.2.3 删除嵌套表中的条目 (5)1.3 变长数组 (6)1.3.1 定义变长数组 (6)1.3.2 扩展变长数组 (6)1.4 批绑定 (6)1.5 集合的异常处理 (7)第二章触发器 (7)2.1 触发器的创建 (7)2.2 触发器的管理 (7)2.3 触发器的新功能 (9)2.4 替代触发器 (11)2.5 触发器的局限性 (11)第三章对象 (11)3.1 对象的定义 (11)3.2 对象的存贮和检索 (12)第四章调试 (13)4.1 编写DEBUG程序包(例程) (13)4.2 调用函数 (13)第五章大对象类型 (14)5.1 大对象数据类型 (14)5.2 在Oracle8i数据库中使用外部文件: (15)5.3 DBMS_LOB 包 (15)5.3.1 函数说明 (15)5.3.2 应用举例 (18)5.3.3 内部 LOB 的函数和过程 (19)5.3.4 内部 LOB 的函数和过程的应用举例 (23)5.3.5 临时 LOB (23)第六章管理事务和锁定 (24)6.1 事务 (24)6.2 锁定 (25)第七章动态SQL (28)7.1 DBMS_SQL 程序包 (28)7.2 本机动态SQL (28)7.2.1 执行 DDL 语句 (28)7.2.2 使用绑定变量 (29)7.2.3 执行 PL/SQL 块 (29)第八章显示数据 (29)8.1 DBMS_OUTPUT 程序包 (29)8.1.1 开启屏幕显示 (30)8.1.2 关闭屏幕显示 (30)8.1.3 其他函数 (30)8.1.4 引发的异常 (30)8.2 UTL_FILE 程序包 (30)8.2.1 概述 (30)8.2.2 函数描述 (31)8.2.3 例程 (33)8.3 TEXT_IO 程序包 (34)第九章管理数据作业 (34)9.1 DBMS_JOB 包 (34)9.2 使用后台进程 (34)9.3 执行作业 (35)9.3.1 使用SUBMIT 将作业提交给作业队列 (35)9.3.2 使用RUN立即执行作业: (36)9.3.3 作业环境 (36)9.4 查看作业 (36)9.4.1 DBA_JOBS 视图的结构 (37)9.4.2 DBA_JOBS_RUNNING 视图的结构: (37)9.5 管理作业 (37)9.5.1 删除作业 (37)9.5.2 修改作业 (37)9.5.3 导入和导出作业 (38)9.5.4 处理损坏的作业 (38)9.5.5 例程 (38)第十章过程通信 (40)10.1 报警(DBMS_ALERT程序包) (40)10.1.1 建立报警的次序 (40)10.1.2 函数应用和说明 (40)10.1.3 应用举例 (42)10.2 DBMS_PIPE 程序包 (42)10.2.1 公有管道和私有管道 (43)10.2.2 使用管道 (43)10.2.3 DBMS_PIPE包的函数 (43)10.2.4 例程 (46)10.3 DBMS_ALERT 与 DBMS_PIPE 的比较 (47)第十一章 PL/SQL 和 JAVA (48)11.1 Oracle JAVA (48)11.2 装载、应用、删除JAVA (50)第一章集合1.1 索引表索引表是将数据保存在内存中!!!1.1.1 定义索引表-- 定义记录集TYPE yang_rec IS RECORD( ename varchar2(30), eid NUMBER );-- 定义索引表类型TYPE yang_tab IS TABLE OF yang_rec INDEX BY BINARY_INTEGER;-- 定义索引表对象的实例test_tab yang_tab;1.1.2 将条目插入到索引表中索引表中的每个元素都由一个唯一的整型值(索引)标识。
引用表中的值时,必须提供该值的索引。
索引的范围:1 ---- 2147483647,索引值可以不连续,同时PL/SQL并不为没有使用的条目预留空间。
例如:DECLARECURSOR all_emps IS SELECT * FROM employee ORDER by emp_id;TYPE emp_table IS TABLE OF employee%ROWTYPE INDEX BY BINARY_INTEGER;emps emp_table;emps_max BINARY_INTEGER;BEGINemps_max := 0;FOR emp IN all_emps LOOPemps_max := emps_max + 1;emps(emps_max).emp_id := emp.emp_id;emps(emps_max).emp_name := emp.emp_name;END LOOP;END;/1.1.3 对索引表中进行操作1) 插入:见上例。
2) 引用:IF emps.EXIST(10) THENDBMS_OUTPUT.PUT_LINE('存在第10条记录。
');END IF;3) 修改:修改emps 表中的第100个条目:emps(100).emp_name := 'yang linker';4) 删除:-- 删除emps 表中的第100个条目:emps.DELETE(100);-- 删除emps 表中的从1到100的条目:emps.DELETE(1, 100);-- 删除emps 表中的的所有条目:emps.DELETE;1.1.4 索引表中的函数1) count:返回表的条目数量:num_rows := emps.COUNT;2) EXISTS:如果指定的条目存在,则返回为真;否则为假。
IF emps.EXIST(10) THENDBMS_OUTPUT.PUT_LINE('存在第10条记录。
');END IF;3) LIMIT:该方法返回集合可以包含的最大元素数目。
只有变长数组才有上限。
将LIMIT 用于嵌套表和索引表时,其返回为NULL。
4) FRIST:该方法返回集合中使用的最小的索引值。
5) LAST:该方法返回集合中使用的最大的索引值。
6) NEXT:该方法返回集合中当前使用的下一个索引值。
7) PRIOR:该方法返回集合中当前使用的上一个索引值。
8) DELETE:删除集合中的条目,见前例。
9) TRIM:从集合的尾部删除一个或多个条目,无返回值,只适用于变长数组和嵌套表。
emps.TRIM(1); -- 从集合的尾部删除一个条目emps.TRIM(3); -- 从集合的尾部删除三个条目10) EXTEND:在集合的尾部添加条目或复制已有的条目,只适用于变长数组和嵌套表。
emps.EXTEND(1); -- 从集合的尾部添加一个条目emps.EXTEND(3); -- 从集合的尾部添加三个条目emps.EXTEND(1, 3);-- 复制集合的第三个条目,并将其添加到表的末尾。
1.2 嵌套表将数据保存在内存中!!!嵌套表是一个无序记录集合。
检索数据库中的嵌套表时,条目的索引是连续的,不能象索引表那样随意跳过索引值。
需要使用构造函数初始化嵌套表。
嵌套表不能是以下数据类型:BOOLEAN, NCHAR, NCLOB, NVARCHAR2, REF CURSOR, TABLE, VARRAY, NOT NULL。
嵌套表的定义和索引表类似,但不能使用INDEX BY 子句。
1.2.1 初始化嵌套表必须使用构造函数初始化嵌套表后,才能给它添加条目!-- 定义索引表类型TYPE emp_tab IS TABLE OF emp%ROWTYPE;-- 定义索引表对象的实例emps emp_tab;-- 初始化嵌套表emps := emp_tab();1.2.2 扩展嵌套表利用 EXTEND 来扩展嵌套表的数据于内存。
DECLARECURSOR all_emps IS SELECT * FROM emp ORDER BY empno;TYPE emp_table IS TABLE OF emp%ROWTYPE;emps emp_table;I PLS_INTEGER;l_count PLS_INTEGER;BEGINl_count := 0;emps := emp_table(); -- 初始化嵌套表并产生一条空记录FOR c1 IN all_emps LOOPl_count := l_count + 1;emps.EXTEND;emps(l_count).empno := c1.empno;emps(l_count).ename := c1.ename;emps(l_count).job := c1.job;emps(l_count).mgr := c1.mgr;emps(l_count).hiredate := c1.hiredate;emps(l_count).sal := c1.sal;emps(l_count).comm := m;emps(l_count).deptno := c1.deptno;END LOOP;-- clone the first entry five timesemps.EXTEND(5,1);FOR i IN 1..l_count+5 LOOPDBMS_OUTPUT.PUT_LINE(TO_CHAR(emps(i).empno) || ' ' || mps(i).ename);END LOOP;END;/1.2.3 删除嵌套表中的条目1) DELETE 方法:emps.DELETE(10); -- 删除嵌套表中的第10个条目。
注意:在删除嵌套表中的条目后,嵌套表中的条目并没有重新编号,还可以继续使用。
2) TRIM 方法:TRIM方法是在表的末尾删除指定数目的条目。
TRIM方法只能用于嵌套表和变长数组。
DECLARECURSOR all_emps IS SELECT * FROM emp ORDER BY empno;TYPE emp_table IS TABLE OF emp%ROWTYPE;emps emp_table;i PLS_INTEGER;l_count PLS_INTEGER;BEGINl_count := 0;-- 初始化嵌套表并产生一条空记录emps := emp_table();FOR c1 IN all_emps LOOPl_count := l_count + 1;emps.EXTEND;emps(l_count).empno := c1.empno;emps(l_count).ename := c1.ename;emps(l_count).job := c1.job;emps(l_count).mgr := c1.mgr;emps(l_count).hiredate := c1.hiredate;emps(l_count).sal := c1.sal;emps(l_count).comm := m;emps(l_count).deptno := c1.deptno;END LOOP;-- clone the first entry five timesemps.EXTEND(5,1);-- Trim off the five clones of entry #1emps.TRIM(5);-- Delete the first entryemps.DELETE(1);FOR i IN 1..l_count+5 LOOPDBMS_OUTPUT.PUT_LINE(TO_CHAR(emps(i).empno) || ' ' || emps(i).ename);END LOOP;END;/注意:调试以上代码,并注意错误表达!!!1.3 变长数组变长数组与嵌套表类似,但变长数组的最大长度是固定的。