jdbc从存储过程返回单个对象或PL/SQL表

返回单个PL/SQL表,元素为标量类型
创建类型,包头,包体
create or replace type tab_array is table of varchar2(38);
/

create or replace package addnum
is
  procedure abc(e_name in tab_array,t_name out tab_array);
end;
/

create or replace package body addnum is
  procedure abc
  (e_name in tab_array,t_name out tab_array)
  is
  begin
      for i in 1..e_name.count loop
          insert into t(name) values(e_name(i));
      end loop;    
     
      select name bulk collect into t_name from t;
  end;
end;
/


JDBC操作
package com.lovo;


import java.sql.Connection;
import java.sql.DriverManager;


import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.Datum;

public class JDBCMain {
    public static void main(String[] args) throws Exception {
        new oracle.jdbc.driver.OracleDriver();
       
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.99:1521:HXM", "me", "123");
        String[] strs = new String[]{"abc","cba"};
        OracleCallableStatement  call = (OracleCallableStatement) conn.prepareCall("{call addnum.abc(?,?)}");
        ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TAB_ARRAY", conn); /*TAB_ARRAY是类型名,必须大写*/
        call.setArray(1, new ARRAY(descriptor,conn,strs));
        call.registerOutParameter(2, OracleTypes.ARRAY,"TAB_ARRAY");
        call.execute();        
        ARRAY arr = call.getARRAY(2);
        Datum[] dat = arr.getOracleArray();
        for(int i=0;i<dat.length;i++){
            System.out.println(dat[i]);
        }
       
        conn.close();
    }
}


返回单个对象
    建立对象类型
        create or replace type t_obj as object
        (id int,
         name varchar2(20)
        );
       
    建立对象表
        create table t of t_obj;
       
        insert into t values(t_obj(1,'abc1'));
        insert into t values(t_obj(2,'abc2'));
        insert into t values(t_obj(3,'abc3'));
        insert into t values(t_obj(4,'abc4'));
        insert into t values(t_obj(5,'abc5'));
       
    建立包头和包体
    create or replace package addnum
    is
      procedure abc(e_name in int,t_per out t_obj);
    end;
    /
   
    create or replace package body addnum is
      procedure abc
      (e_name in int,t_per out t_obj)
      is
      begin
           select value(p) into t_per from t p where p.id=e_name;
      end;
    end;
    /

jdbc操作
    TypeDescriptor td = TypeDescriptor.getTypeDescriptor("T_OBJ", (OracleConnection) conn);
        OracleCallableStatement call = (OracleCallableStatement) conn.prepareCall("{call addnum.abc(?,?)}");
        call.setInt(1, 3);
        call.registerOutParameter(2, OracleTypes.STRUCT, "T_OBJ");
        call.execute();
       
        STRUCT str = call.getSTRUCT(2);
       
        Object[] objs = str.getAttributes();
        for(int i=0;i<objs.length;i++){
            System.out.println(str.getDescriptor().getMetaData().getColumnName(i+1) + "," + objs[i]);
        }
       
返回1个表,元素是对象
    建立对象类型,表类型,包头,包体
create or replace type t_obj as object
(id int,
 name varchar2(20)
);
/
create or replace type t_table is table of t_obj;
/

create or replace package addnum
is
  procedure abc(e_name in int,t_per out t_table);
end;
/

create or replace package body addnum is
  procedure abc
  (e_name in int,t_per out t_table)
  is
  begin
       select value(p) bulk collect into t_per from t p;
  end;
end;
/
jdbc操作
        TypeDescriptor td = TypeDescriptor.getTypeDescriptor("T_TABLE", (OracleConnection) conn);
        OracleCallableStatement call = (OracleCallableStatement) conn.prepareCall("{call addnum.abc(?,?)}");
        call.setInt(1, 1);
        call.registerOutParameter(2, OracleTypes.ARRAY,"T_TABLE");
        call.execute();
       
        ARRAY arr = call.getARRAY(2);
        Datum[] dat = arr.getOracleArray();
       
        for(int i=0;i<dat.length;i++){
            STRUCT struct = (STRUCT) dat[i];
           
            Object[] objs = struct.getAttributes();
            System.out.println("id:" + objs[0] + ",name:" + objs[1]);
        }

 

在oracle 10g上测试通过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们在Java中调用存储过程并尝试获取一个PL/SQL TABLE类型(也称为类型为TABLE的Oracle数据库对象)的输出参数时,可能会遇到类型错误的问题。这是因为Java与Oracle的类型定义方式不同,需要进行一些额外的处理。 解决方法如下: 1.使用Oracle的JDBC驱动程序,以便能够使用Oracle的特殊数据类型。 2.将Java中的Array类型转换为Oracle中的ARRAY类型,然后将其传递给存储过程。 3.在存储过程中,将ARRAY类型转换为TABLE类型,然后再将其返回给Java。 下面是一段示例代码,演示了如何在Java中调用存储过程并获取一个PL/SQL TABLE类型的输出参数: ```java Connection conn = DriverManager.getConnection(url, username, password); CallableStatement cstmt = conn.prepareCall("{call stored_proc(?)}"); // 定义一个Java数组 String[] array = {"value1", "value2", "value3"}; // 将Java数组转换为Oracle数组 ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("MY_ARRAY_TYPE", conn); ARRAY oracleArray = new ARRAY(descriptor, conn, array); // 将Oracle数组设置为CallableStatement对象的参数 cstmt.setArray(1, oracleArray); // 执行CallableStatement对象,调用存储过程 cstmt.execute(); // 获取CallableStatement对象的输出参数 ARRAY outputArray = (ARRAY) cstmt.getObject(2); // 将Oracle数组转换为Java数组 String[] output = (String[]) outputArray.getArray(); // 处理Java数组 ... ``` 在以上示例中,我们首先使用Oracle的JDBC驱动程序,然后将Java中的Array类型转换为Oracle中的ARRAY类型。接着,我们将Oracle数组设置为CallableStatement对象的参数,并执行CallableStatement对象,调用存储过程。最后,我们将Oracle数组转换为Java数组,并进行必要的处理。 需要注意的是,在这个示例中,我们假设存储过程的输出参数是MY_ARRAY_TYPE类型的一个TABLE对象。如果存储过程的输出参数类型不同,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值