JDBC存储过程的调用

一. JDBC存储过程的调用

(1)存储过程是用SQL语句和控制流语句等编写的一段程序代码,在创建时已被编译成机器代码并存储在数据库中供客户端调用。

存储过程有以下优点:

1.所生成的机器代码被永久存储在数据库中,客户端调用时不需要重新编译,执行起来效率要高一些。

2.存储过程的网络使用效率比等效的SQL 语句要高。

(2)JDBC通过java.sql.CallableStatement接口调用数据库服务器中的存储过程;

(3)CallableStatement接口继承了PreparedStatement,PreparedStatement中常用的方法也适用于CallableStatement接口,

接口中常用的方法有:

1.public void setString(int n,String x)  throws SQLException

将一个字符串类型的数据值x写入存储过程调用命令的第n个“?”号处,代替“?”,n为预编译语句中“?”的序号,第一个“?”的序号为1。

2.public ResultSet executeQuery() throws SQLException

执行一个会返回ResultSet结果集的存储过程。

3.public boolean execute() throws SQLException

通用的存储过程执行方法

4.public void registerOutParameter(int n,int sqlType)  throws SQLException

将存储过程调用命令{call …}中第n个位置处的“?”参数注册声明为输出(OUT)参数,并定义返回数据的类型。返回数据类型SqlType可以用java.sql.Types类中的符号常量表达。

5.public int getInt(int n) throws SQLException

读取存储过程调用命令中“?”位置处的一个整数返回值,n为“?”号在存储过程调用命令中的序号。

二.实例解说

(1).调用一个能够返回一个ResulSet结果集的存储过程,对titles表的书名字段进行模糊查询,返回书名、类型、单价数据。操作步骤如下:

第1步:在pubs中创建一个名为exam4的存储过程完成查询。(在数据库中SQL Server中完成)

use pubs
go
create proc  exam4 @key varchar(50)
as
begin
   select title,type,price from titles  where title like @key
end

第2步:新建一个名为exam608.jsp的页面,在此JSP网页中调用此存储过程。

<%@ page contentType="text/html; charset=gb2312" language="java"
	import="java.sql.*" errorPage=""%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
	<%
		Connection con = null;
		CallableStatement st = null;
		ResultSet rs = null;
		try {
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			String url = "jdbc:sqlserver://localhost:1433;databaseName=pubs;user=sa;password=";
			con = DriverManager.getConnection(url);

			String sql = "{call exam4(?)}"; //效果往这来看!!!
			st = con.prepareCall(sql);
			st.setString(1, "%the%");

			rs = st.executeQuery();
			while (rs.next()) {
				out.print(rs.getString(1));
				out.print(rs.getString(2));
				out.print(rs.getString(3));
				out.print("<br>");
			}

		} catch (Exception e) {
			out.print("数据库操作出错:" + e);
		} finally {
			if (rs != null)
				rs.close();
			if (st != null)
				st.close();
			if (con != null)
				con.close();
		}
	%>
</body>
</html>

(2)调用一个存储过程,给titles表添加一条新记录,新记录中至少包含书号、书名、类型、单价、出版日期五个数据。用存储过程实现。

操作步骤如下:

第1步:在pubs中创建一个名为newRecord的存储过程,输入以下代码:

use pubs
go
create proc  newRecord @title_id varchar(50),
                       @title varchar(100),
                       @type varchar(30),
                       @price money,
                       @pubdate datetime
as
begin
  insert into titles(title_id,title,type,price,pubdate)
      values(@title_id,@title,@type,@price,@pubdate)
end

第2步:建立一个名为exam609.jsp的JSP表单页面供用户输入图书信息。

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="exam610.jsp">
  请输入书号(如AD3344):
  <label>
  <input name="book_id" type="text" id="book_id" />
  </label>
  <p>请输入书名(如Java程序设计):
    <label>
    <input name="book_name" type="text" id="book_name" />
    </label>
  </p>
  <p>请选择书的类型:
    <label>
    <select name="book_type" id="book_type">
      <option value="business">business</option>
      <option value="psychology">psychology</option>
      <option value="trad_cook">trad_cook</option>
      <option value="popular_comp">popular_comp</option>
    </select>
    </label>
  </p>
  <p>请输入书的单价(如45.3):
    <label>
    <input name="book_price" type="text" id="book_price" />
    </label>
  </p>
  <p>请输入图书的出版日期(如2004-3-6):
    <label>
    <input name="pub_date" type="text" id="pub_date" />
    </label>
  </p>
  <p>
    <label>
    <input type="submit" name="Submit" value="提交" />
    </label>
  </p>
</form>
</body>
</html>

第3步:定义exam610.jsp读取表单中的数据并写入数据库中。

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"  errorPage="" %>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>

<body>
<%
   String book_id=request.getParameter("book_id");
   String book_name=request.getParameter("book_name");
   String book_type=request.getParameter("book_type");
   String book_price=request.getParameter("book_price");
   String pub_date=request.getParameter("pub_date");
   	Connection	         con=null;
   CallableStatement     st =null;
	try
	{
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	  String url="jdbc:sqlserver://localhost:1433;databaseName=pubs;user=sa;password=";
	  con = DriverManager.getConnection(url);
	  String sql="{call newRecord(?,?,?,?,?)}";
	  st=con.prepareCall(sql);
	  st.setString(1,book_id);
	  st.setString(2,book_name);
	  st.setString(3,book_type);
	  st.setDouble(4,Double.parseDouble(book_price));
	  st.setString(5,pub_date);

	  st.execute();
	  out.println("成功加入记录,请用查询分析器验证");
	}
  catch(Exception e)
  {
     out.println(e);
  }
  finally
  {
	if(st != null )
	   {st.close();}
	if(con != null )
	   {con.close();}
  }
%>
</body>
</html>
时间: 2024-11-04 00:29:32

JDBC存储过程的调用的相关文章

JDBC对MySQL数据库存储过程的调用

一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完毕特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中.用户通过指定存储过程的名字并给出參数(假设该存储过程带有參数)来运行它. 2.与一般SQL语句相比.使用存储过程有哪些长处.有哪些缺点 长处: 1).降低了脚本的运行环节,缩短了获取数据的时间.存储过程仅仅在创建的时进行编译,在调用使用的时候直接运行.不需再次编译:而一般SQL语句每次运行前都须要编译

JDBC存储过程调用

在讨论JDBC Statement教程文章时,我们已经学习了如何在JDBC中使用存储过程. 本教程文章与该部分类似,但它将讲解演示有关JDBC SQL转义语法的其他信息. 就像Connection对象创建Statement和PreparedStatement对象一样,它可使用同样的方式创建CallableStatement对象,该对象将用于执行对数据库存储过程的调用. 创建CallableStatement对象 假设需要执行以下Oracle存储过程 - CREATE OR REPLACE PRO

JAVA对存储过程的调用方法

博客分类: java java存储过程sql 一:Java如何实现对存储过程的调用:   A:不带输出参数的   ---------------不带输出参数的----------------------------------create procedure getsum@n int =0<--此处为参数-->asdeclare @sum int<--定义变量-->declare @i intset @sum=0set @i=0while @i<[email protecte

Java对存储过程的调用方法 --转载

一.Java如何实现对存储过程的调用: A:不带输出参数的 create procedure getsum @n int =0<--此处为参数--> as declare @sum int<--定义变量--> declare @i int set @sum=0 set @i=0 while @i<=@n begin set @sum=@sum+@i set @i=@i+1 end print 'the sum is '+ltrim(rtrim(str(@sum))) 在SQL

在 SQL Server 的存储过程中调用 Web 服务

介绍 一个老朋友计划开发一个应用,基于 .NET 和 Socket,但需要在存储过程中调用 Web 服务. 在这篇文章中我们将分享这个应用的经验,讲述如何在存储过程中调用 Web 服务,并传递参数. Step 1 首先我们在 Visual Studio 中创建一个 Web 服务项目: Step 2 接下来在服务中添加我们需要的方法,在这里我们创建 6 个方法,分别是 Greet (string Param1) ,HelloWord() , Add, subtract, 和 Divide (Num

ADO.NET之存储过程的调用

要执行存储过程就必须连接到数据库 代码如下: string source = "server=(local) \\SQLEXPRESS;integrated security=SSPI;database=Student"; SqlConnection con = new SqlConnection(source);//建立一个连接 con.Open();//打开数据库 if (con.State == ConnectionState.Open)//ConnectionState为枚举值

oracle创建函数和调用存储过程和调用函数的例子(区别)

创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; --创建函数 create or replace function func (dno number) return number is t_max number; begin select max(sal) into t_max from emp t where deptno = dno; ret

SQLSERVER JDBC 存储过程调用偶尔很慢的原因之一【sp_sproc_columns】

在对于CallableStatement进行参数赋值或者取值时,建议直接用索引号,避免使用参数名称! 若使用参数名称,每次调用该存储过程时,jdbc会自动执行 exec sp_sproc_columns的存储过程,获取指定存储过程的对应参数. 不知道具体原因,但是在本机时候,调用该存储过程的表现非常不稳定,从几毫秒到十几秒都有出现过.若有知道原因的童鞋,烦请告知一声!

jdbc,链接调用数据库的方法——例题

package com.jdbcke; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import jav