当前位置: 首页 > 图文教程 > 数据库 > Oracle > Java调用Oracle存储过程

Oracle
Oracle 中文字段进行排序的sql语句
oracle SQL解析步骤小结
ORACLE实例的后台进程
Oracle 游标使用总结
oracle 优化的一点体会
在oracle 数据库中查看一个sql语句的执行时间和SP2-0027错误
Oracle 添加用户并赋权,修改密码,解锁,删除用户的方法
Oracle 创建监控账户 提高工作效率
Oracle 子程序参数模式,IN,OUT,NOCOPY
Oracle 存储过程加密方法
oracle 多个字符替换实现
Oracle 存储过程教程
oracle 更改数据库名的方法
Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
Oracle字符集修改查看方法
一些实用的sql语句
Oracle中sys和system的区别小结
oracle 存储过程和触发器复制数据
Oracle 多行记录合并/连接/聚合字符串的几种方法
ORACLE常用数值函数、转换函数、字符串函数

Java调用Oracle存储过程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 268 ::
收藏到网摘: n/a

好久不用java调用存储过程的系统了,今天被别人给问住了。。。晕的很。。。

下面是自己的一些总结:

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

  第一种情况:无返回值.

      create or replace procedure test_a(param1 in varchar2,param2 in varchar2) as

       begin

            insert into test value(param1,param2);

     end;

    Java调用代码:

package com.test;

import java.sql.*;

import java.io.*;

import java.sql.*;

public class TestProcA
{
   public TestProcA(){
 
   }
  
   public static void main(String []args)
   {
        
        ResultSet rs = null;
        Connection conn = null; 
        CallableStatement proc = null; 
         
        try{
          Class.forName("oracle.jdbc.driver.OracleDriver");
          conn =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test", "test", "test"); 
          proc = conn.prepareCall("{ call test_a(?,?) }");
          proc.setString(1, "1001");
          proc.setString(2, "TestA");
          proc.execute();
        }catch(Exception e){
     e.printStackTrace();
 }finally{
           try{
       if(null!=rs){
                 rs.close();

          if(null!=proc){
                    proc.close();
          }

          if(null!=conn){
                    conn.close();
          } 
       }  
           }catch(Exception ex){

           }
        }
   }

}

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

存储过程为:
create or replace procedure test_b(param1 in varchar2,param2 out varchar2)
as
 begin
    select tname into param2 from test where tid=param1;
 end;

Java调用代码:

 package com.test;

import java.sql.*;

import java.io.*;

import java.sql.*;

public class TestProcB
{
   public TestProcB(){
 
   }
  
   public static void main(String []args)
   {
        
        Connection conn = null;
        CallableStatement proc = null;
      
        try{
          Class.forName("oracle.jdbc.driver.OracleDriver");
          conn =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test", "test", "test");
          proc = conn.prepareCall("{ call test_b(?,?) }");
          proc.setString(1, "1001");
          proc.registerOutParameter(2, Types.VARCHAR);
          proc.execute();
   System.out.println("Output is:"+proc.getString(2));
        }catch(Exception e){
     e.printStackTrace();
 }finally{
           try{

          if(null!=proc){
                    proc.close();
          }

          if(null!=conn){
                    conn.close();
          }
 
           }catch(Exception ex){

           }
        }
   }

}

第三种情况:返回列表.

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.要分两部分来写:
create or replace package tpackage as
type t_cursor is ref cursor;
procedure test_c(c_ref out t_cursor);
end ;

create or replace package body tpackage as
procedure test_c(c_ref out t_cursor) is
   begin
      open c_ref for select * from test;
  end test_c;
end tpackage;

Java调用代码:

package com.test;

import java.sql.*;

import java.io.*;

import java.sql.*;

public class TestProcB
{
   public TestProcB(){
 
   }
  
   public static void main(String []args)
   {
        
        Connection conn = null;
        CallableStatement proc = null;
        ResultSet rs =  null;
        try{
          Class.forName("oracle.jdbc.driver.OracleDriver");
          conn =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:test", "test", "test");
          proc = conn.prepareCall("{? = call tpackage.test_b(?) }");
          
          proc.registerOutParameter(1,OracleTypes.CURSOR);
          proc.execute();
          while(rs.next()){
              System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));
          }
        }catch(Exception e){
     e.printStackTrace();
 }finally{
           try{
          if(null!=rs){
              rs.close();
             if(null!=proc){
                    proc.close();
             }

             if(null!=conn){
                    conn.close();
             }
          }
          }catch(Exception ex){

           }
        }
   }

}