JDBC调用存储过程
参考链接
https://www.iteye.com/blog/sjsky-1246657
https://blog.csdn.net/qq_27888773/article/details/78493537
jdbc调用存储过程:
经常使用的4种:
1. 返回结果集的proc
2. 输出参数
3.使用带有返回状态的存储过程
4.受影响行数
以下为mysql的存储过程 sqlServer同理
- 案例1: 返回结果集的proc
存储过程:
drop procedure if exists proc_selectEmployee; create procedure proc_selectEmployee(in carid varchar(20)) begin select * from employee where cardID = carid; end call proc_selectEmployee('SZ65380');
import java.sql.*; import java.sql.CallableStatement; /** * * 简单的jdbc调用存储过程 只有输入参数 返回单个结果集 * */ public class GeTest1 { public static void main(String[] args) { Connection connection = null; //用于执行 SQL 存储过程的接口 CallableStatement statement = null; ResultSet resultSet = null; try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123"; connection = DriverManager.getConnection(url, user, password); String sql = "call proc_selectEmployee(?)"; //调用存储过程 statement = connection.prepareCall(sql); statement.setString(1, "SZ65380"); resultSet = statement.executeQuery(); if (resultSet.next()) { System.out.println(resultSet.getString("address")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
- 案例2: 输出参数
存储过程:
drop procedure if exists proc_outtwo; create procedure proc_outtwo(in idint int,out cardIdstring varchar(44),out addressstring varchar(88)) begin select cardID,address into cardIdstring,addressstring from employee where id =idint; end call proc_outtwo(1,@one,@two); select @one; select @two;
import java.sql.*; import java.sql.CallableStatement; /** * * 执行存储过程 得到输出参数 * */ public class GeTest2 { /** * @param args */ public static void main(String[] args) { Connection connection = null; //用于执行 SQL 存储过程的接口 CallableStatement statement = null; ResultSet resultSet = null; try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123"; connection = DriverManager.getConnection(url, user, password); //第一个为输入参数后面2个为输出参数 String sql = "call proc_outtwo(?,?,?);"; //调用存储过程 statement = connection.prepareCall(sql); //设置输入参数 statement.setInt(1, 1); //设置输出参数 以及类型 statement.registerOutParameter(2, Types.VARCHAR); statement.registerOutParameter(3, Types.VARCHAR); statement.execute(); //得到输出参数 System.out.println(statement.getString(2)); System.out.println(statement.getString(3)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
- 案例3:使用带有返回状态的存储过程 return 1; mysql的proc不支持 返回值 sqlserver支持
如果要获得返回值的话为:
存储过程:
create proc checkit (@addressString varchar(50)) as begin if ((select count(*) from employee where address =@addressString)) return 1 else return 0 go
CallableStatement cstmt = con.prepareCall("{? = call checkit(?)}"); cstmt.registerOutParameter(1, java.sql.Types.INTEGER); cstmt.setString(2, "深圳"); cstmt.execute(); System.out.println("return的值" + cstmt.getInt(1));
- 案例4: 获得更新行数:
drop procedure if exists proc_updateEmployee; create procedure proc_updateEmployee() begin update Employee set job=1; end
call proc_selectEmployee();
CallableStatement cstmt = con.prepareCall("{call proc_updateEmployee()}"); cstmt.execute(); int count = cstmt.getUpdateCount(); cstmt.close(); System.out.println("受影响行数:" + count);
最近的项目中store procedure调用全局参数@@rowcount, 作用就是 获得上次执行的记录数,但是在Java里面拿不到存储过程的返回值(影响的行数)
最终尝试上面的方法可以拿到
create proc pr_isExistLoginName
(
@LoginName varchar ( 30 )
)
as
select [ LoginName ] from [ PersonLogin ] where [ LoginName ] = @LoginName
return @@rowcount
(
@LoginName varchar ( 30 )
)
as
select [ LoginName ] from [ PersonLogin ] where [ LoginName ] = @LoginName
return @@rowcount
SQLServer
osql工具可以在命令行与数据库交互但是-D这个参数应该有bug,不能用MSI的方式去连数据库,因此放弃这种方式,用普通的JDBC
osql的参考资料
https://docs.microsoft.com/en-us/sql/tools/osql-utility?view=sql-server-ver15
-D is doesn't work
https://github.com/microsoft/homebrew-mssql-release/issues/44