版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Oracle存储过程实例,过程,过程就是高级程序设计语言中的模块的概念,将一些内部联系的命令组成一个个过程,通过参数在过程之间传递数据是模块化设计思想的重要内容.,存储过程特点,1)存储过程是预编译过的,并且经优化后存储于SQL内存中,使用时无需再次编译,提高了工作效率; 2)存储过程的代码直接存放于数据库中,一般由客户端直接通过存储过程的名字进行调用,减少了网络流量,加快了系统执行速度,例如在进行百万以上的大批量数据查询时,使用存储过程分页要比其他方式分页快得多; 3)使用存储过程可以减少SQL注入式攻击,提高了系统的安全性,执行存储过程的用户要具有一定的权限才能使用存储过程,没有数据操作权
2、限的用户只能在其控制下间接地存取数据;,存储过程特点,4)在同时进行主、从表及多表间的数据维护及有效性验证时,使用存储过程比较方便,而且可以有效利用SQL中的事务处理的机制; 5)使用存储过程,可以实现存储过程设计和编码工作分开进行,只要将存储过程名、参数、及返回信息告诉编码人员即可; 6)但使用存储过程封装业务逻辑将限制应用程序的可移植性;另外,如果更改存储过程的参数或者其返回的数据及类型的话,需要修改应用程序的相关代码,比较繁琐。,过程的语法结构,完整的过程结构如下: create or replace procedure 过程名 as 声明语句段; begin 执行语句段; except
3、ion 异常处理语句段; end; 过程是有名称的程序块,as关键词代替了无名块的declare.,创建过程实例,创建名为stu_proc的过程,create是创建过程的标识符,replace表示若同名过程存在将覆盖原过程.该过程定义了一个变量,其类型和student数据表中的sname字段类型相同,都是字符型,将数据表中的sno字段为1的sname字段内容送入变量中,然后输出结果.,参数,SQL中调用存储过程语句: callprocedure_name(); 调用时”()”是不可少的,无论是有参数还是无参数。 定义对数据库过程的调用时无参数过程:callprocedure_name仅有输入参
4、数的过程:callprocedure_name(?,?.)这里?表示输入参数,创建存储过程时用in表示输入参数 仅有输出参数的过程:Callprocedure_name(?,?.)这里的?表示输出参数,创建存储过程时用out表示输入参数 既有输入参数又有输出参数的过程callprocedure_name(?,?.)这里的?有表示输出参数的,也有表示输入参数的 下面将会对这4种情况分别举出实例!,参数过程实例,无参数存储过程: create or replace procedure stu_proc as pname varchar2(25); begin select sname into p
5、name from student where sno=1; dbms_output.put_line(pname); end; 或者 create or replace procedure stu_proc as pname student.sname%type; begin select sname into p_name from student where sno=1; dbms_output.put_line(pname); end;,仅有输入参数的过程 create or replace procedure stu_proc1(pno in student.sno%type) as
6、 pname varchar2(25); begin select sname into pname from student where sno=pno; dbms_output.put_line(pname); end;,参数过程实例,仅有输出参数的存储过程 create or replace procedure stu_proc2(pname out student.sname%type) as begin select sname into pname from student where sno=1; dbms_output.put_line(pname); end; 此种存储过程不
7、能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明,参数过程实例,有输入输出参数的存储过程: create or replace procedure stu_proc3 (pno in student.sno%type,pname out student.sname%type) as begin select sname into pname from student where sno=pno; dbms_output.put_line(pname); end; 此种存储过程不能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明,参数过程实例,Ora
8、cle函数调用存储过程,我们已经学习了oracle函数,下面就针对参数的4种情况分别举出实例说明函数对存储过程的调用,对无参数过程的调用: -函数 create or replace function get_pname return varchar2 is pname varchar2(20); begin stu_proc; select sname into pname from student where sno=1; return pname; end; -调用 declare begin dbms_output.put_line(在PL/SQL中打印的结果:|get_pname);
9、 end;,函数调用存储过程实例,对有输入参数过程的调用: create or replace function get_pname1(pno in number) return varchar2 is pname varchar2(20); begin stu_proc1(pno in student.sno%type) select sname into pname from student where sno=pno; return pname; end; -调用 declare begin dbms_output.put_line(在PL/SQL中打印的结果:|get_pname1(2
10、); end;,函数调用存储过程实例,对有输出参数过程的调用: create or replace function get_pname2(pname out varchar2) return varchar2 is begin stu_proc2(pname out student.sname%type); return pname; end; -调用 declare pname student.sname%type; begin dbms_output.put_line(在PL/SQL中打印的结果:|get_pname2(pname); end;,函数调用存储过程实例,对有输入输出参数过程
11、的调用: create or replace function get_pname3(pno in number,pname out varchar2) return varchar2 is begin stu_proc3(pno in student.sno%type,pname out student.sname%type); return pname; end; -调用 declare pname student.sname%type; begin dbms_output.put_line(在PL/SQL中打印的结果:|get_pname3(2,pname); end;,函数调用存储过程
12、实例,JAVA调用数据库存储过程,前面我们已经讲述了有关oracle数据库的存储过程的几种形式,以及oracle函数对存储过程的调用,下面我将根据上面存储过程的实例来举出JAVA对oracle存储过程的调用,仅有返回值的过程: public static void main(String args) Connection conn=BBConnection.getConnection(); String sql=call stu_proc2(?); try CallableStatement statement=conn.prepareCall(sql); statement.register
13、OutParameter(1,Types.VARCHAR); statement.execute(); String pname=statement.getString(1); System.out.println(pname); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,JAVA调用实例,既有输入参数又有输出参数的过程 public static void main(String args) Connection conn=BBConnection.getConnection(
14、); String sql=call stu_proc3(?,?); try CallableStatement statement=conn.prepareCall(sql); statement.setInt(1, 1); statement.registerOutParameter(2,Types.VARCHAR); statement.execute(); String pname=statement.getString(2); System.out.println(pname); catch (SQLException e) / TODO Auto-generated catch b
15、lock e.printStackTrace(); ,JAVA调用实例,下面将举出无out参数的调用实例 这种参数不适于用在查询语句上,因为查询语句需要有返回值才能被JAVA调用 返回到 OUT 参数中的值可能会是JDBC NULL。当出现这种情形时,将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false,这取决于getXXX 方法类型。对于 ResultSet 对象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则
16、返回 flase,JAVA调用实例,仅有参数的过程: public static void main(String args) Connection conn=BBConnection.getConnection(); String sql=call stu_proc1(?); try CallableStatement statement=conn.prepareCall(sql); statement.setInt(1, 1); statement.execute(); System.out.println(statement.execute(); catch (SQLException
17、e) / TODO Auto-generated catch block e.printStackTrace(); finally try conn.close(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,JAVA调用实例,无参数过程: public static void main(String args) Connection conn=BBConnection.getConnection(); String sql=call stu_proc(); try Callab
18、leStatement statement=conn.prepareCall(sql); statement.execute(); System.out.println(statement.execute(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); finally try conn.close(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ,JAVA调用实例,通过
19、调用数据库函数调用存储过程,下面将举一个通过数据库函数来调用存储过程: public static void main(String args) Connection conn=BBConnection.getConnection(); String sql=?=call get_pname1(?); try CallableStatement statement=conn.prepareCall(sql); statement.registerOutParameter(1, Types.VARCHAR); statement.setInt(2, 1); statement.execute()
20、; System.out.println(statement.getString(1); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); finally try conn.close(); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(); ?表示函数return的值, get_pname1是数据库函数名 存储过程的out和in都是以参数传进,这就是函数和存储过程的区别之一,存储过程的
21、异常处理,为了提高存储过程的健壮性,避免运行错误,当建立存储过程时应包含异常处理部分。 异常(EXCEPTION)是一种PL/SQL标识符,包括预定义异常、非预定义异常和自定义异常; 预定义异常是指由PL/SQL提供的系统异常;非预定义异常用于处理与预定义异常无关的Oracle错误(如完整性约束等);自定义异常用于处理与Oracle错误的其他异常情况。 RAISE_APPLICATION_ERROR用于自定义错误消息,并且消息号必须在2000020999之间,Oracle数据库中提供了一些异常处理的方法,下面通过一个实例来说明 create or replace procedure stu_p
22、roc6(pno in student.sno%type,pname out student.sname%type) is begin select sname into pname from student where sno=pno; EXCEPTION when NO_DATA_FOUND then RAISE_APPLICATION_ERROR (-20011,ERROR:不存在!); end;,存储过程的异常处理实例,命名的系统异常 产生原因 ACCESS_INTO_NULL 未定义对象 CASE_NOT_FOUND CASE 中若未包含相应的 WHEN ,并且没有设置 COLLEC
23、TION_IS_NULL 集合元素未初始化 CURSER_ALREADY_OPEN 游标已经打开 DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值 INVALID_CURSOR 在不合法的游标上进行操作 INVALID_NUMBER内嵌的 SQL 语句不能将字符转换为数字 NO_DATA_FOUND 使用 select into 未返回行,或应用索引表未初始化的 TOO_MANY_ROWS 执行 select into 时,结果集超过一行 ZERO_DIVIDE 除数为 0 SUBSCRIPT_BEYOND_COUNT 元素下标超过嵌套表或 VARRAY 的最大值 SUBSCRI
24、PT_OUTSIDE_LIMIT 使用嵌套表或 VARRAY 时,将下标指定为负数 VALUE_ERROR 赋值时,变量长度不足以容纳实际数据 LOGIN_DENIED PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码 NOT_LOGGED_ON PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据 PROGRAM_ERROR PL/SQL 内部问题,可能需要重装数据字典 pl./SQL系统包 ROWTYPE_MISMATCH 主游标变量与 PL/SQL 游标变量的返回类型不兼容 SELF_IS_NULL 使用对象类型时,在 null 对象上调
25、用对象方法 STORAGE_ERROR 运行 PL/SQL 时,超出内存空间 SYS_INVALID_ID 无效的 ROWID 字符串 TIMEOUT_ON_RESOURCE Oracle 在等待资源时超时,Oracle提供的异常处理,自定义异常处理: create or replace procedure stu_proc7(pno in student.sno%type, pon in student.sno%type ) is v_raise exception; v_name student.sname%type; begin if pno=101 then raise v_raise
26、; end if; select sname into v_name from student where sno=111111; exception when v_raise then RAISE_APPLICATION_ERROR(-20010,ERROR:not existed!); when no_data_found then RAISE_APPLICATION_ERROR(-20011,ERROR:不存在!); end;,存储过程的异常处理实例,存储过程的事务处理,事务用于确保数据的一致性,由一组相关的DML语句组成,该组DML语句所执行的操作要么全部确认,要么全部取消。 当执行事务操作(DML)时,Oracle会在被作用的表上加锁,以防止其他用户改变表结构,同时也会在被作用的行上加行锁,以防止其他事务在相应行上执行DML操作。 当执行事务提交或事务回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点、释放锁。,提交事务(COMMIT)确认事务变化,结束当前事务、删除保存点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高钾型周期性瘫痪病因介绍
- 2023工作内容保密协议书七篇
- 韦尼克脑病病因介绍
- 面部神经炎病因介绍
- 路易体痴呆病因介绍
- 蠓性皮炎病因介绍
- 3篇 2024小学校长年度述职报告
- 中考历史复习教材知识梳理模块七湖南地方文化常识
- (2024)河流治理工程建设项目可行性研究报告(一)
- 2024年全球及中国智能交通行业概述分析及应用领域调研报告
- GB/T 24602-2009城镇污水处理厂污泥处置单独焚烧用泥质
- FZ/T 73044-2012针织配饰品
- T-YNRZ 012-2022 台农1号芒果种植技术规范
- COPD教学讲解课件
- (完整版)国际法期末考试习题
- 2万吨/年燃料丁醇发酵工段工艺设计- 倒数第二版
- 2021-2022学年六年级上册世界少年奥林匹克思维能力测评地方选拔活动(含答案解析)
- 《生物力学》配套教学课件
- 湘科版五年级(上册)科学期末质量测试题(含答案)
- 脑积水(实用课件)
- 摄影技巧构图(共52张PPT)
评论
0/150
提交评论