Java代码中执行存储过程和函数

电玩女神 2023-10-17 22:56 116阅读 0赞

一:先看几个概念

首先,自己参考了几篇文章,写的很不错,自己也借鉴一下,然后会在最后贴出自己在项目中使用到的存储过程,已经实现过程,大家可以做个对比,实现方法不同。http://www.cnblogs.com/liunanjava/p/4261242.html

过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快。不同之处是函数必须指定返回类型。

Java调用结构:

存储过程:{call [(,, …)]}
函数:{?= call [(,, …)]}

如果要调用存储过程,则使用第一种语法,就是开头不带问号的语法,call 后面是过程名,
如果没有参数,可以省略小括号。
如果要调用函数,则使用第二种语法,开头带有一个问号加等号,实际上这个问号就是一个占位符,这个问号总是调用函数的第一个占位符。其它部分与过程的语法相同。

二、CallableStatement 执行存储过程

2.1、建立基类

[java] view plain copy

print ?

  1. package com.pb.emp.dao;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import com.pb.emp.untily.ConfigManager;
  8. public class BaseDao {
  9. protected Connection conn;
  10. protected PreparedStatement ps;
  11. protected ResultSet rs;
  12. //建立连接
  13. public boolean getConnection(){
  14. String driver=ConfigManager.getInstance().getString(”jdbc.driver_class”);
  15. String url=ConfigManager.getInstance().getString(”jdbc.connection.url”);
  16. String username=ConfigManager.getInstance().getString(”jdbc.connection.username”);
  17. String password=ConfigManager.getInstance().getString(”jdbc.connection.password”);
  18. try {
  19. Class.forName(driver);
  20. conn=DriverManager.getConnection(url,username, password);
  21. } catch (ClassNotFoundException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. return false;
  25. } catch (SQLException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. return false;
  29. }
  30. return true;
  31. }
  32. //增加,修改,删除
  33. public int executeUpdate(String sql, Object[] params){
  34. getConnection();
  35. int updateRow=0;
  36. try {
  37. ps=conn.prepareStatement(sql);
  38. //填充占位符
  39. for(int i=0;i<params.length;i++){
  40. ps.setObject(i+1, params[i]);
  41. }
  42. updateRow = ps.executeUpdate();
  43. } catch (SQLException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. return updateRow;
  48. }
  49. //
  50. //查询
  51. public ResultSet executeSQL(String sql, Object[] params){
  52. getConnection();
  53. try {
  54. ps=conn.prepareStatement(sql);
  55. //填充占位符
  56. for(int i=0;i<params.length;i++){
  57. ps.setObject(i+1, params[i]);
  58. }
  59. rs = ps.executeQuery();
  60. } catch (SQLException e) {
  61. // TODO Auto-generated catch block
  62. e.printStackTrace();
  63. }
  64. return rs;
  65. }
  66. // 关闭资源
  67. public boolean closeResource() {
  68. if(rs!=null){
  69. try {
  70. rs.close();
  71. } catch (SQLException e) {
  72. // TODO Auto-generated catch block
  73. e.printStackTrace();
  74. return false;
  75. }
  76. }
  77. if(ps!=null){
  78. try {
  79. ps.close();
  80. } catch (SQLException e) {
  81. // TODO Auto-generated catch block
  82. e.printStackTrace();
  83. return false;
  84. }
  85. }
  86. if(conn!=null){
  87. try {
  88. conn.close();
  89. } catch (SQLException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. return false;
  93. }
  94. }
  95. return true;
  96. }
  97. }

package com.pb.emp.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.pb.emp.untily.ConfigManager; public class BaseDao { protected Connection conn; protected PreparedStatement ps; protected ResultSet rs; //建立连接 public boolean getConnection(){ String driver=ConfigManager.getInstance().getString(“jdbc.driver_class”); String url=ConfigManager.getInstance().getString(“jdbc.connection.url”); String username=ConfigManager.getInstance().getString(“jdbc.connection.username”); String password=ConfigManager.getInstance().getString(“jdbc.connection.password”); try { Class.forName(driver); conn=DriverManager.getConnection(url,username, password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } return true; } //增加,修改,删除 public int executeUpdate(String sql, Object[] params){ getConnection(); int updateRow=0; try { ps=conn.prepareStatement(sql); //填充占位符 for(int i=0;i<params.length;i++){ ps.setObject(i+1, params[i]); } updateRow = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return updateRow; } // //查询 public ResultSet executeSQL(String sql, Object[] params){ getConnection(); try { ps=conn.prepareStatement(sql); //填充占位符 for(int i=0;i<params.length;i++){ ps.setObject(i+1, params[i]); } rs = ps.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } // 关闭资源 public boolean closeResource() { if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } return true; } }

2.2、执行不带参但是有返回值的存储过程

下面建立存储过程

[sql] view plain copy

print ?

  1. –查询emp表记录数
  2. CREATE OR REPLACE PROCEDURE getEmpCount(v_count OUT NUMBER)
  3. AS
  4. BEGIN
  5. SELECT COUNT(*) INTO v_count FROM emp;
  6. END;

–查询emp表记录数 CREATE OR REPLACE PROCEDURE getEmpCount(v_count OUT NUMBER) AS BEGIN SELECT COUNT(*) INTO v_count FROM emp; END;

调用

[java] view plain copy

print ?

  1. //执行不带参但是有返回值的存储过程获取emp表总记录数
  2. public int getTotalCountProc(){
  3. //定义一个变量来接收结果
  4. int totalCount=0;
  5. //声明CallableStatement对象
  6. CallableStatement proc=null;
  7. String sql=”{call getEmpCount(?)}”;
  8. try {
  9. //建立连接
  10. getConnection();
  11. //CallableStatement对象
  12. proc=conn.prepareCall(sql);
  13. //将数据库对象数据类型注册为java中的类型
  14. proc.registerOutParameter(1, Types.INTEGER);
  15. //执行
  16. proc.execute();
  17. //接收返回值
  18. totalCount=proc.getInt(1);
  19. } catch (SQLException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. return totalCount;
  24. }

//执行不带参但是有返回值的存储过程获取emp表总记录数 public int getTotalCountProc(){ //定义一个变量来接收结果 int totalCount=0; //声明CallableStatement对象 CallableStatement proc=null; String sql=”{call getEmpCount(?)}”; try { //建立连接 getConnection(); //CallableStatement对象 proc=conn.prepareCall(sql); //将数据库对象数据类型注册为java中的类型 proc.registerOutParameter(1, Types.INTEGER); //执行 proc.execute(); //接收返回值 totalCount=proc.getInt(1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return totalCount; }

2.3、执行带参带返回值的存储过程

[sql] view plain copy

print ?

  1. –根据部门编号和姓名查询人数
  2. CREATE OR REPLACE PROCEDURE getEmpCount(v_deptno NUMBER, v_ename VARCHAR2,v_count OUT NUMBER)
  3. AS
  4. BEGIN
  5. SELECT COUNT(*) INTO v_count FROM emp
  6. WHERE ename LIKE ‘%’||v_ename||‘%’ AND deptno=v_deptno;
  7. END;

–根据部门编号和姓名查询人数 CREATE OR REPLACE PROCEDURE getEmpCount(v_deptno NUMBER, v_ename VARCHAR2,v_count OUT NUMBER) AS BEGIN SELECT COUNT(*) INTO v_count FROM emp WHERE ename LIKE ‘%’||v_ename||’%’ AND deptno=v_deptno; END;

[java] view plain copy

print ?

  1. //执行带参带返回值的存储过程
  2. public int getTotalCountProc1(int deptno,String ename){
  3. //定义一个变量来接收结果
  4. int totalCount=0;
  5. //声明CallableStatement对象
  6. CallableStatement proc=null;
  7. String sql=”{call getEmpCount(?,?,?)}”;
  8. //建立连接
  9. getConnection();
  10. //CallableStatement对象
  11. try {
  12. proc=conn.prepareCall(sql);
  13. //设置占位符
  14. //Object [] params={deptno,ename};
  15. //只设置输入参数即可
  16. proc.setInt(1, deptno);
  17. proc.setString(2, ename);
  18. //proc.setInt(3, totalCount);
  19. 将数据库对象数据类型注册为java中的类型,将输出参数转换
  20. proc.registerOutParameter(3, Types.INTEGER);
  21. //执行
  22. proc.execute();
  23. //获取结果
  24. totalCount=proc.getInt(3);
  25. } catch (SQLException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }finally{
  29. this.closeResource();
  30. if(proc!=null){
  31. try {
  32. proc.close();
  33. } catch (SQLException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. return totalCount;
  40. }

//执行带参带返回值的存储过程 public int getTotalCountProc1(int deptno,String ename){ //定义一个变量来接收结果 int totalCount=0; //声明CallableStatement对象 CallableStatement proc=null; String sql=”{call getEmpCount(?,?,?)}”; //建立连接 getConnection(); //CallableStatement对象 try { proc=conn.prepareCall(sql); //设置占位符 //Object [] params={deptno,ename}; //只设置输入参数即可 proc.setInt(1, deptno); proc.setString(2, ename); //proc.setInt(3, totalCount); 将数据库对象数据类型注册为java中的类型,将输出参数转换 proc.registerOutParameter(3, Types.INTEGER); //执行 proc.execute(); //获取结果 totalCount=proc.getInt(3); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ this.closeResource(); if(proc!=null){ try { proc.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return totalCount; }

2.4、执行返回值为游标的存储过程

[sql] view plain copy

print ?

  1. –查询员工所有信息
  2. CREATE OR REPLACE PROCEDURE emp_cur(emp_cur OUT SYS_REFCURSOR)
  3. AS
  4. BEGIN
  5. OPEN emp_cur FOR SELECT * FROM emp;
  6. END;

–查询员工所有信息 CREATE OR REPLACE PROCEDURE emp_cur(emp_cur OUT SYS_REFCURSOR) AS BEGIN OPEN emp_cur FOR SELECT * FROM emp; END;

[java] view plain copy

print ?

  1. //执行返回值为游标的存储过程 游标名emp_cur
  2. public List getempProc1(){
  3. List emplist=new ArrayList();
  4. String sql=”{call emp_cur(?) }”;
  5. //声明CallableStatement对象
  6. CallableStatement proc=null;
  7. //建立连接
  8. getConnection();
  9. try {
  10. //执行
  11. proc=conn.prepareCall(sql);
  12. //注册类型为数据库游标类型
  13. proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
  14. //接收结果集
  15. proc.execute();
  16. //获取结果第一个对象
  17. rs=(ResultSet) proc.getObject(1);
  18. while(rs.next()){
  19. int empno=rs.getInt(“empno”);
  20. String ename=rs.getString(”ename”);
  21. String job=rs.getString(”job”);
  22. int mgr=rs.getInt(“mgr”);
  23. Date hiredate=rs.getDate(”hiredate”);
  24. double sal=rs.getDouble(“sal”);
  25. double comm=rs.getDouble(“comm”);
  26. int deptno=rs.getInt(“deptno”);
  27. //声明Emp对象
  28. Emp emp=new Emp();
  29. //将得到的值添加到对象中
  30. emp.setEmpno(empno);
  31. emp.setEname(ename);
  32. emp.setJob(job);
  33. emp.setMgr(mgr);
  34. emp.setHiredate(hiredate);
  35. emp.setSal(sal);
  36. emp.setComm(comm);
  37. emp.setDeptno(deptno);
  38. //将对象添加到集合
  39. emplist.add(emp);
  40. }
  41. } catch (SQLException e) {
  42. // TODO Auto-generated catch block
  43. e.printStackTrace();
  44. }finally{
  45. this.closeResource();
  46. if(proc!=null){
  47. try {
  48. proc.close();
  49. } catch (SQLException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. return emplist;
  56. }

//执行返回值为游标的存储过程 游标名emp_cur public List getempProc1(){ List emplist=new ArrayList(); String sql=”{call emp_cur(?) }”; //声明CallableStatement对象 CallableStatement proc=null; //建立连接 getConnection(); try { //执行 proc=conn.prepareCall(sql); //注册类型为数据库游标类型 proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //接收结果集 proc.execute(); //获取结果第一个对象 rs=(ResultSet) proc.getObject(1); while(rs.next()){ int empno=rs.getInt(“empno”); String ename=rs.getString(“ename”); String job=rs.getString(“job”); int mgr=rs.getInt(“mgr”); Date hiredate=rs.getDate(“hiredate”); double sal=rs.getDouble(“sal”); double comm=rs.getDouble(“comm”); int deptno=rs.getInt(“deptno”); //声明Emp对象 Emp emp=new Emp(); //将得到的值添加到对象中 emp.setEmpno(empno); emp.setEname(ename); emp.setJob(job); emp.setMgr(mgr); emp.setHiredate(hiredate); emp.setSal(sal); emp.setComm(comm); emp.setDeptno(deptno); //将对象添加到集合 emplist.add(emp); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ this.closeResource(); if(proc!=null){ try { proc.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return emplist; }

以上看出,需要将输出的参数,和结果注册,输入的参数不要注册,

但输入参数需要设置占位符。

三、执行函数

3.1 、函数功能为根据雇员id 返回姓名

[sql] view plain copy

print ?

  1. CREATE OR REPLACE FUNCTION getename(v_empno NUMBER)
  2. RETURN VARCHAR2
  3. AS
  4. v_ename VARCHAR2(20);
  5. BEGIN
  6. SELECT ename INTO v_ename FROM emp WHERE empno=v_empno;
  7. RETURN v_ename;
  8. END;

CREATE OR REPLACE FUNCTION getename(v_empno NUMBER) RETURN VARCHAR2 AS v_ename VARCHAR2(20); BEGIN SELECT ename INTO v_ename FROM emp WHERE empno=v_empno; RETURN v_ename; END;

[java] view plain copy

print ?

  1. public void getenamefun(int empno){
  2. //sql
  3. String ename=”“;
  4. String sql=”{?=call getename(?)}”;//注意和存储过程的区别
  5. CallableStatement fun=null;
  6. getConnection();
  7. try {
  8. fun=conn.prepareCall(sql);
  9. fun.setInt(2, empno);
  10. fun.registerOutParameter(1, Types.VARCHAR);
  11. fun.execute();
  12. ename=fun.getString(1);
  13. System.out.println(ename);
  14. } catch (SQLException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. }

public void getenamefun(int empno){ //sql String ename=”“; String sql=”{?=call getename(?)}”;//注意和存储过程的区别 CallableStatement fun=null; getConnection(); try { fun=conn.prepareCall(sql); fun.setInt(2, empno); fun.registerOutParameter(1, Types.VARCHAR); fun.execute(); ename=fun.getString(1); System.out.println(ename); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
其它的方法与过程一样,只是多了个返回值类型。

——————————————————————

四:接下来说下自己项目中的,直接看代码。

创建储存过程的代码基本一样,只是Java调用存储过程的时候,跟上边调用的方法不同,大家可以自行理解:

4.1:更新订单状态,返回状态值

[sql] view plain copy

print ?

  1. DELIMITER

     ——————-先定义语句的结束符号  

  2.   
  3. USE `zhangzi_tester`  ——————-先定义语句的结束符号  
  4.   
  5. USE `zhangzi_tester`

  6. DROP PROCEDURE IF EXISTS `pay_orderState`

      

  7.   
  8. CREATE  PROCEDURE `pay_orderState`(  
  9.     IN serNumbner VARCHAR (32),  
  10.     IN itemId VARCHAR (32),  
  11.     IN captions INT,  
  12.     IN cfcaPayTime VARCHAR(32),  
  13.     IN payDate VARCHAR(30),  
  14.     OUT state VARCHAR (2))  
  15. BEGIN  
  16.     DECLARE     maxMoney INT DEFAULT 0;  
  17.   DECLARE     countMoney INT DEFAULT 0;  
  18.   DECLARE     caps INT DEFAULT 0;  
  19. START TRANSACTION;— 配置事务  
  20. SELECT  IFNULL(max_finance_money,0) INTO maxMoney FROM  t_item_info WHERE   id = itemId;  
  21. SELECT  IFNULL(SUM(capital),0) INTO countMoney FROM     t_order_info WHERE fk_item_id = itemId AND pay_status = ‘01’;  
  22.    IF maxMoney >= captions+countMoney  THEN  — 判断有没有超募  
  23.             IF  maxMoney = countMoney+captions THEN  
  24.                     UPDATE  t_item_info SET full_flag=‘01’ WHERE id= itemId;  
  25.             END IF;  
  26.             UPDATE t_order_info SET pay_status = ‘01’,order_complete_date = cfcaPayTime, pay_date= payDate  WHERE   serial_number = serNumbner; — 没有超募  
  27.         SET state =‘1’— 未超募 返回1   
  28.         ELSE  
  29.             UPDATE t_order_info SET pay_status = ‘03’,order_complete_date = cfcaPayTime, pay_date=  payDate  WHERE  serial_number = serNumbner; — 没有超募  
  30.             SET state =‘3’— 已超募 返回3  
  31.     END IF;  
  32. COMMIT;   — 事务结束提交  
  33. END   
  34.   
  35. CREATE  PROCEDURE `pay_orderState`(  
  36.     IN serNumbner VARCHAR (32),  
  37.     IN itemId VARCHAR (32),  
  38.     IN captions INT,  
  39.     IN cfcaPayTime VARCHAR(32),  
  40.     IN payDate VARCHAR(30),  
  41.     OUT state VARCHAR (2))  
  42. BEGIN  
  43.     DECLARE     maxMoney INT DEFAULT 0;  
  44.   DECLARE     countMoney INT DEFAULT 0;  
  45.   DECLARE     caps INT DEFAULT 0;  
  46. START TRANSACTION;— 配置事务  
  47. SELECT  IFNULL(max_finance_money,0) INTO maxMoney FROM  t_item_info WHERE   id = itemId;  
  48. SELECT  IFNULL(SUM(capital),0) INTO countMoney FROM     t_order_info WHERE fk_item_id = itemId AND pay_status = ‘01’;  
  49.    IF maxMoney >= captions+countMoney  THEN  — 判断有没有超募  
  50.             IF  maxMoney = countMoney+captions THEN  
  51.                     UPDATE  t_item_info SET full_flag=‘01’ WHERE id= itemId;  
  52.             END IF;  
  53.             UPDATE t_order_info SET pay_status = ‘01’,order_complete_date = cfcaPayTime, pay_date= payDate  WHERE   serial_number = serNumbner; — 没有超募  
  54.         SET state =‘1’— 未超募 返回1   
  55.         ELSE  
  56.             UPDATE t_order_info SET pay_status = ‘03’,order_complete_date = cfcaPayTime, pay_date=  payDate  WHERE  serial_number = serNumbner; — 没有超募  
  57.             SET state =‘3’— 已超募 返回3  
  58.     END IF;  
  59. COMMIT;   — 事务结束提交  
  60. END

  61. DELIMITER ;—改成默认的分号;

DELIMITER

————−先定义语句的结束符号USE‘zhangzitester‘ — — — — − 先 定 义 语 句 的 结 束 符 号 U S E ‘ z h a n g z i t e s t e r ‘

DROP PROCEDURE IF EXISTS `pay_orderState`

CREATEPROCEDURE‘payorderState‘(INserNumbnerVARCHAR(32),INitemIdVARCHAR(32),INcaptionsINT,INcfcaPayTimeVARCHAR(32),INpayDateVARCHAR(30),OUTstateVARCHAR(2))BEGINDECLAREmaxMoneyINTDEFAULT0;DECLAREcountMoneyINTDEFAULT0;DECLAREcapsINTDEFAULT0;STARTTRANSACTION;–配置事务SELECTIFNULL(maxfinancemoney,0)INTOmaxMoneyFROMtiteminfoWHEREid=itemId;SELECTIFNULL(SUM(capital),0)INTOcountMoneyFROMtorderinfoWHEREfkitemid=itemIdANDpaystatus=‘01′;IFmaxMoney>=captions+countMoneyTHEN–判断有没有超募IFmaxMoney=countMoney+captionsTHENUPDATEtiteminfoSETfullflag=′01′WHEREid=itemId;ENDIF;UPDATEtorderinfoSETpaystatus=‘01′,ordercompletedate=cfcaPayTime,paydate=payDateWHEREserialnumber=serNumbner;–没有超募SETstate=′1′;–未超募返回1ELSEUPDATEtorderinfoSETpaystatus=‘03′,ordercompletedate=cfcaPayTime,paydate=payDateWHEREserialnumber=serNumbner;–没有超募SETstate=′3′;–已超募返回3ENDIF;COMMIT;–事务结束提交END C R E A T E P R O C E D U R E ‘ p a y o r d e r S t a t e ‘ ( I N s e r N u m b n e r V A R C H A R ( 32 ) , I N i t e m I d V A R C H A R ( 32 ) , I N c a p t i o n s I N T , I N c f c a P a y T i m e V A R C H A R ( 32 ) , I N p a y D a t e V A R C H A R ( 30 ) , O U T s t a t e V A R C H A R ( 2 ) ) B E G I N D E C L A R E m a x M o n e y I N T D E F A U L T 0 ; D E C L A R E c o u n t M o n e y I N T D E F A U L T 0 ; D E C L A R E c a p s I N T D E F A U L T 0 ; S T A R T T R A N S A C T I O N ; – 配 置 事 务 S E L E C T I F N U L L ( m a x f i n a n c e m o n e y , 0 ) I N T O m a x M o n e y F R O M t i t e m i n f o W H E R E i d = i t e m I d ; S E L E C T I F N U L L ( S U M ( c a p i t a l ) , 0 ) I N T O c o u n t M o n e y F R O M t o r d e r i n f o W H E R E f k i t e m i d = i t e m I d A N D p a y s t a t u s = ‘ 01 ′ ; I F m a x M o n e y >= c a p t i o n s + c o u n t M o n e y T H E N – 判 断 有 没 有 超 募 I F m a x M o n e y = c o u n t M o n e y + c a p t i o n s T H E N U P D A T E t i t e m i n f o S E T f u l l f l a g = ′ 01 ′ W H E R E i d = i t e m I d ; E N D I F ; U P D A T E t o r d e r i n f o S E T p a y s t a t u s = ‘ 01 ′ , o r d e r c o m p l e t e d a t e = c f c a P a y T i m e , p a y d a t e = p a y D a t e W H E R E s e r i a l n u m b e r = s e r N u m b n e r ; – 没 有 超 募 S E T s t a t e = ′ 1 ′ ; – 未 超 募 返 回 1 E L S E U P D A T E t o r d e r i n f o S E T p a y s t a t u s = ‘ 03 ′ , o r d e r c o m p l e t e d a t e = c f c a P a y T i m e , p a y d a t e = p a y D a t e W H E R E s e r i a l n u m b e r = s e r N u m b n e r ; – 没 有 超 募 S E T s t a t e = ′ 3 ′ ; – 已 超 募 返 回 3 E N D I F ; C O M M I T ; – 事 务 结 束 提 交 E N D

DELIMITER ;—改成默认的分号;

4.2:Java调用存储过程代码

[java] view plain copy

print ?

  1. /*
  2. * 订单支付完成调用存储过程接口,修改订单支付状态
  3. */
  4. @SuppressWarnings(“unchecked”)
  5. public String orderState(final String serNumbner,final String itemId,final int captions,final String bankNotificationTime){
  6. String param2Value=null;
  7. try{
  8. param2Value = (String)jdbc.execute(
  9. new CallableStatementCreator() {
  10. public CallableStatement createCallableStatement(Connection con) throws SQLException {
  11. String storedProc = ”{call pay_orderState(?,?,?,?,?,?)}”;// 调用的sql
  12. CallableStatement cs = con.prepareCall(storedProc);
  13. cs.setString(1, serNumbner);
  14. cs.setString(2, itemId);
  15. cs.setInt(3, captions);
  16. cs.setString(4, bankNotificationTime);
  17. cs.setString(5,DateTimeUtils.getNowTime());
  18. cs.registerOutParameter(6, Types.VARCHAR);
  19. return cs;
  20. }
  21. }, new CallableStatementCallback() {
  22. public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException{
  23. cs.execute();
  24. return cs.getString(6);// 获取输出参数的值
  25. }
  26. });
  27. }catch(Exception ex){
  28. throw new RuntimeException(ex);
  29. }
  30. return param2Value;
  31. }

/* * 订单支付完成调用存储过程接口,修改订单支付状态 */ @SuppressWarnings(“unchecked”) public String orderState(final String serNumbner,final String itemId,final int captions,final String bankNotificationTime){ String param2Value=null; try{ param2Value = (String)jdbc.execute( new CallableStatementCreator() { public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = “{call pay_orderState(?,?,?,?,?,?)}”;// 调用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, serNumbner); cs.setString(2, itemId); cs.setInt(3, captions); cs.setString(4, bankNotificationTime); cs.setString(5,DateTimeUtils.getNowTime()); cs.registerOutParameter(6, Types.VARCHAR); return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException{ cs.execute(); return cs.getString(6);// 获取输出参数的值 } }); }catch(Exception ex){ throw new RuntimeException(ex); } return param2Value; }

4.3:再附上两段代码,有关Java调用储存过程的

[java] view plain copy

print ?

  1. @Resource(name = “jdbcTemplate”)
  2. private JdbcTemplate jdbc;

@Resource(name = “jdbcTemplate”) private JdbcTemplate jdbc;

[xml] view plain copy

print ?

4.4:最后一张图片–mysql执行储存过程

Center

发表评论

表情:
评论列表 (有 0 条评论,116人围观)

还没有评论,来说两句吧...

相关阅读