oracle第15章PLSQL程序设计.ppt
《oracle第15章PLSQL程序设计.ppt》由会员分享,可在线阅读,更多相关《oracle第15章PLSQL程序设计.ppt(192页珍藏版)》请在三一办公上搜索。
1、1,第15章 PL/SQL程序设计,2,本章内容,PL/SQL概述PL/SQL基础控制结构游标异常处理存储子程序包触发器,3,本章要求,掌握PL/SQL程序设计基础知识掌握存储过程、函数、包、触发器的应用,4,15.1 PL/SQL概述,PL/SQL特点PL/SQL功能特性PL/SQL执行过程与开发工具,5,特点,与SQL语言紧密集成。减小网络流量,提高应用程序的运行性能。模块化的程序设计功能,提高了系统可靠性。服务器端程序设计,可移植性好。,6,功能特性,语句块结构异常处理变量和类型条件语句循环结构游标过程、函数和触发器包集合动态SQL对象特性,7,执行过程与开发工具,PL/SQL块,SQL
2、语句,客户端应用程序,PL/SQL引擎,数据库服务器,过程化语句执行器,SQL执行器,块中SQL语句,PL/SQL执行过程,8,PL/SQL开发工具SQL*PLUSProcedure BuilderOracle Form、Oracle ReportsPL/SQL Developer,9,15.2 PL/SQL基础,PL/SQL程序结构 词法单元 数据类型变量与常量编译指示PL/SQL中的SQL语句,10,PL/SQL程序结构,PL/SQL块的组成PL/SQL块分类,11,PL/SQL块的组成PL/SQL语言以块为单位,块中可以嵌套子块。一个基本的PL/SQL块由3部分组成:声明(DECLARE
3、),可执行部分(BEGIN),异常处理部分EXCEPTION)。,12,声明部分声明部分以关键字DECLARE开始,BEGIN结束。主要用于声明变量、常量、数据类型、游标、异常处理名称以及本地(局部)子程序定义等。可执行部分执行部分是PL/SQL块的功能实现部分,以关键字BEGIN开始,EXCEPTION或END结束(如果PL/SQL块中没有异常处理部分,则以END结束)。该部分通过变量赋值、流程控制、数据查询、数据操纵、数据定义、事务控制、游标处理等实现块的功能。异常处理部分异常处理部分以关键字EXCEPTION开始,END结束。该部分用于处理该块执行过程中产生的异常。,13,注意:执行部分
4、是必需的,而声明部分和异常部分是可选的;可以在一个块的执行部分或异常处理部分嵌套其他的PL/SQL块;所有的PL/SQL块都是以“END;”结束,14,PL/SQL块分类匿名块命名块函数存储过程包触发器,15,词法单元,字符集标识符分隔符常量值注释,16,字符集大小写字母:AZ,az数字:09空白:制表符、空格和回车数字符号:+-*/=标点符号:!#$%&*()_|?;:,.“,17,标识符标识符以字母开头,后边可以跟字母、数字、货币符号、下划线和”#”标识符的最大长度为30字符,并且所有字符都是有效的。合法:X v_studentID TempVar非法:X+y _temp,18,+-*/=
5、:=,!=()/*/,%;:.“.|=,*-,分隔符,19,常量值字符型常量数字型常量 布尔型常量:TURE、FALSE、NULL日期型常量,20,数据类型,数字类型字符类型日期/区间类型行标识类型布尔类型原始类型LOB类型记录类型集合类型,21,PL/SQL中常用的基本数据类型,22,记录类型的定义TYPE record_type IS RECORD(field1 datatype1 NOT NULLDEFAULT|:=expr1,field2 datatype2 NOT NULL DEFAULT|:=expr2,fieldn datatypen NOT NULL DEFAULT|:=exp
6、rn);,23,变量与常量,变量与常量的定义变量的作用域,24,变量声明,变量与常量的定义,变量定义的一般格式:CONSTANT NOT NULL DEFAULT|:=;说明每行只能定义一个标识符。如果加上关键字CONSTANT,则表示所定义的标识符为一个常量,必须为它赋初值。如果定义的标识符不能为空,则必须加上关键字NOT NULL,并赋初值。为标识符赋值时,使用赋值符号:=,默认值为空。,25,DECLARE v1 NUMBER(4);v2 NUMBER(4)NOT NULL:=10;v3 CONSTANT NUMBER(4)DEFAULT 100;BEGIN IF v1 IS NULL
7、THEN DBMS_OUTPUT.PUT_LINE(V1 IS NULL!);END IF;DBMS_OUTPUT.PUT_LINE(v2|v3);END;,26,声明一个变量,使它的类型与某个变量或数据库基本表中某个列的数据类型一致,可以使用%TYPE。示例v_empno1 emp.empno%TYPE;v_empno2 v_empno1%TYPE;,27,变量的作用域,变量的作用域是指变量的有效作用范围,从变量声明开始,直到块结束。如果PL/SQL块相互嵌套,则在内部块中声明的变量是局部的,只能在内部块中引用,而在外部块中声明的变量是全局的,既可以在外部块中引用,也可以在内部块中引用。如果
8、内部块与外部块中定义了同名变量,则在内部块中引用外部块的全局变量时需要使用外部块名进行标识。,28,DECLARE v_ename CHAR(15);v_outer NUMBER(5);BEGIN v_outer:=10;DECLARE v_ename CHAR(20);v_inner DATE;BEGIN v_inner:=sysdate;v_ename:=INNER V_ENAME;OUTER.v_ename:=OUTER V_ENAME;END;DBMS_OUTPUT.PUT_LINE(v_ename);END;,29,编译指示,编译指示是对编译程序发出的特殊指令,也称伪指令。关键字:P
9、RAGMAPL/SQL提供以下四种编译指示:EXCEPTION_INIT告诉编译程序将一个特定的错误号与程序中所声明的异常标识符关联起来。RESTRICT_REFERENCES告诉编译程序打包程序的纯度,即对函数中可以使用的SQL语句和包变量进行限制。,30,SERIALLY_REUSEABLE告诉PL/SQL运行时引擎,在数据引用之间不要保持包级数据。AUTONOMOUS_TRANSACTION告诉编译程序,该程序块为自治事务,即该事务的提交和回滚是独立进行的。,31,中SQL语句,可以在PL/SQL中执行的SQL语句包括SELECT DML(UPDATE、DELETE、INSERT)事务控
10、制语句(COMMIT、ROLLBACK、SAVEPOINT)注意DDL语句不可以直接使用,32,SELECTINTOSELECTINTO语句只能查询一个记录的信息,如果没有查询到任何数据,则会产生NO_DATA_FOUND异常;如果查询到多个记录,则会产生TOO_MANY_ROW异常。INTO句子后的变量用于接收查询的结果,变量的个数、顺序应该与查询的目标数据相匹配,也可以是记录类型的变量。DML语句,33,DECLAREv_emp emp%ROWTYPE;v_ename emp.ename%type;v_sal emp.sal%type;BEGINSELECT*INTO v_emp FROM
11、 emp WHERE ename=SMITH;DBMS_OUTPUT.PUT_LINE(v_emp.empno|v_emp.sal);select ename,sal INTO v_ename,v_sal FROM emp WHERE empno=7900;DBMS_OUTPUT.PUT_LINE(v_ename|v_sal);END;,34,DML语句PL/SQL中DML语句对标准SQL语句中的DML语句进行了扩展,允许使用变量。示例DECLARE v_empno emp.empno%TYPE:=7500;BEGIN INSERT INTO emp(empno,ename,sal,deptn
12、o)VALUES(v_empno,JOAN,2300,20);UPDATE emp SET sal=sal+100 WHERE empno=v_empno;DELETE FROM emp WHERE empno=v_empno;END;,35,WHERE标识符的区分系统首先查看WHERE子句中的标识符是否与表中的列名相同,如果相同,则该标识符被解释为列名;如果没有同名列,系统检查该标识符是不是PL/SQL语句块的变量。字符串比较填充比较:通过在短字符串后添加空格,使两个字符串达到相同长度,然后根据每个字符的ASCII码进行比较。非填充比较:根据每个字符的ASCII码进行比较,最先结束的字符串为
13、小。PL/SQL中规定,对定长的字符串(CHAR类型的字符串和字符串常量)采用填充比较;如果比较的字符串中有一个是变长字符串(VARCHAR2类型的字符串),则采用非填充比较。,36,RETURNING如果要查询当前DML语句操作的记录的信息,可以在DML语句末尾使用RETURNING语句返回该记录的信息。RETURNING语句的基本语法:RETURNING select_list_item INTO variable_list|record_variable;,37,DECLARE v_sal emp.sal%TYPE;BEGIN UPDATE emp SET sal=sal+100 WHE
14、RE empno=7844 RETURNING sal INTO v_sal;DBMS_OUTPUT.PUT_LINE(v_sal);END;,38,15.3 控制结构,选择结构循环结构跳转结构,39,选择结构,IF语句IF condition1 THEN statements1;ELSIF condition2 THEN statements2;ELSE else_statements;END IF;注意条件是一个布尔型变量或表达式,取值只能是TRUE,FALSE,NULL。,40,例如,输入一个员工号,修改该员工的工资,如果该员工为10号部门,工资增加100;若为20号部门,工资增加150
15、;若为30号部门,工资增加200;否则增加300。,41,DECLAREv_deptno emp.deptno%type;v_increment NUMBER(4);v_empno emp.empno%type;BEGIN v_empno:=,42,搜索式CASE语句,基本语法CASE WHEN condition1 THEN statements1;WHEN condition2 THEN statements2;WHEN conditionn THEN statementsn;ELSE else_statements;END CASE;,43,等值比较的CASE语句,基本语法CASE te
16、st_value WHEN value1 THEN statements1;WHEN value2 THEN statements2;WHEN valuen THEN statementsn;ELSE else_ statements;END CASE;,44,DECLARE v_deptno emp.deptno%type;v_increment NUMBER(4);v_empno emp.empno%type;BEGIN v_empno:=,45,根据输入的员工号,修改该员工工资。如果该员工工资低于1000,则工资增加200;如果工资在1000-2000之间,则增加150;如果工资在200
17、0-3000之间,则增加100;否则增加50。,46,DECLAREv_sal emp.sal%type;v_increment NUMBER(4);v_empno emp.empno%type;BEGINv_empno:=,47,循环结构,简单循环WHILE循环FOR循环,48,简单循环,语法 LOOP sequence_of_statement;EXIT WHEN condition;END LOOP;注意:在循环体中一定要包含EXIT语句,否则程序进入死循环。,49,例如,执行CREATE TABLE temp_table(num_col NUMBER,info_col CHAR(10)
18、语句创建temp_table表,然后利用循环向temp_table表中插入50条记录。程序为:DECLARE v_counter BINARY_INTEGER:=1;BEGIN LOOP INSERT INTO temp_table VALUES(v_Counter,Loop index);v_counter:=v_counter+1;EXIT WHEN v_counter 50;END LOOP;END;,50,WHILE循环,基本语法 WHILE condition LOOP sequence_of_statement;END LOOP;,51,例如,利用WHILE循环向temp_tabl
19、e表中插入50条记录。程序为:DECLARE v_counter BINARY_INTEGER:=1;BEGIN WHILE v_counter=50 LOOP INSERT INTO temp_table VALUES(v_counter,Loop index);v_counter:=v_counter+1;END LOOP;END;,52,FOR循环,基本语法 FOR loop_counter IN REVERSE low_bound.high_bound LOOP sequence_of_statement;END LOOP;注意:循环变量不需要显式定义,系统隐含地将它声明为BINARY
20、_INTEGER变量;系统默认时,循环变量从下界往上界递增计数,如果使用REVERSE关键字,则表示循环变量从上界向下界递减计数;循环变量只能在循环体中使用,不能在循环体外使用。,53,例如,利用FOR循环向temp_table表中插入50条记录。程序为:BEGIN FOR v_counter IN 1.50 LOOP INSERT INTO temp_table VALUES(v_counter,Loop Index);END LOOP;END;,54,跳转结构,语法格式:标号GOTO 标号;说明:块内可以跳转,内层块可以跳到外层块,但外层块不能跳到内层。IF语句不能跳入。不能从循环体外跳入
21、循环体内。不能从子程序外部跳到子程序中。由于goto语句的缺点,建议尽量少用甚至不用goto语句。,55,15.4 游标,游标的概念及类型 显式游标 隐式游标,56,DECLARE v_counter BINARY_INTEGER:=1;BEGIN INSERT INTO temp_table VALUES(v_counter,Loop index);v_counter:=v_Counter+1;IF v_counter=50 THEN GOTO LABEL;END IF;END;,57,15.4游标,游标的概念及类型 显式游标 隐式游标,58,游标的及类型,游标的概念游标(CURSOR)是O
22、racle系统在内存中开辟的一个工作区,在其中存放SELECT语句返回的查询结果。使用游标时,SELECT语句查询的结果可以是单条记录,多条记录,也可以是零条记录。游标工作区中,存在着一个指针(POINTER),在初始状态它指向查询结果的首记录。,59,游标的类型显式游标由用户定义、操作,用于处理返回多行数据的SELECT查询。隐式游标由系统自动进行操作,用于处理DML语句和返回单行数据的SELECT查询。,60,显式游标,显式游标的操作显式游标的属性参数化显式游标显式游标的检索利用游标更新或删除数据,61,显式游标的操作,步骤定义游标打开游标检索游标关闭游标,62,定义游标,语法格式CURS
23、OR cursor_name IS select_statement;说明游标必须在PL/SQL块的声明部分进行定义;游标定义时可以引用PL/SQL变量,但变量必须在游标定义之前定义;定义游标时并没有生成数据,只是将定义信息保存到数据字典中;游标定义后,可以使用cursor_name%ROWTYPE定义游标类型变量。,63,打开游标,语法格式OPEN cursor_name;说明检查变量的值执行游标定义时对应的SELECT语句,将查询结果检索到工作区中。游标指针指向第一个元组一旦游标打开,就无法再次打开,除非先关闭如果游标定义中的变量值发生变化,则只能在下次打开游标时才起作用。,64,检索游标
24、,语法格式FETCH cursor_name INTO variable_list|record_variable;说明在使用FETCH语句之前必须先打开游标对游标第一次使用FETCH语句时,游标指针指向第一条记录,因此操作的对象是第一条记录,使用后,游标指针指向下一条记录。游标指针只能向下移动,不能回退INTO子句中的变量个数、顺序、数据类型必须与工作区中每行记录的字段数、顺序以及数据类型一一对应。,65,关闭游标,语法格式 CLOSE cursor_name;说明游标所对应的内存工作区变为无效,释放与游标相关的系统资源。,66,根据输入的部门号查询某个部门的员工信息,部门号在程序运行时指定
25、。,67,DECLARE v_deptno emp.deptno%TYPE;CURSOR c_emp IS SELECT*FROM emp WHERE deptno=v_deptno;v_emp c_emp%ROWTYPE;BEGIN v_deptno:=,68,显式游标的属性,%ISOPEN布尔型。如果游标已经打开,返回TRUE,否则为FALSE。%FOUND布尔型,如果最近一次使用FETCH语句,有返回结果则为TRUE,否则为FALSE;%NOTFOUND布尔型,如果最近一次使用FETCH语句,没有返回结果则为TRUE,否则为FALSE;%ROWCOUNT数值型,返回到目前为止从游标缓冲区
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle 15 PLSQL 程序设计
链接地址:https://www.31ppt.com/p-5442189.html