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

Oracle
常见的一些Oracle初学者的问题
ORACLE认证系统概述
数据库考试简介:Oracle认证
Oracle认证基础知识介绍
ADO连接Oracle Access示例及记录集处理源码
SQL Server和MySQL的安全性分析
用Oracle和SQL Server数据库组合利弊分析
Oracle 11g分区功能新革命
Flashback Query 恢复误删除的数据
基于Oracle高性能动态SQL程序开发
怎样在Oracle 9i中正确的转换时区
Oracle 10g导出的数据库能否导入Oracle 9i?
增加Distinct后查询效率反而提高
Oracle限制返回结果集的大小
Java语言数据库操作的基本流程
美国甲骨文(ORACLE)公司入驻渝中区大都会商厦
RHEL AS4上安装oracle 10R2 的方法
DB中如何查询Table占用空间的大小
编写高质量高性能的MySQL语法
Oracle数据库自动备份的具体实现步骤

Java调用Oracle存储过程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 286 ::
收藏到网摘: 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){

           }
        }
   }

}