`
jessen163
  • 浏览: 457426 次
  • 性别: Icon_minigender_1
  • 来自: 潘多拉
社区版块
存档分类
最新评论

存储过程

 
阅读更多

存储过程基本概念
      数据库存储过程是一组预先创建并用指定的名称存储在数据库服务器上的 SQL 语句,将使用比较频繁或者比较复杂的操作,预先用 SQL 语句写好并用一个指定的名称存储起来,以后当需要数据库提供与已定义好的存储过程的功能相同的服务时,只需再次执行该存储过程。

数据库存储过程具有如下优点:

1.存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。
2.通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。
3.存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。
4.安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。
      
使用 JDBC API 直接调用存储过程


Java Database Connectivity (JDBC) API 是 J2EE 的一部分,是 Java 语言访问关系数据库的基于标准的首要机制,提供了对数据库访问和缓存管理的直接控制。

JDBC 中的 CallableStatement 对象为所有的关系数据库管理系统 (RDBMS: Relational Database Management System) 提供了一种标准形式调用存储过程的方法。对存储过程的调用有两种形式:带结果参数和不带结果参数。结果参数是一种输出参数,是存储过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数。

在 JDBC 中调用存储过程的语法为:{call procedure_name[(?, ?, ...)]};返回结果参数的存储过程的语法为:{? = call procedure_name[(?, ?, ...)]};不带参数的存储过程的语法为:{call procedure_name}。其中,问号代表参数,方括号表示其间的内容是可选项。

使用 CallableStatement 对象调用存储过程的过程如下:[/b]

1.使用 Connection.prepareCall 方法创建一个 CallableStatement 对象。
2.使用 CallableStatement.setXXX 方法给输入参数(IN)赋值。
3.使用 CallableStatement.registerOutParameter 方法来指明哪些参数只做输出参数(OUT),哪些是输入输出参数(INOUT)。
4.调用以下方法之一来调用存储过程:
-->int CallableStatement.executeUpdate: 存储过程不返回结果集。
-->ResultSet CallableStatement.executeQuery: 存储过程返回一个结果集。
-->Boolean CallableStatement.execute: 存储过程返回多个结果集。
-->int[] CallableStatement.executeBatch: 提交批处理命令到数据库执行。
5.如果存储过程返回结果集,则得到其结果集。
6.调用 CallableStatement.getXXX 方法从输出参数 (OUT) 或者输入输出参数 (INOUT) 取值。
7.使用完 CallableStatement 对象后,使用 CallableStatement.close 方法关闭 CallableStatement 对象。

[b]1. 使用 executeUpdate 来执行的存储过程

Connection con = null; 
 ... 
 // Create a CallableStatement object 
 CallableStatement cstmt = con.prepareCall("CALL exampleJDBC (?, ?, ?, ?, ?)");  
 cstmt.setString (1, “BeiJing”);  // Set input parameter 
 cstmt.setInt (2, 2008);        // Set input parameter 
 cstmt.registerOutParameter (3, Types.INTEGER); 
 cstmt.registerOutParameter (4, Types.INTEGER); 
 cstmt.registerOutParameter (5, Types.VARCHAR); 
 cstmt.executeUpdate(); 	 // Call the stored procedure 
 int goldnumber = cstmt.getInt(3);   // Get the output parameter values 
 int silvernumber = cstmt.getInt(4); 
 String errorinfo = cstmt.getString(5); 
 cstmt.close();

当存储过程返回一个结果集时,只需遍历该结果集便可以得到存储过程执行的所有结果。

2. 存储过程返回一个结果集
				
 CallableStatement cstmt = null; 
…
 boolean moreResultSets = cstmt.execute(); 
 ResultSet rs1 = cstmt.getResultSet(); 
 while (rs1.next()) 
     System.out.println(rs1.getString(1) + " " + rs1.getString(2)); 

当存储过程返回多个结果集时,遍历所有结果集才能得到执行的所有结果,使用 getMoreResults() 方法跳转到下一个结果集。

3. 存储过程返回多个结果集

CallableStatement cstmt = null; 
…
 While (cstmt.getMoreResults()) { 
 ResultSet rs2 = cstmt.getResultSet(); 
 while (rs2.next()) 
     System.out.println(rs2.getString(1) + " " + rs2.getString(2)); 
 rs2.close(); 
 }



如果存储过程返回多个结果集,每个结果集的数据结构都不一样,或者某些结果集的数据结构未知,则可以使用 getColumnName() 方法来得到结果集中数据的列名。

CallableStatement cstmt = null; 
…
 boolean moreResultSets = cstmt.execute(); 
 while (moreResultSets) { 
    ResultSet rs = cstmt.getResultSet(); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    StringBuffer buffer = new StringBuffer(); 
    for (int i = 1; i <= rsmd.getColumnCount(); i++){ 
         buffer.append(rsmd.getColumnName(i)).append("\t"); 
         System.out.println(buffer.toString()); 
         while (rs.next()) { 
           buffer.setLength(0); 
           for (int i = 1; i <= rsmd.getColumnCount(); i++) 
                buffer.append(rs.getString(i)).append("\t"); 
           System.out.println(buffer.toString()); 
         } 
 } 
 rs.close(); 
    moreResultSets = cstmt.getMoreResults(); 
 } 
分享到:
评论

相关推荐

    C# winform调用SQL存储过程-菜鸟入门 详细注释

    内容概要:简单的C# winform调用存储过程实例,创建存储过程入参,通过SqlConnection对象和SqlCommand对象调用存储过程,获取存储过程的出参并显示出来,详细代码注释,希望对用到C#调用存储过程的小伙伴有帮助 ...

    SQL_Server存储过程调试指南

    资源名称:SQL_Server存储过程调试指南内容简介: 存储过程( Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来...

    高效分页存储过程 高效分页存储过程

    sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程

    Sql Server 存储过程的导出导入.doc

    SqlServer存储过程的导出导入 近日在研究SQL的存储过程,这里我陆续将我在使用存储过程中碰到的问题及解决办法发布到网上,请各位大虾指正。 SqlServer存储过程的导出导入,网上相关资料特别少,经过摸索,这里写...

    数据库原理及应用实验四(存储过程和触发器)

    创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。要求在创建存储过程前请判断该存储过程是否已创建,若已创建则先删除,并给出...

    118个真实应用场景的Oracle存储过程案例及开发指南(从入门到熟练使用)

    1、资料包含了作者编写的实际应用场景中使用的存储过程代码,共计118个案例,有完整注释说明。旨在帮助读者通过案例学习,快速掌握存储过程的应用方法和技巧。 2、博主博客:...

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    birt调用存储过程

    birt报表中调用存储过程的方法. 目录 1. 概述 3 2. BIRT支持的存储过程返回值类型 3 3. BIRT调用存储过程的语法 4 4. 创建存储过程数据源/集 4 5. 在BIRT中使用存储过程 5 调用返回单结果集的存储过程。 5 调用...

    实验9 存储过程的创建和使用

    阅读实验教材《SQL Server 2012数据库管理与开发》第137页到155页的内容,掌握存储过程的概念、了解存储过程的类别(系统存储过程,用户自定义存储过程,扩展存储过程);掌握存储过程的建立;掌握存储过程的两种...

    SQL存储过程SQL存储过程SQL存储过程

    存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程

    mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...

    MySQL数据库:存储过程的创建1.pptx

    创建存储过程1 课程目标 1)了解 ——存储过程的优点; 2)理解 —— 存储过程的概念; 3)掌握 —— 存储过程的创建方法; 存储过程优点 使用存储过程的优点有: (1)存储过程在服务器端运行,执行速度快。 (2)...

    SQLServer存储过程转为oracle存储过程的工具

    可以将SQL Server存储过程转为oracle存储过程的工具

    db2 存储过程语法与实例

    db2 存储过程 db2 存储过程 db2 存储过程

    MySQL创建存储过程批量插入10万条数据

    MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...

    oracle存储过程实例

    oracle 存储过程实例 oracle存储过程实例

    SAP HANA 中调试存储过程

    SAP HANA 中调试存储过程 SAP HANA 中调试存储过程 SAP HANA 中调试存储过程

    存储过程自动生成工具

    1、 基本完全代替编写存储过程的工作任务。 2、 让不会写存储过程的测试人员,也可顺利完成加压测试工作。 3、 让会写存储过程的测试人员,短时间内完成存储过程编写。 4、 可生成现行业主流的不同数据库类型的存储...

    java 调用存储过程

    java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程

Global site tag (gtag.js) - Google Analytics