`

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

 
阅读更多

1使用不带参数的存储过程 

使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列。不带参数的 call 转义序列的语法如下所示: 
{call procedure-name}  
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: 

CREATE PROCEDURE GetContactFormalNames 
AS
BEGIN
   
SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName,FirstName
   
FROM Person.Contact
END

此存储过程返回单个结果集,其中包含一列数据(由 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"));
            System.out.println(rs.getString("FirstName"));          
      }

      rs.close();
      stmt.close();
   }

   
catch (Exception e) {
      e.printStackTrace();
   }

}
 

2使用带有输入参数的存储过程

使用 JDBC 驱动程序调用带参数的存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 IN 参数的 call 转义序列的语法如下所示: 
{call procedure-name[([parameter][,[parameter]]...)]} 

构造 call 转义序列时,请使用 ?(问号)字符来指定 IN 参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用 SQLServerPreparedStatement 类的 setter 方法之一为参数指定值。可使用的 setter 方法由 IN 参数的数据类型决定。 
向 setter 方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果存储过程包含单个 IN 参数,则其序数值为 1。如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。 
作为如何调用包含 IN 参数的存储过程的实例,使用 SQL Server 2005 AdventureWorks 示例数据库中的 uspGetEmployeeManagers 存储过程。此存储过程接受名为 EmployeeID 的单个输入参数(它是一个整数值),然后基于指定的 EmployeeID 返回雇员及其经理的递归列表。下面是调用此存储过程的 Java 代码:

 
public static void executeSprocInParams(Connection con) {
   
try {
      PreparedStatement pstmt 
= con.prepareStatement("{call dbo.uspGetEmployeeManagers(?)}");
      pstmt.setInt(
150);
      ResultSet rs 
= pstmt.executeQuery();
      
while (rs.next()) {
         System.out.println(
"EMPLOYEE:");
         System.out.println(rs.getString(
"LastName"+ "" + rs.getString("FirstName"));
         System.out.println(
"MANAGER:");
         System.out.println(rs.getString(
"ManagerLastName"+ "" + rs.getString("ManagerFirstName"));
         System.out.println();
      }

      rs.close();
      pstmt.close();
   }

   
catch (Exception e) {
      e.printStackTrace();
    }

}
 

 3使用带有输出参数的存储过程

    使用 JDBC 驱动程序调用此类存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 OUT 参数的 call 转义序列的语法如下所示: 
{call procedure-name[([parameter][,[parameter]]...)]}  

    构造 call 转义序列时,请使用 ?(问号)字符来指定 OUT 参数。此字符充当要从该存储过程返回的参数值的占位符。要为 OUT 参数指定值,必须在运行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定各参数的数据类型。

    使用 registerOutParameter 方法为 OUT 参数指定的值必须是 java.sql.Types 所包含的 JDBC 数据类型之一,而它又被映射成本地 SQL Server 数据类型之一。有关 JDBC 和 SQL Server 数据类型的详细信息,请参阅了解 JDBC 驱动程序数据类型 

    当您对于 OUT 参数向 registerOutParameter 方法传递一个值时,不仅必须指定要用于此参数的数据类型,而且必须在存储过程中指定此参数的序号位置或此参数的名称。例如,如果存储过程包含单个 OUT 参数,则其序数值为 1;如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。 
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:
    根据指定的整数 IN 参数 (employeeID),该存储过程也返回单个整数 OUT 参数 (managerID)。根据 HumanResources.Employee 表中包含的 EmployeeID,OUT 参数中返回的值为 ManagerID。 


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

public static void executeStoredProcedure(Connection con) {
   
try {
      CallableStatement cstmt 
= con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
      cstmt.setInt(
15);
      cstmt.registerOutParameter(
2, java.sql.Types.INTEGER);
      cstmt.execute();
      System.out.println(
"MANAGER ID: " + cstmt.getInt(2));
   }

   
catch (Exception e) {
      e.printStackTrace();
   }

}

    本示例使用序号位置来标识参数。或者,也可以使用参数的名称(而非其序号位置)来标识此参数。下面的代码示例修改了上一个示例,以说明如何在 Java 应用程序中使用命名参数。请注意,这些参数名称对应于存储过程的定义中的参数名称:

CREATE PROCEDURE GetImmediateManager
   
@employeeID INT,
   
@managerID INT OUTPUT
AS
BEGIN
   
SELECT @managerID = ManagerID 
   
FROM HumanResources.Employee 
   
WHERE EmployeeID = @employeeID
END

    存储过程可能返回更新计数和多个结果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 规范,此规范规定在检索 OUT 参数之前应检索多个结果集和更新计数。也就是说,应用程序应先检索所有 ResultSet 对象和更新计数,然后使用 CallableStatement.getter 方法检索 OUT 参数。否则,当检索 OUT 参数时,尚未检索的 ResultSet 对象和更新计数将丢失。

 

4 使用带有返回状态的存储过程

    使用 JDBC 驱动程序调用这种存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。返回状态参数的 call 转义序列的语法如下所示: 
{[?=]call procedure-name[([parameter][,[parameter]]...)]}  

    构造 call 转义序列时,请使用 ?(问号)字符来指定返回状态参数。此字符充当要从该存储过程返回的参数值的占位符。要为返回状态参数指定值,必须在执行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定参数的数据类型。

    此外,向 registerOutParameter 方法传递返回状态参数值时,不仅需要指定要使用的参数的数据类型,还必须指定参数在存储过程中的序数位置。对于返回状态参数,其序数位置始终为 1,这是因为它始终是调用存储过程时的第一个参数。尽管 SQLServerCallableStatement 类支持使用参数的名称来指示特定参数,但您只能对返回状态参数使用参数的序号位置编号。 
    作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: 

CREATE PROCEDURE CheckContactCity
   (
@cityName CHAR(50))
AS
BEGIN
   
IF ((SELECT COUNT(*)
   
FROM Person.Address
   
WHERE City = @cityName> 1)
   
RETURN 1
ELSE
   
RETURN 0
END

    该存储过程返回状态值 1 或 0,这取决于是否能在表 Person.Address 中找到 cityName 参数指定的城市。


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

public static void executeStoredProcedure(Connection con) {
   
try {
      CallableStatement cstmt 
= con.prepareCall("{? = call dbo.CheckContactCity(?)}");
      cstmt.registerOutParameter(
1, java.sql.Types.INTEGER);
      cstmt.setString(
2"Atlanta");
      cstmt.execute();
      System.out.println(
"RETURN STATUS: " + cstmt.getInt(1));
   }

   cstmt.close();
   
catch (Exception e) {
      e.printStackTrace();
   }

}
 

5 使用带有更新计数的存储过程

    使用 SQLServerCallableStatement 类构建对存储过程的调用之后,可以使用 execute 或 executeUpdate 方法中的任意一个来调用此存储过程。executeUpdate 方法将返回一个 int 值,该值包含受此存储过程影响的行数,但 execute 方法不返回此值。如果使用 execute 方法,并且希望获得受影响的行数计数,则可以在运行存储过程后调用 getUpdateCount 方法。

    作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下表和存储过程:

CREATE TABLE TestTable 
   (Col1 
int IDENTITY
    Col2 
varchar(50), 
    Col3 
int);

CREATE PROCEDURE UpdateTestTable
   
@Col2 varchar(50),
   
@Col3 int
AS
BEGIN
   
UPDATE TestTable
   
SET Col2 = @Col2, Col3 = @Col3
END;

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

public static void executeUpdateStoredProcedure(Connection con) {
   
try {
      CallableStatement cstmt 
= con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
      cstmt.setString(
1"A");
      cstmt.setInt(
2100);
      cstmt.execute();
      
int count = cstmt.getUpdateCount();
      cstmt.close();

      System.out.println(
"ROWS AFFECTED: " + count);
   }

   
catch (Exception e) {
      e.printStackTrace();
   }

}

 

分享到:
评论

相关推荐

    2024-2030全球及中国控制膨胀合金箔行业研究及十五五规划分析报告.docx

    2024-2030全球及中国控制膨胀合金箔行业研究及十五五规划分析报告

    通信历年真题选择题汇总1.(DOC).doc

    通信历年真题选择题汇总1.(DOC).doc

    电子通信设计资料电子万年历设计与制作论文资料

    电子通信设计资料电子万年历设计与制作论文资料提取方式是百度网盘分享地址

    JSP-SSM健身俱乐部客户关系管理系统可升级SpringBoot源码.7z

    前台框架基于Bootstrap这一HTML5响应式框架,能够自适应不同终端设备的屏幕大小,为用户提供良好的浏览体验。开发环境兼容myEclipse、Eclipse、Idea等多种工具,配合mysql数据库,实现数据的存储与管理。后台则采用SSM(SpringMVC + Spring + Mybatis)框架,保证系统的稳定与高效运行。 系统主要包括会员信息管理、员工信息管理、设备信息管理以及退出模块。会员信息管理模块详细记录了会员的基本信息、健身目标、消费记录以及健身习惯等,同时设有会员投诉管理模块,用于收集和处理会员的意见与建议。员工信息管理模块则涵盖了员工的基本信息、工资发放情况等,帮助俱乐部进行人事管理。设备信息管理模块则负责建立器械档案,跟踪维修情况,并合理安排器械摆放位置,以延长器械使用寿命。 数据库设计方面,会员表记录了会员的各项基本信息,包括姓名、性别、职业等;部门表与员工表则分别用于记录俱乐部的组织机构和员工信息;会员消费表记录了会员的消费详情;员工工资表则用于记录员工的工资发放情况;留言表用于收集会员的留言及回复;设备类别表与设备表则详细记录了会所内器械的分类与具

    2024-2030全球及中国超级殷钢 32-5行业研究及十五五规划分析报告.docx

    2024-2030全球及中国超级殷钢 32-5行业研究及十五五规划分析报告

    2023年贴剂行业竞争格局与市场机会.pptx

    行业分析报告

    linux nginx免安装文件

    linux环境不能上网,用这个文件可以实现nginx免安装

    按点击量排序-基于内容的课程推荐网站的设计与实现(SSM+html).zip

    “按点击量排序-基于内容的课程推荐网站的设计与实现(SSM+html)”是一个基于内容推荐概念的在线学习平台,旨在为用户提供个性化的课程推荐体验。系统的核心功能包括用户注册登录、课程浏览搜索、个性化推荐和热门课程按点击量排序展示。在技术架构方面,该系统采用SSM框架作为后端开发技术,包括Spring、Spring MVC和MyBatis,用于处理业务逻辑和数据持久化。前端界面则采用HTML设计实现,展示课程信息和用户交互界面。这样的技术选择不仅提供了稳定的后端支持,还保证了良好的前端用户体验。通过SSM框架以及HTML的结合,该课程推荐网站在功能性和性能方面表现优异。SSM框架提供了高效的业务处理和数据交互,HTML则赋予网站美观友好的用户界面,使用户能够轻松使用课程推荐功能。热门课程的点击量排序功能提高了用户浏览体验,使用户更快速地找到感兴趣的课程,从而提升整体用户满意度和学习效率。

    OSP项目施工组织方案.docx

    行业分析报告

    小型婚礼(可动态添加祝福语)程序文件jquery

    1:场景一主要有两个功能,第一个是控制左边图片,第二个是让右边文字逐一显示。 2:场景二功能简单一点,只控制左边人物出现,紧接着是文字显示。 3:场景三功能控制图片弹跳显示,我用for循环控制弹跳距离。 4:场景四控制图片从顶部往下滑落,停留1秒然后滑向右侧直至消失。 5:场景五慢慢显现,可点击进入婚礼。 6:场景六显现停留1.6秒,然后以碎片的形式向外散开。 7:场景七祝福贴纸随机排布,并且可拖动祝福贴纸。 8:添加祝福语中,需填写祝福语,否则不让提交。可提交的祝福语便随机散布在祝福墙中,可实现随意拖动功能,

    AI相关领域论文+英文中文+论文攻读

    AI论文体系建设是指建立一个完善的AI领域的论文研究框架和体系,以促进学术交流和知识积累。这一体系包括但不限于以下几个方面: 1. **研究主题界定**:明确AI领域的研究主题和范围,包括机器学习、深度学习、自然语言处理、计算机视觉等方向。 2. **文献综述**:对AI领域相关研究文献进行综述和分类,总结研究现状和发展趋势,为后续研究提供参考。 3. **研究方法论**:探讨AI研究的方法论,包括实验设计、数据采集、模型构建等方面的方法和技巧。 4. **实验验证**:强调实验验证在AI研究中的重要性,提倡开放数据和代码,以促进研究结果的可复现性和可验证性。 5. **学术交流**:倡导学术交流和合作,包括参加学术会议、发表论文、组织研讨会等方式,促进学术成果的传播和交流。 6. **学术评价**:建立科学的学术评价体系,包括SCI、EI等学术期刊和会议的评价标准,以及学术成果的评价指标和方法。 通过建设完善的AI论文体系,可以促进AI领域的学术研究和技术创新,推动人工智能技术的发展和应用。

    2024年硬件嵌入式系统咨询行业分析报告.pptx

    行业分析报告

    智慧医院大健康全院信息化建设解决方案.pptx

    围绕着医疗安全与医疗机构管理精细化目标,借鉴HIMSS评级标准、JCI评审、等级医院评审标准规范,基于统一的技术平台架构下的医教研人财物六位一体的信息化管理解决方案,实现医疗卫生机构医务、护理、人力资源、科研、教学、医患关系、设备与物资供应链等日常管理运营信息化。 利用移动互联网技术构建专业的分享服务平台,以为会员提供相关知识、专家在线服务、法律咨询服务,并为医生、医疗机构和健康管理会所提供宣传服务等众多增值服务。 4 大目标: 高效诊疗、智慧医疗、精细管理、信息便民; 1 卡通: 一张诊疗卡。 1 个平台: 一个医院信息集成平台; 6 大应用: 医疗管理、临床信息、运营管理、移动物联、医疗协作、对外服务。

    基于PHP的轻量级MVC框架设计源码

    本项目是基于PHP的轻量级MVC框架设计源码,包含56个文件,其中主要包含50个php源代码文件。系统采用了PHP编程语言,实现了基于PHP7+的轻量级MVC框架。该框架适用于博客系统、新闻管理系统、企业官网和Api系统等多种应用场景,是这些系统的最佳选择。项目结构清晰,代码可读性强,易于理解和维护。

    飞行器机动飞行质点弹道仿真-侧向和纵向-龙格库塔/欧拉法

    本Matlab程序的主要功能是实现飞行器的侧向和纵向的机动,通过设计横向和纵向的控制指令实现。系统状态(微分方程)的解算提供了两种方式,龙格库塔法和欧拉法。 主程序main_cexiang:实现飞行器的侧向机动; 主程序main_zongxiang:实现飞行器的纵向机动。

    基于ssm+vue学生学籍管理系统源码数据库文档.zip

    基于ssm+vue学生学籍管理系统源码数据库文档.zip

    mybatis-plus-generator-3.5.3.jar

    mybatis-plus-generato.jar 包,各个版本,免费下载。 mybatis-plus 代码生成器生成代码框架。各个版本,免费下载。 下载不了,关注我,评论区联系我。

    java-springboot+vue“智慧食堂”设计与实现源码(源代码+说明文档资料)

    springboot+vue“智慧食堂”设计与实现 系统主要包括首页,个人中心,用户管理,菜品分类管理,菜品信息管理,留言板管理,系统管理,订单管理等功能。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    基于ssm+vue孩童收养信息管理系统源码数据库文档.zip

    基于ssm+vue孩童收养信息管理系统源码数据库文档.zip

    概率论与潮流统计学在时尚产业的应用(文档加Matlab源码)

    本文深入探讨了概率论在时尚产业中的应用,分析了如何利用统计学原理来预测和引导时尚潮流。内容涵盖了数据收集、市场趋势分析、消费者行为研究以及如何通过概率模型来优化设计和营销策略。文章适合时尚产业的设计师、市场分析师、品牌经理以及对时尚趋势感兴趣的学者和学生。无论是在设计新款服饰、制定市场推广计划,还是在学术研究中,本文都能提供有价值的见解和方法。 关键词 时尚产业

Global site tag (gtag.js) - Google Analytics