在JAVA中怎么调用带参数的存储过程?

Python08

在JAVA中怎么调用带参数的存储过程?,第1张

JDBC调用存储过程: CallableStatement\x0d\x0a在Java里面调用存储过程,写法那是相当的固定:\x0d\x0aClass.forName(....\x0d\x0aConnection conn = DriverManager.getConnection(....\x0d\x0a/**\x0d\x0a*p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替\x0d\x0a*其余地方写法固定\x0d\x0a*/\x0d\x0aCallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}")\x0d\x0a/**\x0d\x0a*告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定\x0d\x0a*下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的\x0d\x0a*Types后面具体写什么类型,得看你的存储过程参数怎么定义的\x0d\x0a*/\x0d\x0acstmt.registerOutParameter(3, Types.INTEGER)\x0d\x0acstmt.registerOutParameter(4, Types.INTEGER)\x0d\x0a/**\x0d\x0a*在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出\x0d\x0a*下面是设置他们的值,第一个设为3,第二个设为4,第4个设置为5\x0d\x0a*没设第3个,因为它是输出参数\x0d\x0a*/\x0d\x0acstmt.setInt(1, 3)\x0d\x0acstmt.setInt(2, 4)\x0d\x0acstmt.setInt(4, 5)\x0d\x0a//执行\x0d\x0acstmt.execute()\x0d\x0a//把第3个参数的值当成int类型拿出来\x0d\x0aint three = cstmt.getInt(3)\x0d\x0aSystem.out.println(three)\x0d\x0a//把第4个参数的值当成int类型拿出来\x0d\x0aint four = cstmt.getInt(4)\x0d\x0aSystem.out.println(four)\x0d\x0a//用完别忘给人家关了,后开的先关\x0d\x0acstmt.close()\x0d\x0aconn.close()\x0d\x0a\x0d\x0aJDBC调用存储过程,掌握这一个程序足够了.\x0d\x0a以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.\x0d\x0a\x0d\x0acreate or replace procedure p\x0d\x0a(v_a in number,v_b number,v_ret out number,v_temp in out number)\x0d\x0ais\x0d\x0abegin\x0d\x0aif(v_a >v_b) then\x0d\x0av_ret := v_a\x0d\x0aelse\x0d\x0av_ret := v_b\x0d\x0aend if\x0d\x0av_temp := v_temp + 1\x0d\x0aend

1、创建带输出参数的存储过程 如: 在查询分析器中执行declare @mg nvarchar(100)

exec proc_CSCO_SalesFctByStore 100,200,'name',@mg output

print @mg 在Java中调用import java.sql.*

public class Test{

public static void main(String args[]) throws Exception {//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver())//获得连接

Connection conn = DriverManager.getConnection("jdbc:odbc:mydata", "sa","")//创建存储过程的对象

CallableStatement c = conn.prepareCall("{call proc_CSCO_SalesFctByStore(?,?,?,?)}")//给存储过程的第一个参数设置值

c.setInt(1, 100)//给存储过程的第一个参数设置值

c.setInt(2, 10000)//给存储过程的第一个参数设置值

c.setString(3, user)//注册存储过程的第四个参数

c.registerOutParameter(4, java.sql.Types.VARCHAR)//执行存储过程

c.execute()//得到存储过程的输出参数值

1. 存储过程以及类型定义如下:

--The array in oracle

CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20)

--package header

CREATE OR REPLACE PACKAGE Lib_Package AS

PROCEDURE Book_Check_Procedure(ids IN idArray, exist OUT NUMBER)

END Lib_Package

--package body

CREATE OR REPLACE PACKAGE BODY Lib_Package AS

PROCEDURE Book_Check_Procedure( ids IN idArray, exist OUT NUMBER) AS v_Index BINARY_INTEGERBEGIN v_Index:= ids.FIRSTLOOP SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent' AND book_id=ids(v_Index) EXIT WHEN v_Index=ids.LAST OR exist>0 v_Index:= ids.NEXT(v_Index)END LOOPEND Book_Check_Procedure

END Lib_Package

2.在Java中调用上面的存储过程

(1) 在Oracle中定义数组类型idArray (2) 在java构造数组并转换成Oracle中定义的数组类型,调用存储过程

/** * 当要删除图书时,检查是否仍然有图书复本处于借出状态 */ public boolean checkBookStatus(String[] bookIds) throws DataAccessException {

boolean flag = false Connection conn = null OracleCallableStatement cstmt = null ArrayDescriptor desc = null ARRAY bookIdArray = null int count = 0 String sql = "{call LIB_PACKAGE.Book_Check_Procedure(?,?)}"

DbDriverManager dbManager = DbDriverManager.getInstance() conn = dbManager.getConnection(Constants.DATABASE)

try { cstmt = (OracleCallableStatement) conn.prepareCall(sql)

//定义oracle中的数组类型 desc = ArrayDescriptor.createDescriptor("IDARRAY", conn) bookIdArray = new ARRAY(desc, conn, bookIds)

cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY) cstmt.registerOutParameter(2, Types.INTEGER) cstmt.execute() count = cstmt.getInt(2)

log.info(this.getClass() + ".checkBookStatus: count = " + count)

DbOperHelp.closeStatement(this.getClass(), cstmt) DbOperHelp.closeConnection(this.getClass(), conn) } catch (SQLException e) {

log.error(this.getClass() + ".checkBookStatus-->SQLException: " + e.getMessage()) DbOperHelp.closeStatement(this.getClass(), cstmt) DbOperHelp.closeConnection(this.getClass(), conn) throw new DataAccessException( "When check the books, there is a SQLException: " + e.getMessage(), e.getCause()) }

if (count >0) {

flag = true }

return flag}