Java调用SQL Server存储过程

合集下载

java 调用sqlserver的执行计划

java 调用sqlserver的执行计划

java 调用sqlserver的执行计划摘要:1.Java 连接SQL Server 的方法2.SQL Server 的执行计划概念3.Java 调用SQL Server 存储过程的步骤4.实际案例:Java 调用SQL Server 存储过程的示例5.总结正文:1.Java 连接SQL Server 的方法Java 语言可以通过JDBC(Java Database Connectivity)技术连接SQL Server 数据库。

要实现这一连接,首先需要下载并添加Microsoft JDBC 驱动(sqlserver.jar)到Java 项目中。

然后,通过以下代码建立与SQL Server 的连接:```javaString url ="jdbc:sqlserver://localhost:1433;database=test;user=sa;password=12345 6";Connection conn = DriverManager.getConnection(url);```2.SQL Server 的执行计划概念执行计划是SQL Server 中用于存储和管理预编译的SQL 语句及其执行计划的一种对象。

执行计划可以提高SQL 语句的执行效率,特别是在多次执行相同语句的情况下。

3.Java 调用SQL Server 存储过程的步骤(1)创建SQL Server 存储过程。

例如,创建一个名为“get_employee_list”的存储过程,用于查询员工信息:```sqlCREATE PROCEDURE get_employee_listASBEGINSELECT * FROM employee;END;```(2)在Java 代码中调用存储过程。

通过以下代码调用上面创建的存储过程:```javaString sql = "EXEC get_employee_list";CallableStatement cstmt = conn.prepareCall(sql);cstmt.execute();ResultSet rs = cstmt.getResultSet();while (rs.next()) {System.out.println(rs.getString("name") + ", " +rs.getString("age"));}```4.实际案例:Java 调用SQL Server 存储过程的示例假设有一个名为“employee”的表,包含以下字段:id, name, age。

存储过程调用java代码的方法

存储过程调用java代码的方法

存储过程调用java代码的方法存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。

在Java中,我们可以通过以下方法来调用存储过程:1. 使用JDBC调用存储过程使用JDBC调用存储过程需要以下步骤:1)获取数据库连接。

2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。

3)设置输入参数和输出参数。

输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。

4)执行存储过程。

可以使用execute()或executeUpdate()方法执行。

5)获取输出参数。

以下是一个简单的示例:```try(Connection conn = DriverManager.getConnection(url, user, password)) {CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');cs.setInt(1, 1); // 设置输入参数cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参数cs.execute(); // 执行存储过程String result = cs.getString(2); // 获取输出参数System.out.println(result);} catch (SQLException e) {e.printStackTrace();}```2. 使用ORM框架调用存储过程使用ORM框架调用存储过程需要根据不同的框架进行配置。

以下是使用MyBatis调用存储过程的示例:1)在Mapper XML文件中定义存储过程调用语句。

```<select id='callProcedure' statementType='CALLABLE'>{call procedure_name(#{param1, mode=IN,jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}</select>```2)在Java代码中调用Mapper方法。

Java调用SQLServer存储过程分析

Java调用SQLServer存储过程分析

Java调用SQL Server存储过程Java调用SQL Server的存储过程详解,主要内容:●使用不带参数的存储过程●使用带有输入参数的存储过程●使用带有输出参数的存储过程●使用带有返回状态的存储过程●使用带有更新计数的存储过程1.使用不带参数的存储过程使用JDBC 驱动程序调用不带参数的存储过程时,必须使用call SQL 转义序列。

不带参数的call 转义序列的语法如下所示:实例:在SQL Server 2005 AdventureWorks示例数据库中创建以下存储过程:此存储过程返回单个结果集,其中包含一列数据(由Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。

在下面的实例中,将向函数传递AdventureWorks示例数据库的打开连接,然后使用executeQuery方法调用GetContactFormalNames存储过程。

2.使用带有输入参数的存储过程使用JDBC 驱动程序调用带参数的存储过程时,必须结合SQLServerConnection 类的prepareCall方法使用call SQL转义序列。

带有IN参数的call转义序列的语法如下所示:构造call转义序列时,请使用?(问号)字符来指定IN参数。

此字符充当要传递给该存储过程的参数值的占位符。

可以使用SQLServerPreparedStatement类的setter方法之一为参数指定值。

可使用的setter方法由IN参数的数据类型决定。

向setter方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。

例如,如果存储过程包含单个IN参数,则其序数值为1。

如果存储过程包含两个参数,则第一个序数值为1,第二个序数值为2。

作为调用包含IN参数的存储过程的实例,使用SQL Server 2005 AdventureWorks示例数据库中的uspGetEmployeeManagers存储过程。

java调用存储过程、存储函数

java调用存储过程、存储函数

java调⽤存储过程、存储函数需要⽤到的接⼝接⼝ CallableStatementJDK⽂档对改接⼝的说明:public interface CallableStatementextends⽤于执⾏ SQL 存储过程的接⼝。

JDBC API 提供了⼀个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使⽤标准⽅式调⽤存储过程。

此转义语法有⼀个包含结果参数的形式和⼀个不包含结果参数的形式。

如果使⽤结果参数,则必须将其注册为 OUT 参数。

其他参数可⽤于输⼊、输出或同时⽤于⼆者。

参数是根据编号按顺序引⽤的,第⼀个参数的编号是 1。

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} -------存储函数的sql,第⼀个?代表返回类型{call <procedure-name>[(<arg1>,<arg2>, ...)]} -------存储过程的sqlIN 参数值是使⽤继承⾃的 set ⽅法设置的。

在执⾏存储过程之前,必须注册所有 OUT 参数的类型;它们的值是在执⾏后通过此类提供的 get ⽅法获取的。

CallableStatement 可以返回⼀个对象或多个 ResultSet 对象。

多个 ResultSet 对象是使⽤继承⾃的操作处理的。

为了获得最⼤的可移植性,某⼀调⽤的 ResultSet 对象和更新计数应该在获得输出参数的值之前处理。

例⼦程序对oracle的scott/tiger⽤户的emp表操作存储过程,查询员⼯信息create or replace procedure queryEmpInfo(eno in number,pename out varchar2,psal out number,pjob out varchar2)asbeginselect ename,sal,job into pename,psal,pjob from emp where empno=eno;end;存储函数:create or replace function queryEmpImcome(eno in number)return numberas--变量psal emp.sal%type;pcomm m%type;beginselect sal,comm into psal,pcomm from emp where empno=eno;return (psal+nvl(pcomm,0))*12;end;jdbc⼯具类package com.lhy.util;import java.sql.*;/*** JDBC⼯具类,⼀般⼯具类final。

如何调用SQL Server的存储过程?

如何调用SQL Server的存储过程?

如何调用SQL Server的存储过程?调用数据库存储过程见下:<%Set Dataconn = Server.CreateObject("ADODB.Connection")' 建立连接对象Dataconn.Open"DSN=SinoTrans;SERVER=APP_SERVER;UID=sa;PWD=;APP=Microsoft(R) Developer Studio;WSID=APP_SERVER;Regional=Yes"Set cmdTemp = Server.CreateObject("mand")' 建立命令对象Set rst = Server.CreateObject("ADODB.Recordset")' 建立记录集对象mandText = "dbo.yanbing"' 存储过程名称mandType = 4' 命令类别为4,表示为存储过程Set cmdTemp.ActiveConnection = DataconnSet tmpParam = cmdTemp.CreateParameter("Return Value", 3, 4, 4)cmdTemp.Parameters.Append tmpParamSet tmpParam = cmdTemp.CreateParameter("@BeginDate", 135, 1, 16, riqi)' 创建输入参数对象cmdTemp.Parameters.Append tmpParamrst.Open cmdTemp, , 1, 3' 生成查询结果%>注意,此例调用的存储过程为yanbing,这是ADO中提供的标准方法,但存在一个问题,就是当在存储过程中有两个以上的SELECT语句,但从逻辑上又不可能同时执行的时候,ADO会提示我们存储过程中SELECT语句太多,解决方法是直接用ADO 的CONNECTION对象的EXECUTE方法直接执行存储过程:<%Set Dataconn = Server.CreateObject("ADODB.Connection")' 建立连接对象Dataconn.Open"DSN=SinoTrans;SERVER=APP_SERVER;UID=sa;PWD=;APP=Microsoft(R) Developer Studio;WSID=APP_SERVER;Regional=Yes"ss = "EXECUTE dbo.yanbing " & "'" & riqi1 & "'"Set rs = dataconn.Execute(ss)%>。

如何在Java程序中调用存储过程

如何在Java程序中调用存储过程

如何在Java程序中调用存储过程(一)?(1)使用scott/tiger用户在Oracle中创建2个表并插入几条数据。

Create table carl_test(A varchar2(200));create table carl_test1(B varchar2(200));--insert some data into carl_test1 tableinsert into carl_test1 values('carl1');insert into carl_test1 values('carl2');insert into carl_test1 values('carl3');commit;(2)使用scott/tiger用户在Oracle中创建一个测试存储过程,该存储过程有三个参数,第一个参数为输入参数,最后两个参数为输出参数。

为简单起见,没有在该存储过程中加入异常捕获机制。

CREATE OR REPLACE PROCEDURE carl_sp_test( v_monthly IN varchar2,last_inserted_rows_num OUT number,all_effected_rows_num OUT number)ISBEGIN/*删除carl_test表中所有记录*/delete carl_test;/*将删除行数赋值给总影响行数*/all_effected_rows_num := SQL%Rowcount;commit;/*将用户输入参数插入carl_test表中*/insert into carl_test(a) values(v_monthly);all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;/*将表carl_test1中的所有记录插入到carl_test1中*/insert into carl_testselect* from carl_test1;/*获得影响记录数*/last_inserted_rows_num:=SQL%Rowcount;all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;commit;END carl_sp_test;(3)使用scott/tiger用户在SQL/Plus中测试上述存储过程SQL> variable all_effected_rows_num number;SQL> variable last_inserted_rows_num number;SQL> exec carl_sp_test('first var',:last_inserted_rows_num,:all_effected_rows_num);PL/SQL procedure successfully completedlast_inserted_rows_num---------3all_effected_rows_num---------4SQL> print last_inserted_rows_num;last_inserted_rows_num---------3SQL> print all_effected_rows_num;all_effected_rows_num---------4SQL>上述结果表示测试成功(4)使用下面的Java类TestStoreProcedure.java测试存储过程。

sqlserver 函数中调用存储过程

sqlserver 函数中调用存储过程

SQL Server 函数中调用存储过程简介在 SQL Server 数据库中,函数(Function)和存储过程(Stored Procedure)是分别用于执行特定功能的两种对象。

函数是一种可以接受参数并返回一个值的操作,而存储过程则是一组预定义的 SQL 语句集合,可接受输入参数并返回结果集或修改数据库状态。

本文将介绍如何在 SQL Server 函数中调用存储过程,实现在函数内部对存储过程进行调用并获取结果的功能。

通过调用存储过程,我们可以将复杂的逻辑封装起来,并在函数中直接使用。

为什么要在函数中调用存储过程?在 SQL Server 中,函数具有一些限制和特性,如只能访问数据库的静态数据、不能修改数据库状态等。

这些限制使得函数的功能有一定的局限性。

而存储过程可以执行更复杂的操作,包括访问动态数据、修改数据库状态、执行事务控制等。

因此,将存储过程与函数结合使用,可以充分发挥它们各自的优势,实现更灵活和强大的功能。

通过在函数中调用存储过程,我们可以在函数内部执行复杂的业务逻辑,同时利用存储过程的强大功能,使函数具有更高的灵活性和功能性。

在函数中调用存储过程的实现方法下面将介绍在 SQL Server 函数中调用存储过程的实现方法。

主要分为以下几个步骤:1. 创建存储过程首先,我们需要创建一个存储过程,用于实现我们想要的功能。

可以使用 SQL Server Management Studio 或其他 SQL 编辑工具来创建存储过程。

存储过程的创建语法如下:CREATE PROCEDURE procedure_name@parameter1 data_type,@parameter2 data_type,...ASBEGIN-- 存储过程的逻辑代码END在存储过程中,可以定义输入参数和输出参数,根据实际需求进行编写。

存储过程中的逻辑代码可以包括 SQL 查询、数据处理、事务控制等。

2. 创建函数创建函数的语法与创建存储过程类似,可以使用 SQL Server Management Studio 或其他 SQL 编辑工具来创建函数。

java调用sql函数_java调用数据库中的函数和存储过程

java调用sql函数_java调用数据库中的函数和存储过程

java调用sql函数_java调用数据库中的函数和存储过程Java是一种常用的编程语言,用于开发各种类型的应用程序,包括与数据库进行交互的应用程序。

在Java程序中,我们可以使用JDBC(Java Database Connectivity)技术来连接和操作数据库。

通过JDBC,我们可以调用数据库中的函数和存储过程来执行一些特定的任务。

在Java中调用SQL函数和存储过程的基本步骤如下:2. 建立数据库连接:使用JDBC连接字符串、用户名和密码等相关参数来创建与数据库的连接。

JDBC提供了一个名为Connection的接口来表示与数据库的连接。

可以使用DriverManager类的静态方法getConnection来获取数据库连接对象。

```javaString username = "用户名";String password = "密码";Connection connection = DriverManager.getConnection(url, username, password);```3. 创建CallableStatement对象:CallableStatement是一个表示可以执行存储过程或函数的SQL语句的接口。

使用Connection对象的prepareCall方法创建一个CallableStatement对象。

```javaString sql = "{call 存储过程或函数名称(参数1, 参数2, ...)}";CallableStatement statement = connection.prepareCall(sql);```4. 设置参数:如果存储过程或函数需要输入参数,可以使用setXXX 方法设置参数的值。

XXX表示参数的数据类型,例如setInt、setString 等。

参数索引从1开始。

```javastatement.setString(1, "参数值");```5. 执行SQL语句:使用execute方法执行存储过程或函数。

java调用ORACLE,SQLSERVER过程

java调用ORACLE,SQLSERVER过程
if (parameters[i].getType() == OracleTypes.CURSOR ) {
rs = (ResultSet) st.getObject(parameters[i].getNumber());
ResultSetMetaData meta = rs.getMetaData();
break;
}
}
st.executeQuery();
HashMap[] result_sub = null;
int outNum = 0;
for (int i = 0; i < parameters.length; i++) {
if (parameters[i].isOutType()) {
}
try {
conn.close();
} catch (Exception e) {
}
}
return result;
}
/***********sqlserver共用的调用存储过程的方法**************/
public HashMap[][] execProcedure(String procedureSql, ProcedureParameter[] parameters, String dbType) {
}
hash.put(meta.getColumnName(k), temp);
}
vec.add(hash);
}
try {
rs.close();
} catch (Exception e) {
st.registerOutParameter(parameters[i].getNumber(),

代码调用存储过程 java

代码调用存储过程 java

代码调用存储过程java如何在Java中调用存储过程?在Java开发中,有时候需要调用数据库中已经定义好的存储过程来执行特定的操作。

存储过程是一组预定义的SQL语句集合,它们经过编译,存储在数据库中并可以多次重复调用。

本文将详细介绍如何在Java中调用存储过程,并给出逐步的代码示例。

步骤一:建立数据库连接首先,我们需要建立与数据库的连接。

在Java中,可以使用JDBC(Java Database Connectivity)技术来实现与数据库的连接。

JDBC是Java提供的一个标准API,用于与各种关系型数据库进行交互。

在调用存储过程之前,需要先加载数据库驱动和建立数据库连接。

下面的代码展示了如何加载MySQL数据库驱动并建立与数据库的连接:import java.sql.*;public class CallStoredProcedure {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try{Class.forName("com.mysql.jdbc.Driver");conn =DriverManager.getConnection("jdbc:mysql:localhost/testdb", "username", "password");}catch(SQLException se){se.printStackTrace();}catch(Exception e){e.printStackTrace();}}}其中,"com.mysql.jdbc.Driver"是MySQL数据库的驱动类名,"jdbc:mysql:localhost/testdb"是数据库连接的URL,"username"和"password"分别是数据库的用户名和密码。

java连接SqlServer数据库调用存储过程代码

java连接SqlServer数据库调用存储过程代码

java连接SqlServer数据库调用存储过程代码问题:java连接SqlServer数据库调用存储过程代码回答:下面代码演示java如何连接sql server调用存储过程。

要调用存储过程需要使用Connection类的prepareCall方法创建CallableStatement类实例。

第一个例子调用名字为generateID的存储过程,该存储过程需要一个字符串类型的参数。

设置参数的值需要使用setString()方法。

因为此存储过程有返回值,所以我们需要调用executeQuery()方法,此方法返回ResultSet对象。

Connection con = null;CallableStatement proc_stmt = null;ResultSet rs = null;try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver ");con = DriverManager.getConnection("jdbc:sqlserver://MYSERVER;da tabaseName=MYDATABASE", "USERID", "PASSWORD");proc_stmt = con.prepareCall("{ call generateID( ) }");proc_stmt.setString(1, "employee");rs = proc_stmt.executeQuery();if (rs.next()) {int employeeId = rs.getInt(1);System.out.println("Generated employeeId: " + employeeId);} else {System.out.println("Stored procedure couldn't generate new Id");}} catch (ClassNotFoundException ex) {ex.printStackTrace();} catch (SQLException ex) {ex.printStackTrace();} finally {try {rs.close();proc_stmt.close();con.close();} catch (SQLException ex) {ex.printStackTrace();}}//分享代码【第二个例子比第一个例子更简单一些,调用了一个没有参数的存储过程】Connection con = null;CallableStatement proc_stmt = null;try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver ");con = DriverManager.getConnection("jdbc:sqlserver://MYSERVER;da tabaseName=MYDATABASE", "USERID", "PASSWORD");proc_stmt = con.prepareCall("{ call someStoredProc() }");proc_stmt.executeQuery();} catch (ClassNotFoundException ex) {ex.printStackTrace();} catch (SQLException ex) {ex.printStackTrace();} finally {try {proc_stmt.close();con.close();} catch (SQLException ex) {ex.printStackTrace();}}//分享代码分享给朋友:下一篇:分享:新浪RSS解析,比较老的一个话题啦上一篇:使用IMAP协议接收并解析电子邮件。

java sqlserver中存储过程return返回值处理

java sqlserver中存储过程return返回值处理

java sqlserver中存储过程return返回值处理Java与SQL Server中存储过程的返回值处理一、介绍存储过程是一组预先编译的SQL语句集合,可以被视为一种数据库对象,用于执行一系列数据库操作。

在Java应用程序中与SQL Server数据库交互时,经常需要调用存储过程并处理其返回值。

本文将详细介绍在Java中如何调用SQL Server存储过程,并处理其返回值。

我们将按照以下步骤逐一分析。

二、创建存储过程首先,我们需要在SQL Server数据库中创建一个存储过程,用于演示和测试。

假设我们创建一个简单的存储过程,用于根据输入参数获取员工的姓名。

CREATE PROCEDURE GetEmployeeName@EmployeeID INT,@EmployeeName VARCHAR(100) OUTPUTASBEGINSELECT @EmployeeName = EmployeeNameFROM EmployeeWHERE EmployeeID = @EmployeeIDEND这个存储过程接受一个输入参数@EmployeeID,以及一个输出参数@EmployeeName。

它根据输入的员工ID查询数据库,将结果赋值给输出参数@EmployeeName。

三、Java代码中调用存储过程现在,我们可以在Java代码中调用SQL Server中的存储过程。

首先,我们需要建立与数据库的连接。

1. 导入相关的包和类import java.sql.*;2. 建立数据库连接String connectionString ="jdbc:sqlserver:localhost:1433;databaseName=YourDatabase;user=Your User;password=YourPassword";Connection connection =DriverManager.getConnection(connectionString);在上面的代码中,我们使用了JDBC驱动程序建立与数据库的连接。

通过代码示例跟我学如何通过Java JDBC调用SQLServer2000数据库中的存储过程

通过代码示例跟我学如何通过Java JDBC调用SQLServer2000数据库中的存储过程

1.1如何通过Java JDBC调用SQLServer2000数据库中的存储过程1、存储过程概述(1)存储过程存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。

存储过程存储在数据库内,可由应用程序通过一个调用接口执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。

它可以把复杂的查询与客户端隔离。

(2)使用存储过程的优点1)可以在单个存储过程中执行一系列SQL 语句,允许模块化设计并且可以使用参数输入和输出。

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

3)存储过程在创建时即在服务器上进行编译(存储过程被定义以后,将成为数据库的一部分,显示为数据库对象),所以执行起来比单个SQL 语句快。

比在Java程序中使用和发送SQL 语句来操作数据库的速度要快得多。

4)存储过程还具有更好的安全性,它可以包装业务逻辑,对应用层隐蔽数据库结构的改变。

5)当然,使用存储过程也可以大大简化客户应用程序的编写。

因为存储过程运行在DBMS自身,这可以帮助减少应用程序中的等待时间。

不是在Java代码中执行4个或5个SQL语句,而只需要在服务器端执行1个存储过程。

网络上的数据往返次数的减少可以戏剧性地优化性能。

(3)创建存储过程时所应该指定的元素1)所有输入参数和向调用过程或批处理返回的输出参数。

2)执行数据库操作(包括调用其它过程)的编程语句。

3)返回至调用过程或批处理以表明成功或失败(以及失败原因)的状态值2、存储过程的基本语法(1)语法格式CREATE PROCEDURE procedure_name [ ; number ][ { @parameter data_type }[ V ARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ](2)其中的符号的含义:1)procedure_name:新存储过程的名称。

java调用存储过程返回map组装List(含SqlServer存储过程)

java调用存储过程返回map组装List(含SqlServer存储过程)

Action层public ActionForward getProjectPayMoneyJsonByPayType(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {JiLiangZhiFuService jiLiangZhiFuService = this.getServiceLocator().getJiLiangZhiFuService();int year = Integer.parseInt(request.getParameter("year"));String data = jiLiangZhiFuService.getProjectPayMoneyJsonByPayType(year);response.setContentType("text/xml");response.getWriter().write(data);response.getWriter().flush();response.getWriter().close();return null;}Service层public String getProjectPayMoneyJsonByPayType(int year){double allTotal = 0;Map map = jiLiangZhiFuDao.getProjectPayMoneyByPayType(year);List<DataItem> dataItemList = SessionBean.getServiceLocator().getDataItemService().getAllDataItemByTypeId("payType");Map map_ep = new HashMap();map_ep.put("account_id", 2);map_ep.put("isSelectTwoStageProject", true);List<EngineeringPhase> engineeringPhaseList =SessionBean.getServiceLocator().getEngineeringPhaseService().getEngineeringPhaseList(map_ep).getData();Map map_type = new HashMap();StringBuilder sb = new StringBuilder();sb.append("<date><total>"+engineeringPhaseList.size()+"</total>");for(EngineeringPhase engineeringPhase:engineeringPhaseList){String ep_id = engineeringPhase.getEp_id();sb.append("<ProjectPayMoneyInfo>");sb.append("<ep_id>"+ep_id+"</ep_id>");sb.append("<ep_name>"+engineeringPhase.getEp_name()+"</ep_name>");for(DataItem dataItem:dataItemList){String di_id = dataItem.getId();String r_key = ep_id + "," + di_id;if(map.containsKey(r_key)){map_type.put(di_id, map_type.containsKey(di_id) ? (Double.parseDouble(map_type.get(di_id).toString()) + Double.parseDouble(map.get(r_key).toString())) : Double.parseDouble(map.get(r_key).toString()));sb.append("<"+di_id+">"+map.get(r_key)+"</"+di_id+">");}}//项目支付金额合计sb.append("<projectTotal>"+map.get(engineeringPhase.getEp_id())+"</projectTotal>");allTotal += Double.parseDouble(map.get(engineeringPhase.getEp_id()).toString());sb.append("</ProjectPayMoneyInfo>");}//某支付类别金额合计sb.append("<ProjectPayMoneyInfo>");sb.append("<ep_id></ep_id>");sb.append("<ep_name>合计</ep_name>");DecimalFormat df = new DecimalFormat("#.00");for(DataItem dataItem:dataItemList){sb.append("<"+dataItem.getId()+">"+String.format("%.2f", map_type.get(dataItem.getId()))+"</"+dataItem.getId()+">");}//各项目累计合计sb.append("<projectTotal>"+String.format("%.2f", allTotal)+"</projectTotal>");sb.append("</ProjectPayMoneyInfo>");sb.append("</date>");return sb.toString();}Dao层public Map getProjectPayMoneyByPayType(final int year) {try {return (Map)this.getHibernateTemplate().execute(new HibernateCallback(){public Object doInHibernate(Session session) throws HibernateException, SQLException {Connection con = session.connection();Statement stmt = con.createStatement();CallableStatement cs = con.prepareCall("{call proc_records(?)}");cs.setInt(1, year);//ResultSet rs = stmt.executeQuery("{call proc_records}");ResultSet rs = cs.executeQuery();Map map = new HashMap();while (rs.next()) {map.put(rs.getString(1), rs.getString(2));}rs.close();stmt.close();return map;}});} catch ( org.springframework.dao.DataAccessException e) {throw new DataAccessException(e.getMessage(),e);}}Sql:create procedure proc_records@year intasDECLARE@map_table table(r_key varchar(100),r_value varchar(50)) DECLARE@type_id varchar(40)DECLARE@type_name varchar(50)DECLARE@project_id varchar(40)DECLARE@project_name varchar(50)DECLARE@payTypeMoney numeric(16, 2)DECLARE@sumPayTypeMoney numeric(16, 2)BEGINset@payTypeMoney= 0set@sumPayTypeMoney= 0--查询项目列表DECLARE project_cursor CURSOR for select ep_id,ep_name from AB_engineeringPhase where account_id='2'open project_cursorfetch next from project_cursor into@project_id,@project_namewhile@@FETCH_STATUS= 0begin--查询项目支付类别DECLARE projectType_cursor CURSOR for select id,name from T_DataItem where typeId='payType'order by sort ascopen projectType_cursorfetch next from projectType_cursor into@type_id,@type_namewhile@@FETCH_STATUS= 0begin--业务逻辑处理处理内层游标--获取一个项目某一项支付类型的数据--查询一个项目某一支付类别金额select@payTypeMoney=sum(checkProjectPayMoney)from JiLiangZhiFu where projectId=@project_id and payType=@type_id and enterDate>CAST(@year as varchar(4))and enterDate<CAST(@year+1 as varchar(4))and type='outer' group by payType--一个项目某一支付类别金额存入insert into@map_table values(@project_id+','+@type_id,@payTypeMoney)--一个项目累计支付类别金额set@sumPayTypeMoney=@sumPayTypeMoney+@payTypeMoney--一个项目某一支付类别金额重置为set@payTypeMoney= 0fetch next from projectType_cursor into@type_id,@type_name--内层游标向下移动一行end--插入某一项目各个支付类别的金额合计insert into@map_table values(@project_id,@sumPayTypeMoney)set@sumPayTypeMoney= 0close projectType_cursordeallocate projectType_cursorfetch next from project_cursor into@project_id,@project_name--内层游标处理结束后,外层游标才继续向下移动一行endclose project_cursordeallocate project_cursorselect*from@map_tableEND。

Java调用SQLServer的存储过程详解

Java调用SQLServer的存储过程详解

Java调用SQLServer的存储过程详解Java调用SQL Server的存储过程是一种常见的数据库操作方式,本文将详细介绍Java调用SQL Server存储过程的步骤和注意事项。

主要包括如下内容:存储过程简介、Java调用存储过程的方法、事务管理、参数传递、数据操作和错误处理等方面。

一、存储过程简介存储过程是SQL Server中一组预先编译的SQL语句集合,它们被命名并存储在数据库中,可以被多次调用。

存储过程可以接受参数,可以返回结果集。

二、Java调用存储过程的方法1. 使用CallableStatement对象调用存储过程。

2. 使用JdbcTemplate的execute(方法调用存储过程。

三、事务管理四、参数传递存储过程通常需要传递参数,Java调用存储过程时需要注意以下几点:1. 设置参数的类型和值:使用CallableStatement对象的setXXX(方法,其中XXX为参数类型,如setInt(、setString(等。

2. 注册输出参数:将输出参数的位置和类型进行注册,使用CallableStatement对象的registerOutParameter(方法。

3. 获取输出参数的值:使用CallableStatement对象的getXXX(方法,其中XXX为参数类型,如getInt(、getString(等。

五、数据操作在Java调用存储过程时,可以执行各种数据库操作,如插入数据、更新数据等。

通过设置SQL语句和调用executeUpdate(或executeQuery(方法来实现。

六、错误处理在Java调用存储过程时,需要进行错误处理。

可以通过捕获SQL异常并输出错误信息来实现。

使用try-catch块来捕获异常,然后使用SQLException对象获取具体的错误信息。

总结:本文详细介绍了Java调用SQL Server存储过程的步骤和注意事项。

主要包括存储过程简介、Java调用存储过程的方法、事务管理、参数传递、数据操作和错误处理等方面。

SQLSERVER存储过程及调用详解

SQLSERVER存储过程及调用详解

SQLSERVER存储过程及调用详解SQL Server存储过程是一组预编译的SQL语句和控制语句的集合,它们作为一个单独的单元存储在数据库中。

存储过程可以通过调用来执行,它们具有以下优点:提高性能、增加安全性、提高代码复用和可维护性。

本文将详细解释SQL Server存储过程的创建和调用。

首先,我们需要了解如何创建一个SQL Server存储过程。

创建存储过程的语法如下:```CREATE PROCEDURE procedure_nameASsql_statements```- `procedure_name`是存储过程的名称。

- `sql_statements`是存储过程的主体,包含要执行的SQL语句和控制语句。

下面是一个示例,演示如何创建一个存储过程,该存储过程接受一个输入参数并返回一个结果:```CREATE PROCEDURE GetCustomerCountASBEGINSELECT COUNT(*) AS TotalCustomersFROM CustomersEND```在上面的示例中,我们创建了一个名为`GetCustomerCount`的存储过程,该存储过程接受一个城市名称作为输入参数。

它执行一个`SELECT`语句来计算特定城市的客户数量,并将结果返回。

要调用存储过程,可以使用`EXECUTE`或`EXEC`关键字,后跟存储过程的名称和参数值(如果有的话)。

下面是一个示例,演示如何调用上面创建的存储过程:```EXECUTE GetCustomerCount 'London'```上述代码将执行`GetCustomerCount`存储过程,并将`'London'`作为参数传递。

存储过程将返回结果集,其中包含伦敦的客户数量。

如果存储过程具有输出参数,可以使用`OUTPUT`关键字将其指定为输出参数。

下面是一个示例,演示如何在存储过程中使用输出参数:```CREATE PROCEDURE GetCustomerCountASBEGINFROM CustomersEND`````````除了输入参数和输出参数,存储过程还可以有返回值。

java调用sqlserver存储过程

java调用sqlserver存储过程

------------------------------------------------------创建表CREATE TABLE [BookUser] ([UserID] [int] IDENTITY (1, 1) NOT NULL ,[UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,[Title] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,[Guid] [uniqueidentifier] NOT NULL CONSTRAINT [DF_BookUser_Guid] DEFAULT (newid()),[BirthDate] [datetime] NOT NULL ,[Description] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,[Photo] [image] NULL ,[Other] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT[DF_BookUser_Other] DEFAULT ('默认值'),CONSTRAINT [PK_BookUser] PRIMARY KEY CLUSTERED([UserID]) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GO----------------------------------------------------------------创建存储过程CREATE PROCEDURE InsertUser@UserName varchar(50),@Title varchar(255),@Guid uniqueidentifier,@BirthDate DateTime,@Description ntext,@Photo image,@Other nvarchar(50),@UserID int outputAsSet NOCOUNT ONIf Exists (select UserID from BookUser Where Title = @Title)--这一句判断数据库某一个字段的唯一性RETURN 0ELSEBeginINSERT INTO BookUser (UserName,Title,Guid,BirthDate,Description,Photo,Other) V ALUES(@UserName,@Title,@Guid,@BirthDate,@Description,@Photo,@Other)SET @UserID = @@IDENTITYRETURN 1EndGO------------------------------------查询分析器中测试exec InsertUser @UserName='111',@Title='测试1',@Guid='69807bfa-45a1-4f27-a21e-8b90025bff05',@BirthDate='2009-04-01',@Description='44 55',@Photo=null,@Other=null,@UserID='123'--------------------------------------------页面调用<%@ page language="java" import="java.util.*" pageEncoding="gbk"%><%@ page import="java.sql.*"%><%@page import="java.sql.Date;"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'MyJsp.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%//注意:下面的连接方法采用最新的SQL Server的JDBC,//请到/zh-cn/data/aa937724.aspx 下载Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=owend;user=sa;password="; String sql = "{? = call InsertUser(?,?,?,?,?,?,?,?)}";Connection cn = null;CallableStatement cmd = null;String query = "select * from BookUser";try{cn = DriverManager.getConnection(url);cmd = cn.prepareCall(sql);UUID Guid = UUID.randomUUID();String FilePath = application.getRealPath("") + "/test/logo.gif";Date rightNow =Date.valueOf("2009-07-04");java.io.FileInputStream f = new java.io.FileInputStream(FilePath);cmd.setString(1,"mengxianhui"); //注意修改这里,存储过程验证了UserName的唯一性。

Java调用SQL Server的存储过程详解

Java调用SQL Server的存储过程详解

Java调用SQL Server的存储过程详解本文较长,包含了如下几部分1. 使用不带参数的存储过程2. 使用带有输入参数的存储过程3. 使用带有输出参数的存储过程4. 使用带有返回状态的存储过程5. 使用带有更新计数的存储过程1使用不带参数的存储过程使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列。

不带参数的 call 转义序列的语法如下所示:{call procedure-name}作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:CREATE PROCEDURE GetContactFormalNamesASBEGINSELECT TOP10 Title +' '+ FirstName +' '+ LastName AS FormalNameFROM Person.ContactEND此存储过程返回单个结果集,其中包含一列数据(由 Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。

在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用executeQuery方法调用 GetContactFormalNames 存储过程。

public static void executeSprocNoParams(Connection con) {try {Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");while (rs.next()) {System.out.println(rs.getString("FormalName"));}rs.close();stmt.close();}catch (Exception e) {e.printStackTrace();}}2使用带有输入参数的存储过程使用 JDBC 驱动程序调用带参数的存储过程时,必须结合SQLServerConnection类的prepareCall方法使用 call SQL 转义序列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java调用SQL Server存储过程
Java调用SQL Server的存储过程详解,主要内容:
●使用不带参数的存储过程
●使用带有输入参数的存储过程
●使用带有输出参数的存储过程
●使用带有返回状态的存储过程
●使用带有更新计数的存储过程
1.使用不带参数的存储过程
使用JDBC 驱动程序调用不带参数的存储过程时,必须使用call SQL 转义序列。

不带参数的call 转义序列的语法如下所示:
实例:在SQL Server 2005 AdventureWorks示例数据库中创建以下存储过程:
此存储过程返回单个结果集,其中包含一列数据(由Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。

在下面的实例中,将向函数传递AdventureWorks示例数据库的打开连接,然后使用executeQuery方法调用GetContactFormalNames存储过程。

2.使用带有输入参数的存储过程
使用JDBC 驱动程序调用带参数的存储过程时,必须结合SQLServerConnection 类的prepareCall方法使用call SQL转义序列。

带有IN参数的call转义序列的语法如下所示:
构造call转义序列时,请使用?(问号)字符来指定IN参数。

此字符充当要传递给该存储过程的参数值的占位符。

可以使用SQLServerPreparedStatement类的setter方法之一为参数指定值。

可使用的setter方法由IN参数的数据类型决定。

向setter方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。

例如,如果存储过程包含单个IN参数,则其序数值为1。

如果存储过程包含两个参数,则第一个序数值为1,第二个序数值为2。

作为调用包含IN参数的存储过程的实例,使用SQL Server 2005 AdventureWorks示例数据库中的uspGetEmployeeManagers存储过程。

此存储过程接受名为EmployeeID的单个输入参数(它是一个整数值),然后基于指定的EmployeeID返回雇员及其经理的递归列表。

下面是调用此存储过程的Java代码:
3.使用带有输出参数的存储过程
使用JDBC 驱动程序调用此类存储过程时,必须结合SQLServerConnection类的prepareCall方法使用call SQL转义序列。

带有OUT参数的call转义序列的语法如下所示:
构造call转义序列时,请使用?(问号)字符来指定OUT参数。

此字符充当要从该存储过程返回的参数值的占位符。

要为OUT参数指定值,必须在运行存储过程前使用SQLServerCallableStatement类的registerOutParameter方法指定各参数的数据类型。

使用registerOutParameter方法为OUT参数指定的值必须是java.sql.Types所包含的JDBC数据类型之一,而它又被映射成本地SQL Server数据类型之一。

当您对于OUT参数向registerOutParameter方法传递一个值时,不仅必须指定要用于此参数的数据类型,而且必须在存储过程中指定此参数的序号位置或此参数的名称。

例如,如果存储过程包含单个OUT参数,则其序数值为1;如果存储过程包含两个参数,则第一个序数值为1,第二个序数值为2。

作为实例,在SQL Server 2005 AdventureWorks示例数据库中创建以下存储过程:根据指定的整数IN参数(employeeID),该存储过程也返回单个整数OUT参数(managerID)。

根据HumanResources.Employee表中包含的EmployeeID,OUT参数中返回的值为ManagerID。

在下面的实例中,将向函数传递AdventureWorks 示例数据库的打开连接,然后使用
execute方法调用GetImmediateManager存储过程:
本示例使用序号位置来标识参数。

或者,也可以使用参数的名称(而非其序号位置)来标识此参数。

下面的代码示例修改了上一个示例,以说明如何在Java应用程序中使用命名参数。

请注意,这些参数名称对应于存储过程的定义中的参数名称:
存储过程可能返回更新计数和多个结果集。

Microsoft SQL Server 2005 JDBC Driver遵循JDBC 3.0规范,此规范规定在检索OUT参数之前应检索多个结果集和更新计数。

也就是说,应用程序应先检索所有ResultSet对象和更新计数,然后使用CallableStatement.getter 方法检索OUT参数。

否则,当检索OUT参数时,尚未检索的ResultSet对象和更新计数将丢失。

4.使用带有返回状态的存储过程
使用JDBC 驱动程序调用这种存储过程时,必须结合SQLServerConnection类的prepareCall方法使用call SQL转义序列。

返回状态参数的call转义序列的语法如下所示:
构造call转义序列时,请使用?(问号)字符来指定返回状态参数。

此字符充当要从该存储过程返回的参数值的占位符。

要为返回状态参数指定值,必须在执行存储过程前使用SQLServerCallableStatement类的registerOutParameter方法指定参数的数据类型。

此外,向registerOutParameter方法传递返回状态参数值时,不仅需要指定要使用的参数的数据类型,还必须指定参数在存储过程中的序数位置。

对于返回状态参数,其序数位置始终为1,这是因为它始终是调用存储过程时的第一个参数。

尽管SQLServerCallableStatement类支持使用参数的名称来指示特定参数,但您只能对返回状态参数使用参数的序号位置编号。

作为实例,在SQL Server 2005 AdventureWorks示例数据库中创建以下存储过程:
该存储过程返回状态值1或0,这取决于是否能在表Person.Address中找到cityName 参数指定的城市。

在下面的实例中,将向此函数传递AdventureWorks示例数据库的打开连接,然后使用execute方法调用CheckContactCity存储过程:
5.使用带有更新计数的存储过程
使用SQLServerCallableStatement类构建对存储过程的调用之后,可以使用execute 或executeUpdate方法中的任意一个来调用此存储过程。

executeUpdate方法将返回一个int 值,该值包含受此存储过程影响的行数,但execute方法不返回此值。

如果使用execute方法,并且希望获得受影响的行数计数,则可以在运行存储过程后调用getUpdateCount方法。

作为实例,在SQL Server 2005 AdventureWorks示例数据库中创建以下表和存储过程:
在下面的实例中,将向此函数传递AdventureWorks示例数据库的打开连接,并使用execute方法调用UpdateTestTable存储过程,然后使用getUpdateCount方法返回受存储过程影响的行计数。

JAVA调用
ORACLE存储过程、函数的返回结果集
1.准备
用SYSTEM或者SYS用户登陆到oralce中,建立ZZH_TEST用户,该用户的密码为ZZH_TEST。

用ZZH_TEST用户进入到PL/SQL Develope中,以下表、存储过程、函数均建立在ZZH_TEST用户中。

2.建立一张测试表
建立表:
向表插入数据:
3.建立一个返回游标
4.创建一个测试用的存储过程
5.创建一个测试用的函数
6.JAVA调用存储过程返回结果集的例子:
JDBCoracle10G_INVOKEPROCEDURE
7.JAVA调用函数返回结果集的例子:
JDBCoracle10G_INVOKEFUNCTION。

相关文档
最新文档