`

ORACLE中使用VARRAY解决字符串数组问题

阅读更多

如何从 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.ARRAYgetArray() 方法获得数组并将其打印出来。

分享到:
评论

相关推荐

    oracle中变长数组varray,嵌套表,集合使用方法

    主要介绍了oracle中变长数组varray,嵌套表,集合使用方法,需要的朋友可以参考下

    Oracle游标使用方法及语法大全.doc

    Oracle游标使用方法及语法大全.doc

    sql – Oracle中匿名TABLE/VARRAY类型示例详解

    本文主要介绍的是关于sql Oracle匿名TABLE/VARRAY类型的相关内容,在Oracle中,我有时会创建一些这样的结构 SELECT * FROM TABLE(STRINGS('a', 'b', 'c')) SELECT * FROM TABLE(NUMBERS(1, 2, 3)) 显然,我可以为...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    Oracle11gPLSQLProgramming

     ·定义和部署varray 、嵌套表和联合数组数据类型;  ·处理外部例程、对象类型、大对象和安全文件;  ·使用DBMS_ALERT 和DBMS_PIPE 在并行会话间通信;  ·通过Oracle Net Services 和PL/SQL 包装器调用外部...

    Oracle.Database.11g.PL_SQL.Programming

     ·定义和部署varray 、嵌套表和联合数组数据类型;  ·处理外部例程、对象类型、大对象和安全文件;  ·使用DBMS_ALERT 和DBMS_PIPE 在并行会话间通信;  ·通过Oracle Net Services 和PL/SQL 包装器调用外部...

    Direct Oracle Access v4.1.3 bcb6

    能够包含字符串值通配符,如JON%;还包含比较操作符,如&gt;, &lt;, NOT, BETWEEN, IN等。 Oracle监控器 ——该组件能够监控您Direct Oracle Access程序的数据库访问行为。可以显示每个行为的SQL、变量、时间戳、逝去时间...

    精通Oracle.10g.PLSQL编程

    使用复合数据类型 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 PLSQL集合

    oracle更加支持集合的应用,详细讲述了三种集合的类型:嵌套表、关联数组、varray集合。以丰富实用的例子进行了具体分析。

    oracle恢复工具DUL

    DUL数据库恢复实战步骤.DUL支持多级别安全标签(MLSLABEL) , 支持VARRAY,OBJECT类型列,也支持嵌套表。DUL在Unload过程中不会考虑到数据库一致性,它假定所有数据文件中的数据都是已经提交了的,没有了数据一致性的...

    OracleExamples:简单的 Oracle 代码示例

    安装 SQL:使用现有的 Oracle 用户或创建一个新用户。 在此模式中,通过 sqlplus intarray.sql、simplepackagebody.sql、simplepackageheader.sql 运行以下脚本 ( soe 是我安装这个例子的模式, soe 也是密码) ...

    Oracle 数组的学习 小知识也要积累,养成好的学习态度

    提叻一个代码段,要人帮助解释一下... 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

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    --字符串加解密,返回一串32位长的字符串 --Select UTL_INet.f_MD5( 'TestPassword' ) From Dual; Function f_MD5( as_SourceStr in Varchar2 --需要加密的字符串 ) Return Varchar2; --将Email地址...

    SQL集合嵌套表varray

    NULL 博文链接:https://rooi.iteye.com/blog/1337383

    plsql中的集合3剑客详解

    全面用例详解PL集中的开发细节与概念,把集合应用到官方指定的位置

    PL/SQL学习笔记

    联合数组 嵌套表 可变数组 联合数组详解: 什么是数组?数组有什么特点 数据是线性存放的,在内存中地址是连续的 可以用索引来访问 定义联合数组? 联合数组不需要定义长度,他能容纳的元素最大数量是-214483647-...

    Delphi WebBrowser 将一段HTML文字显示在浏览器中.rar

    Delphi WebBrowser 将一段HTML文字显示在网页浏览器中,实际是创建了一个HTML格式内容并显示出来,主要使用Delphi中内置的WebBrowser方法来实现:  WebBrowser1.Navigate('about:blank');  while(tag=0) do ...

    PL/SQL 基础.doc

    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](标识...

Global site tag (gtag.js) - Google Analytics