浅谈Java存储过程调用(转)

 

  • 这里为大家谈谈Java存储过程调用,我们可以利用Java存储过程简化数据库操作, 利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。
  •  

    创建需要的测试表:create table Test(tid varchar2(10),tname varchar2(10));

    第一种情况:无返回值.

       
       
    1. create or replace procedure test_a(param1 in varchar2,param2 in varchar2)as  
    2. begin  
    3. insert into test values(param1,param2);  
    4. 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 Test ProcA(){  
    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(Exception e){  
    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(Exception ex){  
    36. }  
    37. }  
    38. }  

    第二种情况:有返回值的存储过程(返回值非列表).

    存储过程为:

       
       
    1. create or replace procedure test_b(param1 in varchar2,param2 out varchar2)  
    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(Exception e){  
    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. }  

    第三种情况:返回列表.

    由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.要分两部分来写:

       
       
    1. create or replace package tpackage as  
    2. type t_cursor is ref cursor;  
    3. procedure test_c(c_ref out t_cursor);  
    4. end;  
    5.  
    6. create or replace package body tpackage as  
    7. procedure test_c(c_ref out t_cursor)is  
    8. begin  
    9. open c_ref for select*from test;  
    10. end test_c;  
    11. end tpackage; 

    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. 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("{?=call tpackage.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. }  

    Hibernate调用oracle存储过程

       
       
    1. this.pnumberManager.getHibernateTemplate().execute(  
    2.  newHibernateCallback()...{  
    3. publicObjectdoInHibernate(Sessionsession)  
    4. throwsHibernateException,SQLException...{  
    5. CallableStatementcs=session.connection().prepareCall("{callmodifyapppnumber_remain(?)}");  
    6. cs.setString(1,foundationid);  
    7. cs.execute();  
    8. returnnull;  
    9. }  
    10.  }); 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值