`

Java获取Oracle存储过程返回的自定义嵌套表

阅读更多
在命令窗口执行以下语句,创建自定义类型NESTEDARRAY。
create or replace TYPE NESTEDARRAY IS TABLE OF NVARCHAR2(32);

在存储过程中使用自定义类型NESTEDARRAY。
PROCEDURE GET_ARR_RESULT(INPUTARRAY IN NESTEDARRAY, AR OUT NESTEDARRAY) IS
  BEGIN
    AR := NESTEDARRAY();
  
    FOR I IN 1 .. INPUTARRAY.COUNT LOOP
      AR.EXTEND;
      AR(I) := I|| INPUTARRAY(I);
    END LOOP;
 END GET_ARR_RESULT;

Java代码:
import java.sql.Connection;
import java.sql.SQLException;

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

/**
 * Java获取Oracle存储过程返回自定义类型
 * @author lucky star
 *
 */
public class OracleTypeResultTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Connection con = null;
		OracleCallableStatement ocs = null;
		String sql = "{call test.GET_ARR_RESULT(?,?)}";
	
		try {
			con = DBUtil.dbUtil.getConnection();
			ocs = (OracleCallableStatement) con.prepareCall(sql);
			String[] params = {“10001”,”10003”};
			ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("NESTEDARRAY", con);
			ARRAY inputArray = new ARRAY(arrayDesc, con, params);
			ocs.setARRAY(1, inputArray);
			ocs.registerOutParameter(2,OracleTypes.ARRAY,"NESTEDARRAY");
			ocs.execute();
				
			ARRAY array = ocs.getARRAY(2);
			Datum[] datum = array.getOracleArray();
			for (int i=0;i<datum.length;i++) {
				System.out.println(datum[i].intValue());
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(ocs!=null)ocs.close();
				if(con!=null)con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

用VARCHAR2测试,发现存储过程中无法获取到传入的数组的值。
不过,将自定义类型由varchar2改成NVarchar2就成功了。
即:create or replace TYPE NESTEDARRAY IS TABLE OF NVARCHAR2(32);不知道什么原因。



分享到:
评论

相关推荐

    基于Java-JDBC访问Oracle9i对象关系数据库的一种实现方法.pdf

    Oracle9i数据库在传统的关系模型基础上扩展了对象关系特性,支持用户自定义类型(UDT),包括对象类型(记录类型)、数组类型和嵌套表类型。这使得数据库能够存储复杂的数据结构,如对象实例和变长属性。对象模型...

    中南大学Oracle数据库课件

    3. **面向对象**:Oracle数据库支持面向对象编程,包括对象类型、对象表、嵌套表、集合类型等。这使得数据库能够存储更复杂的数据结构,并提供了更丰富的编程能力。 4. **表空间**:表空间是Oracle数据库中存储数据...

    Oracle数据库课堂笔记

    数据库管理包括表空间、数据文件、回滚段、索引、触发器和存储过程的管理。表空间是逻辑存储单元,数据文件则存储实际数据。回滚段用于事务回滚,索引提升查询效率,而触发器和存储过程则实现了业务逻辑自动化。 第...

    ORACLE课程设计案例精编

    例如,视图可以提供数据的虚拟表,存储过程和函数则允许自定义的业务逻辑,而触发器则能自动响应特定的数据库事件。 四、PL/SQL编程 Oracle的PL/SQL是一种面向过程的编程语言,用于编写存储过程、函数、包等。它...

    Oracle11g安装

    5. **对象类型**:用户自定义的数据类型,如表的嵌套结构。 6. **集合类型**:如VARRAY和NESTED TABLE,用于存储数组和表格型数据。 四、Oracle帮助文档 《ORACLE九阴真经.chm》和《Oracle安装及连接文档.doc》提供...

    oracle9i中文版基础培训教程7收集.pdf

    8. 表类型(嵌套表类型):在表定义中包含的嵌套表,允许在表中存储结构化的集合数据。 7.3 PL/SQL编程方案对象 1. 过程:一组SQL和PL/SQL语句的集合,用于完成特定任务,类似高级语言的函数或子程序。 2. 函数:...

    超详细Oracle教程

    10. 数据字典:解释了Oracle数据库中数据字典的结构和作用,数据字典是存储数据库自身信息的特殊表。 11. Oracle数据类型:详述了Oracle中各种数据类型的特性,如字符型、数字型、日期型等。 12. Oracle体系结构...

    oracle_sql帮助文档

    PL/SQL是Oracle特有的过程化语言,它与SQL紧密集成,允许编写存储过程、函数、触发器等,增强了数据库的处理能力。 文档可能涵盖了以下关键知识点: 1. **SQL基本语法**:包括SELECT语句用于查询数据,INSERT用于...

    Oracle 9i中文版基础培训教程07

    7. **表类型**(嵌套表类型):在表定义中嵌入表格结构,允许更灵活的数据组织。 PL/SQL编程方案对象涉及Oracle的内置编程语言PL/SQL,包括: 1. **过程**:一组SQL和PL/SQL语句组成的可执行单元,用于完成特定...

    比较详细的oracle教程

    - **数据字典**:介绍Oracle数据库中的数据字典,了解如何通过查询数据字典视图获取数据库的元数据信息,如表结构、索引、权限等。 - **Oracle数据类型**:全面解析Oracle支持的各种数据类型,包括数值型、字符型、...

    object-oriented oracle(英文版)

    Oracle自9i版本开始引入了对面向对象的支持,包括对象类型、对象关系模型、嵌套表和集合类型等,这些内容在书中可能会有详尽的阐述。 其次,面向对象编程的核心概念,如封装、继承和多态性,如何在Oracle数据库中...

    oracle9i中文版基础培训教程7宣贯.pdf

    - **表类型**(嵌套表类型):允许在表定义中包含表格。 2. **PL/SQL编程方案对象**:Oracle的数据库编程组件,用于创建可执行的存储逻辑。 - **过程**:类似高级语言的模块,由SQL和PL/SQL语句组成。 - **函数*...

    oracle常用SQL语句(汇总版).zip

    - 子查询可以嵌套在其他SQL语句中,用于返回单个值、多个值或结果集,如`SELECT * FROM 表1 WHERE 列1 IN (SELECT 列2 FROM 表2 WHERE 条件);`。 7. 分区和索引: - Oracle支持表分区,可以提高大数据量查询的...

    Oracle PL_SQL面向对象特性的Web应用.pdf

    对象类型在Oracle中是作为一种数据结构存在的,可以存储单条记录或定义嵌套表存储多条记录。定义对象类型时,属性与数据表中的列相对应,操作对象类型实际上就是在操作数据表,实现了对数据的增、删、改、查操作。还...

    JAVA上百实例源码以及开源项目源代码

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    oracle教程

    20. **存储过程**:深入学习存储过程的设计和调用,实现封装的业务逻辑,提高数据处理效率。 21. **触发器**:介绍触发器的概念和应用,实现在特定事件发生时自动执行的代码段。 22. **事务**:讲解事务的基本概念...

    Oracle 笔记.docx

    - **嵌套表与可变数组**:处理复杂数据结构。 #### 四、PL/SQL部分 - **PL/SQL简介**:过程化SQL,用于编写复杂的数据库应用程序。 - **数据类型**:定义变量和常量的数据类型。 - **控制语句**:条件判断和循环...

Global site tag (gtag.js) - Google Analytics