Java对存储过程的调用方法

本文将介绍Java怎样实现对存数过程的调用方法,作者用了几个样例进行了具体的说明,简单明了,很适合刚開始学习的人。


一、Java怎样实现对存储过程的调用:

A:不带输出參数的

  1. create procedure getsum  
  2. @n int =0<--此处为參数-->  
  3. as 
  4. declare @sum int<--定义变量-->  
  5. declare @i int 
  6. set @sum=0  
  7. set @i=0  
  8. while @i<=@n begin 
  9. set @sum=@sum+@i  
  10. set @i=@i+1  
  11. end 
  12. print 'the sum is '+ltrim(rtrim(str(@sum))) 

在SQL中运行:

exec getsum 100

在JAVA中调用:

JAVA能够调用 可是在JAVA程序却不能去显示该存储过程的结果 由于上面的存储过程的參数类型int 传递方式是in(按值)方式

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //创建存储过程的对象  
  13. CallableStatement c=conn.prepareCall("{call getsum(?)}");  
  14.  
  15. //给存储过程的參数设置值  
  16. c.setInt(1,100); //将第一个參数的值设置成100  
  17.  
  18. //运行存储过程  
  19. c.execute();  
  20. conn.close();  
  21. }  
  22. }  
  23.  

B:带输出參数的

1:返回int

  1. alter procedure getsum  
  2. @n int =0,  
  3. @result int output 
  4. as 
  5. declare @sum int 
  6. declare @i int 
  7. set @sum=0  
  8. set @i=0  
  9. while @i<=@n begin 
  10. set @sum=@sum+@i  
  11. set @i=@i+1  
  12. end 
  13. set @result=@sum 

在查询分析器中运行:

  1. declare @myResult int 
  2. exec getsum 100,@myResult output 
  3. print @myResult 

在JAVA中调用:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //创建存储过程的对象  
  13. CallableStatement c=conn.prepareCall("{call getsum(?,?)}");  
  14.  
  15. //给存储过程的第一个參数设置值  
  16. c.setInt(1,100);  
  17.  
  18. //注冊存储过程的第二个參数  
  19. c.registerOutParameter(2,java.sql.Types.INTEGER);  
  20.  
  21. //运行存储过程  
  22. c.execute();  
  23.  
  24. //得到存储过程的输出參数值  
  25. System.out.println (c.getInt(2));  
  26. conn.close();  
  27. }  
  28. }  

2:返回varchar

存储过程带游标:

在存储过程中带游标 使用游标不停的遍历orderid

  1. create procedure CursorIntoProcedure  
  2. @pname varchar(8000) output 
  3. as 
  4. --定义游标  
  5. declare cur cursor for select orderid from orders  
  6. --定义一个变量来接收游标的值  
  7. declare @v varchar(5)  
  8. --打开游标  
  9. open cur  
  10. set @pname=''--给@pname初值  
  11. --提取游标的值  
  12. fetch next from cur into @v  
  13. while @@fetch_status=0  
  14. begin 
  15.  
  16.  
  17. set @pname=@pname+';'+@v  
  18. fetch next from cur into @v  
  19. end 
  20. print @pname  
  21. --关闭游标  
  22. close cur  
  23. --销毁游标  
  24. deallocate cur 

运行存储过程:

  1. exec CursorIntoProcedure '' 

JAVA调用:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10. CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");  
  11.  
  12.  
  13. c.registerOutParameter(1,java.sql.Types.VARCHAR);  
  14.  
  15. c.execute();  
  16.  
  17. System.out.println (c.getString(1));  
  18. conn.close();  
  19. }  
  20. }  

C:删除数据的存储过程

存储过程:

  1. drop table 学生基本信息表  
  2. create table 学生基本信息表  
  3. (  
  4. StuID int primary key,  
  5. StuName varchar(10),  
  6. StuAddress varchar(20)  
  7. )  
  8. insert into 学生基本信息表 values(1,'三毛','wuhan')  
  9. insert into 学生基本信息表 values(2,'三毛','wuhan')  
  10. create table 学生成绩表  
  11. (  
  12. StuID int,  
  13. Chinese int,  
  14. PyhSics int 
  15. foreign key(StuID) references 学生基本信息表(StuID)  
  16. on delete cascade  
  17. on update cascade  
  18. )   
  19. insert into 学生成绩表 values(1,99,100)  
  20. insert into 学生成绩表 values(2,99,100

创建存储过程:

  1. create procedure delePro  
  2. @StuID int 
  3. as 
  4. delete from 学生基本信息表 where StuID=@StuID  
  5. --创建完成  
  6. exec delePro 1 --运行存储过程  
  7. --创建存储过程  
  8. create procedure selePro  
  9. as 
  10. select * from 学生基本信息表  
  11. --创建完成  
  12. exec selePro --运行存储过程 

在JAVA中调用:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //创建存储过程的对象  
  13. CallableStatement c=conn.prepareCall("{call delePro(?)}");  
  14.  
  15. c.setInt(1,1);  
  16.  
  17. c.execute();  
  18.  
  19. c=conn.prepareCall("{call selePro}");  
  20. ResultSet rs=c.executeQuery();  
  21.  
  22. while(rs.next())  
  23. {  
  24. String Stu=rs.getString("StuID");  
  25. String name=rs.getString("StuName");  
  26. String add=rs.getString("StuAddress");  
  27.  
  28. System.out.println ("学号:"+" "+"姓名:"+" "+"地址");  
  29. System.out.println (Stu+" "+name+" "+add);  
  30. }  
  31. c.close();  
  32. }  

D:改动数据的存储过程

创建存储过程:

  1. create procedure ModPro  
  2. @StuID int,  
  3. @StuName varchar(10)  
  4. as 
  5. update 学生基本信息表 set StuName=@StuName where StuID=@StuID 

运行存储过程:

  1. exec ModPro 2,'四毛' 

JAVA调用存储过程:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //创建存储过程的对象  
  13. CallableStatement c=conn.prepareCall("{call ModPro(?,?)}");  
  14.  
  15. c.setInt(1,2);  
  16. c.setString(2,"美女");  
  17.  
  18. c.execute();  
  19.  
  20. c=conn.prepareCall("{call selePro}");  
  21. ResultSet rs=c.executeQuery();  
  22.  
  23. while(rs.next())  
  24. {  
  25. String Stu=rs.getString("StuID");  
  26. String name=rs.getString("StuName");  
  27. String add=rs.getString("StuAddress");  
  28.  
  29. System.out.println ("学号:"+" "+"姓名:"+" "+"地址");  
  30. System.out.println (Stu+" "+name+" "+add);  
  31. }  
  32. c.close();  
  33. }  

E:查询数据的存储过程(模糊查询)

存储过程:

  1. create procedure FindCusts  
  2. @cust varchar(10)  
  3. as 
  4. select customerid from orders where customerid   
  5. like '%'+@cust+'%' 

运行:

  1. execute FindCusts 'alfki' 

在JAVA中调用:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //创建存储过程的对象  
  13. CallableStatement c=conn.prepareCall("{call FindCusts(?)}");  
  14. c.setString(1,"Tom");  
  15.  
  16. ResultSet rs=c.executeQuery();  
  17.  
  18. while(rs.next())  
  19. {  
  20. String cust=rs.getString("customerid");   
  21. System.out.println (cust);  
  22. }  
  23. c.close();  
  24. }  

F:添加数据的存储过程

存储过程:

  1. create procedure InsertPro  
  2. @StuID int,  
  3. @StuName varchar(10),  
  4. @StuAddress varchar(20)  
  5. as 
  6. insert into 学生基本信息表 values(@StuID,@StuName,@StuAddress) 

调用存储过程:

  1. exec InsertPro 5,'555','555' 

在JAVA中运行:

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. //创建存储过程的对象  
  13. CallableStatement c=conn.prepareCall("{call InsertPro(?,?,?)}");  
  14. c.setInt(1,6);  
  15. c.setString(2,"Liu");  
  16. c.setString(3,"wuhan");  
  17.  
  18. c.execute();  
  19.  
  20. c=conn.prepareCall("{call selePro}");  
  21. ResultSet rs=c.executeQuery();  
  22.  
  23. while(rs.next())  
  24. {  
  25. String stuid=rs.getString("StuID");   
  26. String name=rs.getString("StuName");   
  27. String address=rs.getString("StuAddress");   
  28. System.out.println (stuid+" "+name+" "+address);  
  29. }  
  30. c.close();  
  31. }  

G:在JAVA中创建存储过程 而且在JAVA中直接调用

  1. import java.sql.*;  
  2. public class ProcedureTest   
  3. {  
  4. public static void main(String args[]) throws Exception  
  5. {  
  6. //载入驱动  
  7. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());  
  8. //获得连接  
  9. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");  
  10.  
  11.  
  12. Statement stmt=conn.createStatement();  
  13. //在JAVA中创建存储过程  
  14. stmt.executeUpdate("create procedure OOP as select * from 学生成绩表");  
  15.  
  16.  
  17. CallableStatement c=conn.prepareCall("{call OOP}");  
  18.  
  19. ResultSet rs=c.executeQuery();  
  20. while(rs.next())  
  21. {  
  22. String chinese=rs.getString("Chinese");  
  23.  
  24. System.out.println (chinese);  
  25. }  
  26. conn.close();  
  27.  
  28. }  
  29. }  

转载于:https://www.cnblogs.com/mfrbuaa/p/4069690.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis-plus 代码生成器

生成entity -> mapper-> service ->controller所有的接口&#xff0c;实现&#xff0c;一键完成。 1. 轮子 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>…

电脑报错找不到msvcr100.dll,无法继续执行代码如何修复

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是MSVCR100.dll丢失。那么&#xff0c;MSVCR100.dll到底是什么&#xff1f;它的作用是什么&#xff1f;为什么会丢失呢&#xff1f;本文将详细介绍MSVCR100.dll的定义、作用以及丢失的原因&#…

windows下面虚拟主机

1. wondows xp apmserv 5.2.6 端口8088 2.httpd.config文件 1. ServerRoot      "D:/APMServ/APMServ5.2.6/Apache" Listen        8088 ServerName     127.0.0.1:8088 DocumentRoot   "D:/APMServ/APMServ5.2.6/www/" (原文未变)…

QueryWrapper查询

QueryWrapper, mybatisplus 中封装了大量的查询方法。用于高级查询。传入表的列和查询的值&#xff0c;就能反射对应的sql. 简化了查询。 更多api&#xff0c;查询使用&#xff0c;看&#xff1a; https://baomidou.com/guide/wrapper.html package cn.bitqian;import cn.bit…

Smooks转换设计

Smooks转换设计 背景 不同的合作银行对应的外部接口是不一样的,我们需要把外部这些变化不定的接口格式,转换为我们银保通系统可以识别的内部接口.Smooks可以很好的解决这一问题.并且,当合作银行的接口随着业务的变化而发生变化时,smooks只需要通过变更转换模板,就可以实现对变化…

mybatis一级,二级缓存。缓存带来的脏读问题

title1. 关于缓存的介绍2. 一级缓存&#xff0c;默认开启&#xff0c;session级别3. 二级缓存&#xff0c;mapper 的namespace级别1. 关于缓存的介绍 Mybatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个sqlSession中两次执行相同的sql语句&#xff0c;第一次执行完…

接口限流实践

http://www.cnblogs.com/LBSer/p/4083131.html 一、问题描述 某天A君突然发现自己的接口请求量突然涨到之前的10倍&#xff0c;没多久该接口几乎不可使用&#xff0c;并引发连锁反应导致整个系统崩溃。如何应对这种情况呢&#xff1f;生活给了我们答案&#xff1a;比如老式电…

ssm整合,使用maven分模块

linux, docker&#xff0c;redis&#xff0c;rabbit兔子&#xff0c;es… juc… 还有最近的项目&#xff0c;单线程快block了。 代码&#xff1a;整合 https://github.com/sevenyoungairye/ssm-demo/tree/master/ssm_maven 你需要&#xff1a; git clone gitgithub.com:seve…

Linux基本命令 (一)

linux is not unix … 命令使用描述pwdpwd查看当前的目录路径whowho 或者 who am i 或者 whoami查看当前用户cdcd /usr/bin 或者 cd / 或者 cd ../进入usr的bin目录下&#xff1b;进入根目录;或者进入上一个目录cdcd directorycd 相对路径或者绝对路径lsls -a 或者 ls - l 或者…

【JSP】jsp报错:Syntax error, insert } to complete MethodBody

使用MyEclipse编写JSP的时候有时会报错误如下 Syntax error, insert "}" to complete MethodBody 大体意思就是说方法体缺少缺少一个"}"&#xff0c;但是一般都找不到到底是哪里缺少了"}"&#xff0c;而且一般情况下不影响程序的正常运行&#x…

linux中的文件,文件夹,链接的权限划分

title权限代号与分组如何修改权限&#xff1a;权限代号与分组 当你敲下ll时 ll 箭头所指就表示这个文件的权限和所有者 最前面的, 以access这个文件夹为例分析。 drwxr-xr-x 分组 d rwx r-x r-x 将rwx, r-x, r-x 分为三组。 d表示是个目录。 其中rwx表示属于当前用户的权限…

思维探索者:从问题到答案的思维过程 像侦探一样思考

http://www.nowamagic.net/librarys/veda/detail/1710目前几乎所有的算法书的讲解方式都是欧几里德式的、瀑布式的、自上而下的、每一个推导步骤都是精准制导直接面向目标的。由因到果&#xff0c;定义、引理、定理、证明 一样不少&#xff0c;井井有条一丝不乱毫无赘肉。而实际…

centos7,google身份验证

为了安全&#xff0c;登录时需要google的动态验证码验证。当你输入服务器的登录密码后&#xff0c;输入动态验证码。这个验证码是google app 身份验证器根据当前时间算出来的。所有centos上的时间必须和当前时间同步。 在centos上安装google的身份验证器&#xff0c;结果会出现…