如何从 PL/SQL 存储函数中返回数组类型
思路:在 Oracle 数据库中创建
VARRAY
,在Java Application中使用
oracle.sql.ARRAY
类 访问
VARRAY
VARRAY
是大小可变的数组。它具有数据元素的排列集,并且所有元素属于同一数据类型。每个元素都具有索引, VARRAY
中元素的数量是
VARRAY
的“大小”。在声明 VARRAY
类型时,必须指定其最大值。
例如:PL/SQL 存储函数从
SCOTT
模式的 EMP
表中取出所有雇员的姓名,以这些姓名创建一个数组并将其返回。在 Java 应用程序中调用此 PL/SQL 存储函数,显示雇员的姓名。
打开PL/SQL客户端,建立如下的数组类型和存储函数:
SQL>CREATE OR REPLACE TYPE EMPARRAY is VARRAY(20) OF
VARCHAR2(30)
SQL>/
然后创建下面的函数,它返回一个
VARRAY。
CREATE OR REPLACE FUNCTION getEmpArray RETURN EMPARRAY AS
l_data EmpArray := EmpArray();
CURSOR c_emp IS SELECT ename FROM EMP;
BEGIN FOR emp_rec IN c_emp LOOP
l_data.extend;
l_data(l_data.count) := emp_rec.ename;
END LOOP;
RETURN l_data;
END;
在数据库中创建函数后,可以从 java 应用程序调用它并在应用程序中获取数组数据。下面给出Java 应用程序代码:
import java.sql.Connection;
import java.sql.DriverManager;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import java.sql.SQLException;
public class SPArrayAccess {
public static void main(String[] args){
Connection conn = null;
OracleCallableStatement stmt = null;
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@insn104a:1522:ora9idb", "scott","tiger");
stmt =(OracleCallableStatement)conn.prepareCall
( "begin ? := getEMpArray; end;" );
// The name we use below, EMPARRAY, has to match the name of the
// type defined in SQL
stmt.registerOutParameter( 1, OracleTypes.ARRAY,"EMPARRAY" );
stmt.executeUpdate();
//Get the ARRAY object and print some meta data about it
ARRAY simpleArray = stmt.getARRAY(1);
System.out.println("Array is of type " + simpleArray.getSQLTypeName());
System.out.println("Array element is of type code " +simpleArray.getBaseType());
System.out.println("Array is of length " + simpleArray.length());
// Print the contents of the array
String[] values = (String[])simpleArray.getArray();
for( int i = 0; i < values.length; i++ )
System.out.println( "row " + i + " = '" + values[i] +"'" );
} catch (SQLException se) {
System.out.println(se.toString());
} catch (Exception e) {
System.out.println(e.toString());
} finally {
try {
stmt.close();
conn.close();
} catch (SQLException se) {
System.out.println(se.toString());
}
}
}
}
需要JDBC 驱动,Version 9i以上就可以了。
OracleCallableSatatement
用于调用 PL/SQL 存储函数。在执行 PL/SQL
存储函数前,将返回的数据类型注册为 OracleTypes.ARRAY,
并且指定了在数据库中定义的数据类型名称
(EMPARRAY
)。执行 PL/SQL 存储函数后获得 oracle.sql.ARRAY
类型的返回值。 oracle.sql.ARRAY
类拥有的方法可以获得一系列关于数组的详细信息,如数组类型TYPE、数组长度LENGTH等。这里我们使用 oracle.sql.ARRAY
的 getArray()
方法获得数组并将其打印出来。
分享到:
相关推荐
当找不到分隔符时,最后的子字符串也会被添加到数组中。然而,这种方法存在一个问题,当分隔符出现在字符串末尾时,可能会导致最后一组元素丢失。 ```sql CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR...
在 Oracle 中,数组可以用来存储大量的数据,并且可以通过索引来访问数组中的元素。 固定数组是一种具有固定长度的数组,它可以用来存储一个固定数量的元素。例如,在以下的示例代码中,我们声明了一个固定数组 `v_...
根据提供的文件信息,...以上示例展示了如何在Oracle存储过程中使用 `VARRAY` 和 `ASSOCIATIVE ARRAY` 来高效地存储和处理数据。通过这些结构,开发人员可以在存储过程中更灵活地管理数据,提高程序的性能和可维护性。
- 可变长度的一维数组:使用`TABLE`关键字,如`type type_array is table of varchar2(20) index by binary_integer`,表示一个可变长度的数组,其中元素是长度不超过20的字符串,索引由符号整数(binary_integer)...
这些预定义的类型通常在`SYS`模式下,并且可以直接在SQL语句中使用。例如: ```sql SELECT * FROM TABLE(SYS.ODCINUMBERLIST(1, 2, 3)); ``` 这些内置的集合类型适用于各种情况,如`SYS.ODCINUMBERLIST`用于存储...
Oracle中的联合数组,也称作PL/SQL表,是一种特殊的数据结构,仅能在PL/SQL环境中使用,不能直接用于数据库表。联合数组不需要初始化,没有特定的构造函数语法,因此在赋值前无需预分配存储空间,也无需使用EXTEND...
2. 字符型:CHAR、VARCHAR2(可变长度字符串)、LONG(长字符串)。 3. 日期/时间型:DATE、TIMESTAMP。 4. 二进制型:RAW、BLOB(大型对象)。 5. 集合类型:如VARRAY(固定大小数组)和NESTED TABLE(嵌套表)。 ...
varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...
1. `raise_application_error(-20005,'')`: 这是一个自定义错误处理机制,`raise_application_error` 函数用于在PL/SQL代码中抛出用户定义的错误,参数`-20005`是错误编号,字符串''是错误消息,通常用来通知调用者...
2. **字符型**:CHAR(n)存储固定长度的字符串,VARCHAR2(n)存储可变长度的字符串。NCHAR(n)和NVARCHAR2(n)用于存储Unicode字符。 3. **日期和时间型**:DATE存储日期和时间,TIMESTAMP(p)存储精确到秒的时间戳,...
例如,你可以定义一个VARRAY类型,存储最多10个字符串。VARRAY的优势在于它占用的空间相对紧凑,因为所有元素都存储在同一块内存中,访问速度快。但缺点是当需要存储的元素数量超过预设限制时,无法添加新的元素。 ...
这段代码声明了一个名为ar的VARRAY,初始赋值为三个字符串元素。然后通过for循环遍历数组并打印每个元素。 **可变数组(INDEX BY)**: 可变数组,也称为索引数组,与固定数组不同,它可以在运行时动态扩展或收缩。...
-- SQL中使用集合 SELECT * FROM some_table WHERE some_column IN (SELECT * FROM TABLE(t_nested_var)); ``` #### 12.5 嵌套表的集合操作 Oracle 10g引入了新的特性,使得嵌套表可以像集合一样进行操作,支持...
- **集合类型**:类似于Java中的数组,Oracle也提供了自己的集合类型,如`VARRAY`和`NESTED TABLE`,可用于存储多个相同类型的值。 综上所述,掌握Oracle中的变量定义与使用对于编写高效、可靠的数据库应用程序至关...
6. 分页查询:配合LIMIT和OFFSET(或ROWNUM)可以实现分页查询,但Oracle中使用子查询或ROWNUM伪列来实现。 总结,Oracle的数据类型丰富多样,涵盖了各种常见数据的存储需求,而行排序则是数据查询时不可或缺的一...
2. 集合:PL/SQL中的集合允许一次性操作多个元素,如VARRAY(固定大小数组)和NESTED TABLE(嵌套表)。 六、事务处理与提交 PL/SQL支持事务处理,可以使用`COMMIT`提交事务,`ROLLBACK`回滚事务,确保数据的一致性...
这里的例子中,`TOOLS_VA`可以存储最多5个`VARCHAR2`类型的字符串。 ### 四、表结构与数据插入 在创建`ADDRESS`表的过程中,我们看到了标准的SQL语句用于表的创建和数据的插入。该表包含了个人的基本信息,如姓氏...
在Java编程语言中,Oracle数据库是广泛使用的存储和管理数据的系统。本课程"MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组"着重讲解了Oracle数据库中的两种特殊数据结构——嵌套表和可变数组,它们在处理复杂...
20. **SYS_INVALID_ID**:当ROWID字符串无效时触发。ROWID是Oracle中用于快速定位行的特殊标识符,无效的ROWID可能指向数据损坏或其他底层错误。 21. **TIMEOUT_ON_RESOURCE**:当Oracle在等待资源(如锁、I/O操作...
- `TABLE OF dataType INDEX BY indexType`: 动态大小的关联数组,可以用整数或字符串作为索引。 9. **对象类型** - 自定义对象类型允许创建具有复杂结构的数据类型,由一个或多个属性组成。 10. **ROWID类型** ...