如何从 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()
方法获得数组并将其打印出来。
分享到:
相关推荐
主要介绍了oracle中变长数组varray,嵌套表,集合使用方法,需要的朋友可以参考下
Oracle游标使用方法及语法大全.doc
本文主要介绍的是关于sql Oracle匿名TABLE/VARRAY类型的相关内容,在Oracle中,我有时会创建一些这样的结构 SELECT * FROM TABLE(STRINGS('a', 'b', 'c')) SELECT * FROM TABLE(NUMBERS(1, 2, 3)) 显然,我可以为...
varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...
·定义和部署varray 、嵌套表和联合数组数据类型; ·处理外部例程、对象类型、大对象和安全文件; ·使用DBMS_ALERT 和DBMS_PIPE 在并行会话间通信; ·通过Oracle Net Services 和PL/SQL 包装器调用外部...
·定义和部署varray 、嵌套表和联合数组数据类型; ·处理外部例程、对象类型、大对象和安全文件; ·使用DBMS_ALERT 和DBMS_PIPE 在并行会话间通信; ·通过Oracle Net Services 和PL/SQL 包装器调用外部...
能够包含字符串值通配符,如JON%;还包含比较操作符,如>, <, NOT, BETWEEN, IN等。 Oracle监控器 ——该组件能够监控您Direct Oracle Access程序的数据库访问行为。可以显示每个行为的SQL、变量、时间戳、逝去时间...
使用复合数据类型 8.1 PL/SQL记录 8.1.1 定义PL/SQL记录 8.1.2 使用PL/SQL记录 8.2 PL/SQL集合 8.2.1 索引表 8.2.2 嵌套表 8.2.3 变长数组(VARRAY) 8.2.4 PL/SQL记录表...
oracle更加支持集合的应用,详细讲述了三种集合的类型:嵌套表、关联数组、varray集合。以丰富实用的例子进行了具体分析。
DUL数据库恢复实战步骤.DUL支持多级别安全标签(MLSLABEL) , 支持VARRAY,OBJECT类型列,也支持嵌套表。DUL在Unload过程中不会考虑到数据库一致性,它假定所有数据文件中的数据都是已经提交了的,没有了数据一致性的...
安装 SQL:使用现有的 Oracle 用户或创建一个新用户。 在此模式中,通过 sqlplus intarray.sql、simplepackagebody.sql、simplepackageheader.sql 运行以下脚本 ( soe 是我安装这个例子的模式, soe 也是密码) ...
提叻一个代码段,要人帮助解释一下... type t_varray is varray(10) of number; v_indexby t_indexby; v_nested t_nested; v_varray t_varray; begin v_indexby(1):=1; v_indexby(2):=2; v_nested:=t_nested(1,2,3,4,5
--字符串加解密,返回一串32位长的字符串 --Select UTL_INet.f_MD5( 'TestPassword' ) From Dual; Function f_MD5( as_SourceStr in Varchar2 --需要加密的字符串 ) Return Varchar2; --将Email地址...
NULL 博文链接:https://rooi.iteye.com/blog/1337383
全面用例详解PL集中的开发细节与概念,把集合应用到官方指定的位置
联合数组 嵌套表 可变数组 联合数组详解: 什么是数组?数组有什么特点 数据是线性存放的,在内存中地址是连续的 可以用索引来访问 定义联合数组? 联合数组不需要定义长度,他能容纳的元素最大数量是-214483647-...
Delphi WebBrowser 将一段HTML文字显示在网页浏览器中,实际是创建了一个HTML格式内容并显示出来,主要使用Delphi中内置的WebBrowser方法来实现: WebBrowser1.Navigate('about:blank'); while(tag=0) do ...
1)字符型文字(字符串) 'tom' (单引号) 'tom''s pen' ''为2个单引号(标识转义) 为tom's pen 2)数字型 123 -4 +56 0 9.0 1.23E5 9.8e-3 3)布尔型 TRUE FALSE NULL 7. 变量声明 语法 Var_name [CONSTANT](标识...