`
springking
  • 浏览: 131821 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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上测试通过

分享到:
评论
2 楼 ITvision 2013-09-27  
楼主万岁,万谢
1 楼 xnxfire 2010-03-16  
哇,写得太精辟了,这个问题我研究了好久,没想到在这里找到答案了!

相关推荐

    PL/SQL Developer 中文帮助文档

    - **创建程序**:在PL/SQL Developer中新建一个PL/SQL程序,可以是存储过程、函数或其他类型的程序单元。 - **保存程序**:保存程序以便后续使用或修改,支持多种文件格式。 - **修改程序**:对已存在的程序进行编辑...

    oracle Pl/sql编程经典入门

    在 Oracle 数据库中,对象是指数据库中的表、视图、存储过程等实体。了解如何创建、修改和删除这些对象对于管理和维护数据库至关重要。 ##### 示例 - **创建一个名为 EMPLOYEE_VIEW 的视图**: ```sql CREATE ...

    Oracle_PLSQL.rar_Java plsql_oracle_oracle doc_pl sql_plsql

    在Oracle数据库环境中,PL/SQL被广泛用于开发存储过程、函数、触发器、游标和包,以实现复杂的业务逻辑和数据处理任务。本文将深入探讨Oracle PL/SQL的相关知识点,并结合Java进行集成开发。 1. **PL/SQL基础** - ...

    plsql工具以及安装教程.zip

    6. 使用PL/SQL Developer时,你可以创建、编辑、运行和调试PL/SQL块,管理表、视图、存储过程、函数和其他数据库对象。工具还提供了语法高亮、代码自动完成、错误检查等功能,极大地提高了开发效率。 在Java和...

    jdbc调用存储过程实现增删改查

    Oracle数据库则是一种广泛使用的商业关系型数据库系统,支持复杂的业务逻辑,其中存储过程是预编译的SQL和PL/SQL代码块,可以提高性能和代码复用。 ### 存储过程的理解 存储过程是数据库中的一个程序单元,它可以...

    Oracle PlSql存储过程

    下面我们将深入探讨Oracle PL/SQL存储过程的基础知识、基本语法以及一些常见问题。 **Oracle 存储过程基础知识** 1. **定义与创建**:存储过程由一系列的PL/SQL语句组成,包括变量声明、控制结构、SQL语句等,通过...

    PL_SQL_Oracle_Or_Jdbc.pdf

    根据提供的文档信息,本文将详细解析《PL_SQL_Oracle_Or_Jdbc.pdf》中的关键知识点。这份PDF文档涉及Oracle数据库的基础知识以及通过JDBC进行Oracle数据库操作的相关内容。接下来,我们将按照文档章节顺序来深入探讨...

    Oracle集合类型输出参数的PLSQL存储过程及其Java调用.docx

    通过上述步骤,我们不仅创建了一个使用索引表作为输出参数的PL/SQL存储过程,还演示了如何在Java程序中调用该存储过程并处理返回的结果。这种方法特别适用于需要返回大量数据的情况,同时也充分利用了Oracle数据库的...

    oracle存储过程(语法+实例).docx

    Java中调用存储过程通常使用JDBC的CallableStatement对象,例如: ```java CallableStatement cs = connection.prepareCall("{ call procedure_name(?, ?) }"); cs.setInt(1, arg1); cs.setDouble(2, arg2); ...

    存储过程,存储函数和触发器

    过程和函数都可以接受IN和OUT类型的参数,其中IN参数用于传递数据到过程或函数中,而OUT参数则用于从过程或函数返回数据。 ### 使用场景 - **单个返回值**:当只需要一个返回值时,使用存储函数。 - **多个返回值**...

    oracle存储过程学习经典[语法+实例+调用

    Oracle存储过程可以包含SQL语句、PL/SQL块、Java语句,其最显著的优点是代码可复用性高,维护成本低。在Oracle数据库中,创建存储过程必须具备CREATE PROCEDURE系统权限,若存储过程可供其他schema的用户使用,还...

    dba.rar_closelyq1i_diehbl_java_oracle_oracle 存储过程

    Oracle存储过程是数据库管理系统中的一种重要功能,它允许程序员或DBA编写一组SQL语句和PL/SQL代码,然后以单个对象的形式存储在数据库中。这样,这些过程可以被多次调用,减少了网络流量,提高了性能,并且使得代码...

    oracle存储过程学习经典语法+实例+调用.doc

    3. **返回列表**:如果存储过程返回多行数据,可以使用`OracleCallableStatement`的`getCursor()`方法获取游标,然后遍历结果集。 **在存储过程中做简单动态查询** 1. **本地动态SQL**:使用`EXECUTE IMMEDIATE`...

    用java调用oracle存储过程总结

    这种存储过程有一个或多个输出参数,可以返回单个值。例如,`TESTB`存储过程接收一个输入参数`PARA1`和一个输出参数`PARA2`,根据`PARA1`查询`TESTTB`表并返回结果到`PARA2`。在Java中,我们需要在`...

    oracle存储过程学习经典[语法+实例+调用]

    2. **有返回值的存储过程**:使用`OUT`参数或`RETURN`语句返回单个值,Java调用时同样通过CallableStatement,指定输出参数。 3. **返回列表**:使用`REF CURSOR`类型作为`OUT`参数,返回一个游标,Java中需遍历并...

    oracle存储过程学习经典

    - **返回列表**:如果存储过程返回一个结果集,可以使用REF CURSOR类型作为OUT参数,Java中同样使用CallableStatement处理。 在存储过程中实现动态SQL是一种常见的需求,主要分为本地动态SQL和远程动态SQL。本地...

    ORACLE考试试题

    11. PL/SQL:PL/SQL是Oracle的Procedural Language/SQL,结合了SQL和过程编程。选项b和c正确,变量、类型和异常需在DECLARE中声明。选项a错误,PL/SQL支持嵌套。选项d错误,BEGIN和END之间可以仅有SQL语句,但通常...

    Java版本Oracle SQL Plus

    3. **PL/SQL支持**:Oracle特有的过程化语言PL/SQL可以在SQL Plus中编写和执行,使得复杂的业务逻辑得以实现。 4. **动态SQL**:SQL Plus支持动态SQL,允许在运行时构建和执行SQL语句,增强了灵活性。 5. **数据...

    利用PLSQL实现分页查询代码.rar

    在Oracle数据库管理中,PL/SQL(Procedural Language/Structured Query Language)是Oracle提供的一种过程化语言,它结合了SQL的查询能力与程序设计语言的功能。本压缩包"利用PLSQL实现分页查询代码.rar"主要关注的...

Global site tag (gtag.js) - Google Analytics