`

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_split_函数_返回数组

    当找不到分隔符时,最后的子字符串也会被添加到数组中。然而,这种方法存在一个问题,当分隔符出现在字符串末尾时,可能会导致最后一组元素丢失。 ```sql CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR...

    ORACLE数组使用方法

    在 Oracle 中,数组可以用来存储大量的数据,并且可以通过索引来访问数组中的元素。 固定数组是一种具有固定长度的数组,它可以用来存储一个固定数量的元素。例如,在以下的示例代码中,我们声明了一个固定数组 `v_...

    Oracle数组的使用

    根据提供的文件信息,...以上示例展示了如何在Oracle存储过程中使用 `VARRAY` 和 `ASSOCIATIVE ARRAY` 来高效地存储和处理数据。通过这些结构,开发人员可以在存储过程中更灵活地管理数据,提高程序的性能和可维护性。

    oracle数组定义与使用.pdf

    - 可变长度的一维数组:使用`TABLE`关键字,如`type type_array is table of varchar2(20) index by binary_integer`,表示一个可变长度的数组,其中元素是长度不超过20的字符串,索引由符号整数(binary_integer)...

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

    这些预定义的类型通常在`SYS`模式下,并且可以直接在SQL语句中使用。例如: ```sql SELECT * FROM TABLE(SYS.ODCINUMBERLIST(1, 2, 3)); ``` 这些内置的集合类型适用于各种情况,如`SYS.ODCINUMBERLIST`用于存储...

    Oracle定义联合数组及使用技巧

    Oracle中的联合数组,也称作PL/SQL表,是一种特殊的数据结构,仅能在PL/SQL环境中使用,不能直接用于数据库表。联合数组不需要初始化,没有特定的构造函数语法,因此在赋值前无需预分配存储空间,也无需使用EXTEND...

    oracle 简明语法教程

    2. 字符型:CHAR、VARCHAR2(可变长度字符串)、LONG(长字符串)。 3. 日期/时间型:DATE、TIMESTAMP。 4. 二进制型:RAW、BLOB(大型对象)。 5. 集合类型:如VARRAY(固定大小数组)和NESTED TABLE(嵌套表)。 ...

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

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

    oracle知识点及常用技术

    1. `raise_application_error(-20005,'')`: 这是一个自定义错误处理机制,`raise_application_error` 函数用于在PL/SQL代码中抛出用户定义的错误,参数`-20005`是错误编号,字符串''是错误消息,通常用来通知调用者...

    Oracle 10g 操作手册 Oracle数据类型精解

    2. **字符型**:CHAR(n)存储固定长度的字符串,VARCHAR2(n)存储可变长度的字符串。NCHAR(n)和NVARCHAR2(n)用于存储Unicode字符。 3. **日期和时间型**:DATE存储日期和时间,TIMESTAMP(p)存储精确到秒的时间戳,...

    Oracle三种集合数据类型的比较

    例如,你可以定义一个VARRAY类型,存储最多10个字符串。VARRAY的优势在于它占用的空间相对紧凑,因为所有元素都存储在同一块内存中,访问速度快。但缺点是当需要存储的元素数量超过预设限制时,无法添加新的元素。 ...

    数组和导入导出PPT学习教案.pptx

    这段代码声明了一个名为ar的VARRAY,初始赋值为三个字符串元素。然后通过for循环遍历数组并打印每个元素。 **可变数组(INDEX BY)**: 可变数组,也称为索引数组,与固定数组不同,它可以在运行时动态扩展或收缩。...

    Oracle PLSQL集合

    -- SQL中使用集合 SELECT * FROM some_table WHERE some_column IN (SELECT * FROM TABLE(t_nested_var)); ``` #### 12.5 嵌套表的集合操作 Oracle 10g引入了新的特性,使得嵌套表可以像集合一样进行操作,支持...

    oracle变量的总结

    - **集合类型**:类似于Java中的数组,Oracle也提供了自己的集合类型,如`VARRAY`和`NESTED TABLE`,可用于存储多个相同类型的值。 综上所述,掌握Oracle中的变量定义与使用对于编写高效、可靠的数据库应用程序至关...

    oracle处理的类型 oracle行排序

    6. 分页查询:配合LIMIT和OFFSET(或ROWNUM)可以实现分页查询,但Oracle中使用子查询或ROWNUM伪列来实现。 总结,Oracle的数据类型丰富多样,涵盖了各种常见数据的存储需求,而行排序则是数据查询时不可或缺的一...

    Oracle.10g.PLSQL编程

    2. 集合:PL/SQL中的集合允许一次性操作多个元素,如VARRAY(固定大小数组)和NESTED TABLE(嵌套表)。 六、事务处理与提交 PL/SQL支持事务处理,可以使用`COMMIT`提交事务,`ROLLBACK`回滚事务,确保数据的一致性...

    Oracle_database_11g完全参考手册

    这里的例子中,`TOOLS_VA`可以存储最多5个`VARCHAR2`类型的字符串。 ### 四、表结构与数据插入 在创建`ADDRESS`表的过程中,我们看到了标准的SQL语句用于表的创建和数据的插入。该表包含了个人的基本信息,如姓氏...

    MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组.rar

    在Java编程语言中,Oracle数据库是广泛使用的存储和管理数据的系统。本课程"MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组"着重讲解了Oracle数据库中的两种特殊数据结构——嵌套表和可变数组,它们在处理复杂...

    Oracle预定义的21个系统异常类型

    20. **SYS_INVALID_ID**:当ROWID字符串无效时触发。ROWID是Oracle中用于快速定位行的特殊标识符,无效的ROWID可能指向数据损坏或其他底层错误。 21. **TIMEOUT_ON_RESOURCE**:当Oracle在等待资源(如锁、I/O操作...

    Oracle数据类型详解

    - `TABLE OF dataType INDEX BY indexType`: 动态大小的关联数组,可以用整数或字符串作为索引。 9. **对象类型** - 自定义对象类型允许创建具有复杂结构的数据类型,由一个或多个属性组成。 10. **ROWID类型** ...

Global site tag (gtag.js) - Google Analytics