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

Python011

在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

最近做一个自动发邮件的schedule,由于取数据的sql太长,直接分割很麻烦,就想到调用PL/SQL,网上查了资料做了练习,在此做下小结。

1、只有输入参数而没有返回结果的存储过程。

sql:

1 create or replace procedure prc_1(deptno in number,dname in varchar2,loc in varchar2)

2 is

3 begin

4 insert into dept values(deptno,dname,loc)

5 end prc_1

java:

1 static void test1(){

2 Connection conn=null

3 CallableStatement csmt=null

4 try {

5 conn=JDBCUtils.getConnection()

6 conn.setAutoCommit(false)

7 csmt=conn.prepareCall("call prc_1(?,?,?)")

8 csmt.setInt(1,80)

9 csmt.setString(2,"ioc")

10 csmt.setString(3,"fhp")

11 csmt.execute()

12 conn.commit()

13 System.out.println("success insert data")

14 } catch (SQLException e) {

15 e.printStackTrace()

16 }

17 }

2、有输入参数且有一个返回值的存储过程。

sql:

1 create or replace procedure prc_2(p_deptno in number,p_loc out varchar2) is

2 begin

3 select loc into p_loc from dept where deptno=p_deptno

4 end prc_2

java:

1 static void test2(){

2 Connection conn=null

3 CallableStatement csmt=null

4 try {

5 conn=JDBCUtils.getConnection()

6 conn.setAutoCommit(false)

7 csmt=conn.prepareCall("call prc_2(?,?)")

8 csmt.setInt(1,70)

9 csmt.registerOutParameter(2,Types.VARCHAR)

10 csmt.execute()

11 conn.commit()

12 System.out.println("MIS位置:"+csmt.getString(2))

13 } catch (SQLException e) {

14 e.printStackTrace()

15 }

16 }

3、返回多行记录(游标)的存储过程。

sql:

首先要建立一个返回游标,以便接收返回结果。

1 create or replace package testpackage is

2 type test_cursor is ref cursor

3 end testpackage

4

5 create or replace procedure prc_3(p_cursor out testpackage.test_cursor)is

6 begin

7 open p_cursor for

8 select * from dept order by deptno

9 end prc_3

java:

1 static void test3(){

2 Connection conn=null

3 CallableStatement csmt=null

4 ResultSet rs=null

5 try {

6 conn=JDBCUtils.getConnection()

7 conn.setAutoCommit(false)

8 csmt=conn.prepareCall("call prc_3(?)")

9 csmt.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR)

10 csmt.execute()

11 rs=(ResultSet) csmt.getObject(1)

12 while(rs.next()){

13 System.out.println(rs.getString("deptno")+'\t'+rs.getString("dname")+'\t'+rs.getString("loc"))

14 }

15 } catch (SQLException e) {

16 // TODO Auto-generated catch block

17 e.printStackTrace()

18 }finally{

19 JDBCUtils.free(rs, csmt, conn)

20 }

21 }