转载:http://developer.51cto.com/art/200906/130448.htm
创建需要的测试表:create table Test(tidvarchar2(10),tnamevarchar2(10));
第一种情况:无返回值.
- create or replace proceduretest_a(param1invarchar2,param2invarchar2)as
- begin
- insert into test value(param1,param2);
- end;
Java调用代码:
1. package com.test;
2. import java.sql.*;
3. import java.io.*;
4. import java.sql.*;
5. public class TestProcA
6. {
7. public TestProcA(){
8. }
9. public static void main(String[]args)
10. {
11. ResultSet rs=null;
12. Connection conn=null;
13. CallableStatement proc=null;
14. try{
15. Class.forName("oracle.jdbc.driver.OracleDriver");
16. conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test","test","test");
17. proc=conn.prepareCall("{calltest_a(?,?)}");
18. proc.setString(1,"1001");
19. proc.setString(2,"TestA");
20. proc.execute();
21. }catch(Exceptione){
22. e.printStackTrace();
23. }finally{
24. try{
25. if(null!=rs){
26. rs.close();
27.
28. if(null!=proc){
29. proc.close();
30. }
31. if(null!=conn){
32. conn.close();
33. }
34. }
35. }catch(Exceptionex){
36. }
37. }
38. }
39. }
第二种情况:有返回值的存储过程(返回值非列表).
存储过程为:
1. create or replace procedur etest_b(param1invarchar2,param2outvarchar2)
2. as
3. begin
4. select tname into param2 from test where tid=param1;
5. end;
Java调用代码:
1. package com.test;
2. import java.sql.*;
3. import java.io.*;
4. import java.sql.*;
5. public class TestProcB
6. {
7. public TestProcB(){
8. }
9. public static void main(String[]args)
10. {
11. Connection conn=null;
12. CallableStatement proc=null;
13. try{
14. Class.forName("oracle.jdbc.driver.OracleDriver");
15. conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test","test","test");
16. proc=conn.prepareCall("{calltest_b(?,?)}");
17. proc.setString(1,"1001");
18. proc.registerOutParameter(2,Types.VARCHAR);
19. proc.execute();
20. System.out.println("Outputis:"+proc.getString(2));
21. }catch(Exceptione){
22. e.printStackTrace();
23. }finally{
24. try{
25.
26. if(null!=proc){
27. proc.close();
28. }
29.
30. if(null!=conn){
31. conn.close();
32. }
33.
34. }catch(Exceptionex){
35.
36. }
37. }
38. }
39. }
第三种情况:返回列表.
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.要分两部分来写:
1. create or replace packaget package as
2. typet_cursorisrefcursor;
3. proceduretest_c(c_refoutt_cursor);
4. end;
5.
6. createorreplacepackagebodytpackageas
7. proceduretest_c(c_refoutt_cursor)is
8. begin
9. openc_refforselect*fromtest;
10. endtest_c;
11. endtpackage;
Java调用代码:
1. package com.test;
2. import java.sql.*;
3. import java.io.*;
4. import java.sql.*;
5. public class TestProcB
6. {
7. public TestProcB(){
8. }
9. publics tatic void main(String[]args)
10. {
11. Connection conn=null;
12. CallableStatement proc=null;
13. ResultSet rs=null;
14. try{
15. Class.forName("oracle.jdbc.driver.OracleDriver");
16. conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test","test","test");
17. proc=conn.prepareCall("{?=calltpackage.test_b(?)}");
18.
19. proc.registerOutParameter(1,OracleTypes.CURSOR);
20. proc.execute();
21. while(rs.next()){
22. System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));
23. }
24. }catch(Exceptione){
25. e.printStackTrace();
26. }finally{
27. try{
28. if(null!=rs){
29. rs.close();
30. if(null!=proc){
31. proc.close();
32. }
33. if(null!=conn){
34. conn.close();
35. }
36. }
37. }catch(Exceptionex){
38. }
39. }
40. }
41. }
Hibernate调用oracle存储过程
1. this.pnumberManager.getHibernateTemplate().execute(
2. newHibernateCallback()...{
3. public Object doInHibernate(Sessionsession)
4. throws HibernateException,SQLException...{
5. CallableStatementcs=session.connection().prepareCall("{callmodifyapppnumber_remain(?)}");
6. cs.setString(1,foundationid);
7. cs.execute();
8. returnnull;
9. }
10. });