《oracle存储过程实例解读ppt课件.ppt》由会员分享,可在线阅读,更多相关《oracle存储过程实例解读ppt课件.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、过程过程l过程就是高级程序设计语言中的模块的概念,将一些内部联系的命令组成一个个过程,通过参数在过程之间传递数据是模块化设计思想的重要内容.存储过程特点存储过程特点l1)存储过程是预编译过的,并且经优化后存储于SQL内存中,使用时无需再次编译,提高了工作效率;l2)存储过程的代码直接存放于数据库中,一般由客户端直接通过存储过程的名字进行调用,减少了网络流量,加快了系统执行速度,例如在进行百万以上的大批量数据查询时,使用存储过程分页要比其他方式分页快得多;l3)使用存储过程可以减少SQL注入式攻击,提高了系统的安全性,执行存储过程的用户要具有一定的权限才能使用存储过程,没有数据操作权限的用户只能
2、在其控制下间接地存取数据;存储过程特点存储过程特点4)在同时进行主、从表及多表间的数据维护及有效性验证时,使用存储过程比较方便,而且可以有效利用SQL中的事务处理的机制;5)使用存储过程,可以实现存储过程设计和编码工作分开进行,只要将存储过程名、参数、及返回信息告诉编码人员即可;6)但使用存储过程封装业务逻辑将限制应用程序的可移植性;另外,如果更改存储过程的参数或者其返回的数据及类型的话,需要修改应用程序的相关代码,比较繁琐。过程的语法结构过程的语法结构完整的过程结构如下: create or replace procedure 过程名 as 声明语句段; begin 执行语句段; excep
3、tion 异常处理语句段; end;过程是有名称的程序块,as关键词代替了无名块的declare. 创建过程实例创建过程实例l创建名为stu_proc的过程,create是创建过程的标识符,replace表示若同名过程存在将覆盖原过程.该过程定义了一个变量,其类型和student数据表中的sname字段类型相同,都是字符型,将数据表中的sno字段为1的sname字段内容送入变量中,然后输出结果.参数参数lSQL中调用存储过程语句:lcall procedure_name();l调用时”()”是不可少的,无论是有参数还是无参数。l定义对数据库过程的调用时 无参数过程: call procedur
4、e_name 仅有输入参数的过程:call procedure_name(?,?.)这里?表示输入参数,创建存储过程时用in表示输入参数l 仅有输出参数的过程: Call procedure_name(?,?.)这里的?表示输出参数,创建存储过程时用out表示输入参数l 既有输入参数又有输出参数的过程call procedure_name(?,?.)这里的?有表示输出参数的,也有表示输入参数的 l下面将会对这下面将会对这4种情况分别举出实例!种情况分别举出实例!参数过程实例参数过程实例无参数存储过程:lcreate or replace procedure stu_proc aslpname
5、varchar2(25);lbeginl select sname into pname from student where sno=1;l dbms_output.put_line(pname);lend;l或者lcreate or replace procedure stu_proc aslpname student.sname%type;lbeginl select sname into p_name from student where sno=1;l dbms_output.put_line(pname);lend;l仅有输入参数的过程lcreate or replace proc
6、edure stu_proc1(pno in student.sno%type) aslpname varchar2(25);lbeginl select sname into pname from student where sno=pno;l dbms_output.put_line(pname);l end;参数过程实例参数过程实例l仅有输出参数的存储过程lcreate or replace procedure stu_proc2(pname out student.sname%type) aslbeginl select sname into pname from student wh
7、ere sno=1;l dbms_output.put_line(pname);l end;l此种存储过程不能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明参数过程实例参数过程实例l有输入输出参数的存储过程:lcreate or replace procedure stu_proc3l(pno in student.sno%type,pname out student.sname%type) aslbeginl select sname into pname from student where sno=pno;l dbms_output.put_line(pname)
8、;l end;l此种存储过程不能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明参数过程实例参数过程实例Oracle函数调用存储过程函数调用存储过程l我们已经学习了oracle函数,下面就针对参数的4种情况分别举出实例说明函数对存储过程的调用l对无参数过程的调用:l -函数lcreate or replace function get_pname return varchar2 is l pname varchar2(20);l beginl stu_proc;l select sname into pname from student where sno=1;l ret
9、urn pname;l end;l-调用ldeclarelbeginl dbms_output.put_line(在PL/SQL中打印的结果:|get_pname);l end;函数调用存储过程实例函数调用存储过程实例l对有输入参数过程的调用:lcreate or replace function get_pname1(pno in number) return varchar2 is l pname varchar2(20);l beginl stu_proc1(pno in student.sno%type) l select sname into pname from student w
10、here sno=pno;l return pname;l end;l-调用ldeclarelbeginl dbms_output.put_line(在PL/SQL中打印的结果:|get_pname1(2);l end;函数调用存储过程实例函数调用存储过程实例l对有输出参数过程的调用:l create or replace function get_pname2(pname out varchar2) return varchar2 isl beginl stu_proc2(pname out student.sname%type);l return pname;l end;l-调用ldecl
11、arelpname student.sname%type;lbeginl dbms_output.put_line(在PL/SQL中打印的结果:|get_pname2(pname);l end;函数调用存储过程实例函数调用存储过程实例l对有输入输出参数过程的调用:l create or replace function get_pname3(pno in number,pname out varchar2) return varchar2 isl beginl stu_proc3(pno in student.sno%type,pname out student.sname%type);l r
12、eturn pname;l end;l-调用ldeclarelpname student.sname%type;lbeginl dbms_output.put_line(在PL/SQL中打印的结果:|get_pname3(2,pname);l end; 函数调用存储过程实例函数调用存储过程实例JAVA调用数据库存储过程调用数据库存储过程l前面我们已经讲述了有关oracle数据库的存储过程的几种形式,以及oracle函数对存储过程的调用,下面我将根据上面存储过程的实例来举出JAVA对oracle存储过程的调用l仅有返回值的过程:lpublic static void main(String ar
13、gs) lConnection conn=BBConnection.getConnection();lString sql=call stu_proc2(?);ltry lCallableStatement statement=conn.prepareCall(sql);lstatement.registerOutParameter(1,Types.VARCHAR);lstatement.execute();lString pname=statement.getString(1);lSystem.out.println(pname);l catch (SQLException e) l/ TO
14、DO Auto-generated catch blockle.printStackTrace();lllJAVA调用实例调用实例l既有输入参数又有输出参数的过程lpublic static void main(String args) lConnection conn=BBConnection.getConnection();lString sql=call stu_proc3(?,?);ltry lCallableStatement statement=conn.prepareCall(sql);lstatement.setInt(1, 1);lstatement.registerOutP
15、arameter(2,Types.VARCHAR);lstatement.execute();lString pname=statement.getString(2);lSystem.out.println(pname);l catch (SQLException e) l/ TODO Auto-generated catch blockle.printStackTrace();lllJAVA调用实例调用实例l下面将举出无out参数的调用实例l这种参数不适于用在查询语句上,因为查询语句需要有返回值才能被JAVA调用l返回到 OUT 参数中的值可能会是JDBC NULL。当出现这种情形时,将对
16、JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false,这取决于getXXX 方法类型。对于 ResultSet 对象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase JAVA调用实例调用实例l仅有参数的过程:lpublic static void main(String args) lConnection conn=BBConnection.getConnection();lString sql=cal
17、l stu_proc1(?);ltry lCallableStatement statement=conn.prepareCall(sql);lstatement.setInt(1, 1);lstatement.execute();lSystem.out.println(statement.execute();l catch (SQLException e) l/ TODO Auto-generated catch blockle.printStackTrace();lfinallyltry lconn.close();l catch (SQLException e) l/ TODO Auto
18、-generated catch blockle.printStackTrace();llllJAVA调用实例调用实例l无参数过程:lpublic static void main(String args) lConnection conn=BBConnection.getConnection();lString sql=call stu_proc();ltry lCallableStatement statement=conn.prepareCall(sql);lstatement.execute();lSystem.out.println(statement.execute();l cat
19、ch (SQLException e) l/ TODO Auto-generated catch blockle.printStackTrace();lfinallyltry lconn.close();l catch (SQLException e) l/ TODO Auto-generated catch blockle.printStackTrace();lllJAVA调用实例调用实例通过调用数据库函数调用存储过程通过调用数据库函数调用存储过程l下面将举一个通过数据库函数来调用存储过程:lpublic static void main(String args) lConnection c
20、onn=BBConnection.getConnection();lString sql=?=call get_pname1(?);ltry lCallableStatement statement=conn.prepareCall(sql);lstatement.registerOutParameter(1, Types.VARCHAR);lstatement.setInt(2, 1);lstatement.execute();lSystem.out.println(statement.getString(1);l catch (SQLException e) l/ TODO Auto-ge
21、nerated catch blockle.printStackTrace();lfinallyltry lconn.close();l catch (SQLException e) l/ TODO Auto-generated catch blockle.printStackTrace();lllll?表示函数return的值, get_pname1是数据库函数名l存储过程的out和in都是以参数传进,这就是函数和存储过程的区别之一存储过程的异常处理存储过程的异常处理为了提高存储过程的健壮性,避免运行错误,当建立存储过程时应包含异常处理部分。异常(EXCEPTION)是一种PL/SQL标识符
22、,包括预定义异常、非预定义异常和自定义异常;预定义异常是指由PL/SQL提供的系统异常;非预定义异常用于处理与预定义异常无关的Oracle错误(如完整性约束等);自定义异常用于处理与Oracle错误的其他异常情况。RAISE_APPLICATION_ERROR用于自定义错误消息,并且消息号必须在2000020999之间lOracle数据库中提供了一些异常处理的方法,下面通过一个实例来说明lcreate or replace procedure stu_proc6(pno in student.sno%type,pname out student.sname%type)l isl beginl
23、select sname into pname from student where sno=pno;l EXCEPTIONl when NO_DATA_FOUND thenl RAISE_APPLICATION_ERROR(-20011,ERROR:不存在!);lend;存储过程的异常处理实例存储过程的异常处理实例 命名的系统异常 产生原因 lACCESS_INTO_NULL 未定义对象 lCASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 lCOLLECTION_IS_NULL 集合元素未初始化 lCURSER_ALREADY_OPEN 游标已经打开 lDU
24、P_VAL_ON_INDEX 唯一索引对应的列上有重复的值 lINVALID_CURSOR 在不合法的游标上进行操作 lINVALID_NUMBER内嵌的 SQL 语句不能将字符转换为数字 lNO_DATA_FOUND 使用 select into 未返回行,或应用索引表未初始化的 lTOO_MANY_ROWS 执行 select into 时,结果集超过一行 lZERO_DIVIDE 除数为 0 lSUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或 VARRAY 的最大值 lSUBSCRIPT_OUTSIDE_LIMIT 使用嵌套表或 VARRAY 时,将下标指定为负数 lV
25、ALUE_ERROR 赋值时,变量长度不足以容纳实际数据 lLOGIN_DENIED PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码 lNOT_LOGGED_ON PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据 lPROGRAM_ERROR PL/SQL 内部问题,可能需要重装数据字典 pl./SQL系统包 lROWTYPE_MISMATCH 主游标变量与 PL/SQL 游标变量的返回类型不兼容 lSELF_IS_NULL 使用对象类型时,在 null 对象上调用对象方法 lSTORAGE_ERROR 运行 PL/SQL 时,超出内存空
26、间 lSYS_INVALID_ID 无效的 ROWID 字符串 lTIMEOUT_ON_RESOURCE Oracle 在等待资源时超时 Oracle提供的异常处理提供的异常处理l自定义异常处理:lcreate or replace procedure stu_proc7(pno in student.sno%type,l pon in student.sno%typel )l isl v_raise exception;l v_name student.sname%type;l beginl if pno=101 thenl raise v_raise;l end if;l select s
27、name into v_name from student where sno=111111; l exceptionl when v_raise thenl RAISE_APPLICATION_ERROR(-20010,ERROR:not existed!);l when no_data_found thenl RAISE_APPLICATION_ERROR(-20011,ERROR:不存在!);lend;存储过程的异常处理实例存储过程的异常处理实例存储过程的事务处理存储过程的事务处理事务用于确保数据的一致性,由一组相关的DML语句组成,该组DML语句所执行的操作要么全部确认,要么全部取消。
28、当执行事务操作(DML)时,Oracle会在被作用的表上加锁,以防止其他用户改变表结构,同时也会在被作用的行上加行锁,以防止其他事务在相应行上执行DML操作。当执行事务提交或事务回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点、释放锁。提交事务(COMMIT)确认事务变化,结束当前事务、删除保存点,释放锁,使得当前事务中所有未决的数据永久改变。保存点(SAVEPOINT)在当前事务中,标记事务的保存点。回滚事务(ROLLBACK)回滚整个事务,删除该事务所定义的所有保存点,释放锁,丢弃所有未决的数据改变。回滚事务到指定的保存点(ROLLBACK TO SAVEPOINT)回滚
29、当前事务到指定的保存点,丢弃该保存点创建后的任何改变,释放锁。存储过程的事务处理存储过程的事务处理当执行DDL、DCL语句,或退出SQL*PLUS时,会自动提交事务;事务期间应避免与使用者互动;查询数据期间,尽量不要启动事务;尽可能让事务持续地越短越好;在事务中尽可能存取最少的数据量。存储过程的事务处理存储过程的事务处理事务处理实例事务处理实例l存储过程事务处理实例:lcreate or replace procedure stu_proc8 l isl beginl insert into student values(102,sky,m,22,gong);l savepoint savep
30、oint1;l insert into student values(102,good,w,20,wang);l dbms_output.put_line(error);l update student set sno=103 where sname=good;l commit;l exceptionl when dup_val_on_index thenl rollback to savepoint savepoint1;l RAISE_APPLICATION_ERROR(-20010,ERROR:违反唯一索引约束!);l end;数据库函数和存储过程的包数据库函数和存储过程的包l创建包(package)l函数:lcreate or replace package 包名 as 函数l注意:as后可加多个函数l存储过程:lCreate or replace package 包名 as 存储过程l注意:as后可加多个存储过程函数的包调用:call 包名.函数名;存储过程的包调用:call 包名.存储过程名;包的调用包的调用THE END谢谢