您当前的位置:首页 > 互联网教程

求助JAVA调用MYSQL存储过程的问题

发布时间:2025-05-12 12:50:10    发布人:远客网络

求助JAVA调用MYSQL存储过程的问题

一、求助JAVA调用MYSQL存储过程的问题

1.数据库存储过程:简单滴说,存储过程就是存储在数据库中的一个程序。

第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快

第二:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。

第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。

第四:存储过程主要是在服务器上运行,减少对客户机的压力。

第五:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。

第六:存储过程可以在单个存储过程中执行一系列 SQL语句。

第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

此外,如果多条SQL语句执行过程中,过程环节返回了数据作为后面环节的输入数据,如果直接通过

SQL语句执行,势必导致大量的数据通过网络返回到客户机,并在客户机运算;如果封装在存储过程中,

则将运算放在服务器进行,不但减少了客户机的压力,同时也减少了网络流量,提高了执行的效率。

MySQL5存储过程,用得人好像不多。按照数据库设计原理来讲,存储过程是在db server上预编译的,所以查询速度会比较起纯SQL语句快很多。可能是现在流行OO,导至存储过程使用的余地大打折扣。但如果从效果上来讲,用存储过程来实现业务规则所带得DB SERVER压力,比用JAVA类实现业务规则所带来的WEB SERVER压力要小。当然存储过程也不应滥用,象普通的insert、update之类的语句就不需要使用存储过程了。

MySQL创建procudure的语法与sql server/Oracle差别较大。

create procedure usp_test(param varchar(20)

select* from talbeName where column=param

create procedure usp_test2(t varchar(20))

update table set column= xname where column1=t;

MySQL创建存储过程时不带as,而且()不能省略,即便是没有传入参数。这一点象sql server或是oracle那样直观,而且声明变量时直接用declare,不用加的@或@@(in out变量除外)。还有一点是很怪的语法,如果是以“select”为开头的存储过程,是不能加"begin end"的。"begin end"表示多条SQL语句的复合体。

当然,事实上几乎没有哪款数据库是完全符合SQL3标准的,多少都含有自己的一些成份里面,这也造成使用存储过程会使程序的可移性降低。

MySQL使用call关键字。例:call usp_test('test');而不是execute,同样()是不能省略的。

创建完procedure后,再看看java是如何调用procedure的。

conn=DbConn.getDbConn();//getpoolconn

CallableStatementcstmt=conn.prepareCall("{callusp_test(?)}");

}

这里使用的是"{call usp_test()}"来调用存储过程。同时也可以编程传入参数,进行查询。

这里使用的是"{call usp_test()}"来调用存储过程。同时也可以编程传入参数,进行查询。

二、java如何获得mysql存储过程的返回值

本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft目前正在准备这本书。这本书是一本教程,同时也是 JDBC的重要参考手册,它将作为 Java系列的组成部份在 1997年春季由 Addison-Wesley出版公司出版。

CallableStatement对象为所有的 DBMS提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参数,另一种形式不带结果参数(有关换码语法的信息,参见第 4节“语句”)。结果参数是一种输出(OUT)参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。问号将用作参数的占位符。

在 JDBC中调用已储存过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。

不带参数的已储存过程的语法类似:

通常,创建 CallableStatement对象的人应当知道所用的 DBMS是支持已储存过程的,并且知道这些过程都是些什么。然而,如果需要检查,多种 DatabaseMetaData方法都可以提供这样的信息。例如,如果 DBMS支持已储存过程的调用,则 supportsStoredProcedures方法将返回 true,而 getProcedures方法将返回对已储存过程的描述。

CallableStatement继承 Statement的方法(它们用于处理一般的 SQL语句),还继承了 PreparedStatement的方法(它们用于处理 IN参数)。CallableStatement中定义的所有方法都用于处理 OUT参数或 INOUT参数的输出部分:注册 OUT参数的 JDBC类型(一般 SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为 JDBC NULL。

7.1.1创建 CallableStatement对象

CallableStatement对象是用 Connection方法 prepareCall创建的。下例创建 CallableStatement的实例,其中含有对已储存过程 getTestData调用。该过程有两个变量,但不含结果参数:

CallableStatement cstmt= con.prepareCall(

其中?占位符为 IN、 OUT还是 INOUT参数,取决于已储存过程 getTestData。

将 IN参数传给 CallableStatement对象是通过 setXXX方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的 setXXX方法(例如,用 setFloat来传入 float值等)。

如果已储存过程返回 OUT参数,则在执行 CallableStatement对象以前必须先注册每个 OUT参数的 JDBC类型(这是必需的,因为某些 DBMS要求 JDBC类型)。注册 JDBC类型是用 registerOutParameter方法来完成的。语句执行完后,CallableStatement的 getXXX方法将取回参数值。正确的 getXXX方法是为各参数所注册的 JDBC类型所对应的 Java类型(从 JDBC类型到 Java类型的标准映射见 8.6.1节中的表)。换言之, registerOutParameter使用的是 JDBC类型(因此它与数据库返回的 JDBC类型匹配),而 getXXX将之转换为 Java类型。

作为示例,下述代码先注册 OUT参数,执行由 cstmt所调用的已储存过程,然后检索在 OUT参数中返回的值。方法 getByte从第一个 OUT参数中取出一个 Java字节,而 getBigDecimal从第二个 OUT参数中取出一个 BigDecimal对象(小数点后面带三位数):

CallableStatement cstmt= con.prepareCall(

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);

java.math.BigDecimal n= cstmt.getBigDecimal(2, 3);

CallableStatement与 ResultSet不同,它不提供用增量方式检索大 OUT值的特殊机制。

既支持输入又接受输出的参数(INOUT参数)除了调用 registerOutParameter方法外,还要求调用适当的 setXXX方法(该方法是从 PreparedStatement继承来的)。setXXX方法将参数值设置为输入参数,而 registerOutParameter方法将它的 JDBC类型注册为输出参数。setXXX方法提供一个 Java值,而驱动程序先把这个值转换为 JDBC值,然后将它送到数据库中。

这种 IN值的 JDBC类型和提供给 registerOutParameter方法的 JDBC类型应该相同。然后,要检索输出值,就要用对应的 getXXX方法。例如,Java类型为 byte的参数应该使用方法 setByte来赋输入值。应该给 registerOutParameter提供类型为 TINYINT的 JDBC类型,同时应使用 getByte来检索输出值(第 8节“JDBC和 Java类型之间的映射”将给出详细信息和类型映射表)。

下例假设有一个已储存过程 reviseTotal,其唯一参数是 INOUT参数。方法 setByte把此参数设为 25,驱动程序将把它作为 JDBC TINYINT类型送到数据库中。接着,registerOutParameter将该参数注册为 JDBC TINYINT。执行完该已储存过程后,将返回一个新的 JDBC TINYINT值。方法 getByte将把这个新值作为 Java byte类型检索。

CallableStatement cstmt= con.prepareCall(

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

7.1.4先检索结果,再检索 OUT参数

由于某些 DBMS的限制,为了实现最大的可移植性,建议先检索由执行 CallableStatement对象所产生的结果,然后再用 CallableStatement.getXXX方法来检索 OUT参数。

如果 CallableStatement对象返回多个 ResultSet对象(通过调用 execute方法),在检索 OUT参数前应先检索所有的结果。这种情况下,为确保对所有的结果都进行了访问,必须对 Statement方法 getResultSet、getUpdateCount和 getMoreResults进行调用,直到不再有结果为止。

检索完所有的结果后,就可用 CallableStatement.getXXX方法来检索 OUT参数中的值。

7.1.5检索作为 OUT参数的 NULL值

返回到 OUT参数中的值可能会是 JDBC NULL。当出现这种情形时,将对 JDBC NULL值进行转换以使 getXXX方法所返回的值为 null、0或 false,这取决于 getXXX方法类型。对于 ResultSet对象,要知道 0或 false是否源于 JDBC NULL的唯一方法,是用方法 wasNull进行检测。如果 getXXX方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase。

三、MySQL中使用EXEC命令的方法详解mysql中exec

MySQL是一种流行的开源数据库管理系统,它支持多种编程语言,包括C、Python和Java等。MySQL作为一种强大的数据库管理系统,为开发人员提供了多种命令来管理和查询数据。其中EXEC命令是,一种在MySQL中执行脚本的重要命令。在本篇文章中,我们将详细讲解MySQL中使用EXEC命令的方法。

EXEC是MySQL中的一个命令,可以将脚本文件读入MySQL客户端并运行。在MySQL中,可以使用该命令来执行存储过程、触发器、函数和视图等各种类型的对象。EXEC命令的语法如下:

其中sql_statement是存储过程、触发器、函数或视图的SQL语句。

使用EXEC命令有许多好处,如下述:

(1)执行存储对象:可以执行存储对象,包括存储过程、触发器、函数和视图等。

(2)优化查询:可以优化查询,减少查询时间。

(3)使用脚本文件:可以使用脚本文件来进行批处理操作,提高数据处理效率。

EXEC命令具有广泛的应用,可以执行各种类型的SQL查询。下面我们将具体介绍如何使用EXEC命令来执行存储过程。

我们需要创建一个名为”AddEmployee”的存储过程,该存储过程将接收三个参数:EmployeeName,EmployeeSalary和EmployeeAge,然后将这些参数插入到一个名为”employee”的表中。

INSERT INTO employee(name, salary, age) VALUES(EmployeeName, EmployeeSalary, EmployeeAge);

我们可以在MySQL客户端中调用该存储过程,如下述:

EXECUTE AddEmployee(‘John’, 50000, 25);

该语句将在employee表中插入一条数据,其中包括”John”、50000和25,表示员工的姓名、薪资和年龄。

MySQL中的EXEC命令是执行存储过程、触发器、函数和视图等对象的重要工具。使用该命令可以提高查询效率,优化数据处理操作。在本文中,我们对MySQL中使用EXEC命令的方法进行了详细的讲解,希望能对开发人员有所帮助。