在命令窗口执行以下语句,创建自定义类型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);不知道什么原因。
分享到:
相关推荐
Oracle9i数据库在传统的关系模型基础上扩展了对象关系特性,支持用户自定义类型(UDT),包括对象类型(记录类型)、数组类型和嵌套表类型。这使得数据库能够存储复杂的数据结构,如对象实例和变长属性。对象模型...
3. **面向对象**:Oracle数据库支持面向对象编程,包括对象类型、对象表、嵌套表、集合类型等。这使得数据库能够存储更复杂的数据结构,并提供了更丰富的编程能力。 4. **表空间**:表空间是Oracle数据库中存储数据...
数据库管理包括表空间、数据文件、回滚段、索引、触发器和存储过程的管理。表空间是逻辑存储单元,数据文件则存储实际数据。回滚段用于事务回滚,索引提升查询效率,而触发器和存储过程则实现了业务逻辑自动化。 第...
例如,视图可以提供数据的虚拟表,存储过程和函数则允许自定义的业务逻辑,而触发器则能自动响应特定的数据库事件。 四、PL/SQL编程 Oracle的PL/SQL是一种面向过程的编程语言,用于编写存储过程、函数、包等。它...
5. **对象类型**:用户自定义的数据类型,如表的嵌套结构。 6. **集合类型**:如VARRAY和NESTED TABLE,用于存储数组和表格型数据。 四、Oracle帮助文档 《ORACLE九阴真经.chm》和《Oracle安装及连接文档.doc》提供...
8. 表类型(嵌套表类型):在表定义中包含的嵌套表,允许在表中存储结构化的集合数据。 7.3 PL/SQL编程方案对象 1. 过程:一组SQL和PL/SQL语句的集合,用于完成特定任务,类似高级语言的函数或子程序。 2. 函数:...
10. 数据字典:解释了Oracle数据库中数据字典的结构和作用,数据字典是存储数据库自身信息的特殊表。 11. Oracle数据类型:详述了Oracle中各种数据类型的特性,如字符型、数字型、日期型等。 12. Oracle体系结构...
PL/SQL是Oracle特有的过程化语言,它与SQL紧密集成,允许编写存储过程、函数、触发器等,增强了数据库的处理能力。 文档可能涵盖了以下关键知识点: 1. **SQL基本语法**:包括SELECT语句用于查询数据,INSERT用于...
7. **表类型**(嵌套表类型):在表定义中嵌入表格结构,允许更灵活的数据组织。 PL/SQL编程方案对象涉及Oracle的内置编程语言PL/SQL,包括: 1. **过程**:一组SQL和PL/SQL语句组成的可执行单元,用于完成特定...
- **数据字典**:介绍Oracle数据库中的数据字典,了解如何通过查询数据字典视图获取数据库的元数据信息,如表结构、索引、权限等。 - **Oracle数据类型**:全面解析Oracle支持的各种数据类型,包括数值型、字符型、...
Oracle自9i版本开始引入了对面向对象的支持,包括对象类型、对象关系模型、嵌套表和集合类型等,这些内容在书中可能会有详尽的阐述。 其次,面向对象编程的核心概念,如封装、继承和多态性,如何在Oracle数据库中...
- **表类型**(嵌套表类型):允许在表定义中包含表格。 2. **PL/SQL编程方案对象**:Oracle的数据库编程组件,用于创建可执行的存储逻辑。 - **过程**:类似高级语言的模块,由SQL和PL/SQL语句组成。 - **函数*...
- 子查询可以嵌套在其他SQL语句中,用于返回单个值、多个值或结果集,如`SELECT * FROM 表1 WHERE 列1 IN (SELECT 列2 FROM 表2 WHERE 条件);`。 7. 分区和索引: - Oracle支持表分区,可以提高大数据量查询的...
对象类型在Oracle中是作为一种数据结构存在的,可以存储单条记录或定义嵌套表存储多条记录。定义对象类型时,属性与数据表中的列相对应,操作对象类型实际上就是在操作数据表,实现了对数据的增、删、改、查操作。还...
日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
20. **存储过程**:深入学习存储过程的设计和调用,实现封装的业务逻辑,提高数据处理效率。 21. **触发器**:介绍触发器的概念和应用,实现在特定事件发生时自动执行的代码段。 22. **事务**:讲解事务的基本概念...
- **嵌套表与可变数组**:处理复杂数据结构。 #### 四、PL/SQL部分 - **PL/SQL简介**:过程化SQL,用于编写复杂的数据库应用程序。 - **数据类型**:定义变量和常量的数据类型。 - **控制语句**:条件判断和循环...