本文目录一览:
java里面怎么调用存储过程
最近做一个自动发邮件的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 }
Java中是如何调用存储过程的?
//存储过程create or replace Procedure countBySal(\x0d\x0a p_sal emp.sal%type,\x0d\x0a p_count OUT number\x0d\x0a)as \x0d\x0abegin\x0d\x0a select count(*) into p_count from emp where sal = p_sql;\x0d\x0aend countBySal; //调用步奏import java.sql.CallableStatement; //带哦用存储过程所必须的语句借口\x0d\x0aimport java.sql.Connection;\x0d\x0aimport java.sql.DriverManager;\x0d\x0aimport java.sql.Types;public class EmpUtil {\x0d\x0a \x0d\x0a public static int countBySal(double sal) throws Exception{\x0d\x0a Class.forName("oracle.jdbc.driver.OracleDriver");\x0d\x0a String url="jdbc:oracle:thin:@localhost:1521:test";\x0d\x0a Connection cn=DriverManager.getConnection(url, "scott", "tiger");\x0d\x0a String sql="{call countBySal(?,?)}";//调用存储过程的语句,call后面的就是存储过程名和需要传入的参数\x0d\x0a CallableStatement cst=cn.prepareCall(sql);\x0d\x0a cst.setDouble(1, sal);//设置in参数的值\x0d\x0a cst.registerOutParameter(2, Types.INTEGER);//注册out参数的类型\x0d\x0a cst.execute();\x0d\x0a int result = cst.getInt(2);\x0d\x0a cst.close();\x0d\x0a cn.close();\x0d\x0a return result;\x0d\x0a }\x0d\x0a \x0d\x0a public static void main(String[] args) {\x0d\x0a int count;\x0d\x0a try {\x0d\x0a count = EmpUtil.countBySal(3000);\x0d\x0a System.out.println("工资在3000元以上的人数为:"+count);\x0d\x0a } catch (Exception e) {\x0d\x0a e.printStackTrace();\x0d\x0a }\x0d\x0a \x0d\x0a }\x0d\x0a \x0d\x0a}
在JAVA中怎么调用带参数的存储过程?
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;