Oracle的collection二维操作

来源:互联网 发布:电脑系统优化软件 编辑:程序博客网 时间:2024/05/23 23:59
Oracle collection 是PL SQL开发中会用到一个对象,它表示一组有序的元素组成,一个组中元素的类型必须保持一致。它分成3 类,分别为Associative arrays(也称index-by tables)、Nested tables 、Varrays。
第一个Associative arrays,可看成数据字典,有key,value两列。key值可以是任意数字和字符串,value值可以是任意对象、甚至是collection类型的对象。
第二个Nested tables,可看着一维数组,使用数字编号可以依次操作每个数组元素。
第三个Varrays,可看着预先定义好长度的一维数组,使用数字编号可以依次操作每个数组元素。

这三类的定义和初始化的方法如下:
type typ_dict is table of varchar2(100) index by varchar2(10);  
type typ_array is table of integer;  
type typ_varray is varray(3) of varchar2(10);  
v_dict   typ_dict;  
v_array  typ_array := typ_array();  
v_varray typ_varray := typ_varray(null, null, null);  

这些类除掉普通的数据类型外,还有遇到object类型。这点和面向对象编程的语言有些相似,但功能没那么强大。
例如定义一个有多个VARCHAR2组成的对象。
CREATE OR REPLACE TYPE obj_food AS OBJECT (
     name VARCHAR2( 100 )
   , food_group VARCHAR2( 100 )
   , color VARCHAR2( 100 )
  );

CREATE TYPE typ_array_food IS table OF obj_food;

l_food      typ_array_food := typ_array_food();

示例一,
DECLARE
  l_food      typ_array_food := typ_array_food();
BEGIN
  l_food.extend(3);
  l_food(1) := obj_food('Scrambled Eggs', 'Protein', 'Yellow');
  l_food(2) := obj_food('Deluxe Salad', 'Vegetables', 'Mostly Green');
  l_food(3) := obj_food('Tofu and Rice', 'Protein', 'White');

  dbms_output.put_line('food(1)=' || l_food(1).name);
 
    for j in 1 .. l_food.count loop
      dbms_output.put_line('food('||j||')=' || l_food(j).name);        
    end loop;    

END;

结果如下:
SQL> set serveroutput on
SQL> /
 
food(1)=Scrambled Eggs
food(1)=Scrambled Eggs
food(2)=Deluxe Salad
food(3)=Tofu and Rice
 
PL/SQL procedure successfully completed


这个例子是一维数组的例子,如果我们要使用二维数组,又该如何定义?

前提是先在数据库中定义一个二维数组的类型
CREATE TYPE typ_array_foods IS table OF typ_array_food;
然后开发示例程序,如下:
DECLARE
  l_food      typ_array_food := typ_array_food();
  l_foods     typ_array_foods := typ_array_foods();
BEGIN
  l_food.extend(3);
  l_food(1) := obj_food('Scrambled Eggs', 'Protein', 'Yellow');
  l_food(2) := obj_food('Deluxe Salad', 'Vegetables', 'Mostly Green');
  l_food(3) := obj_food('Tofu and Rice', 'Protein', 'White');

  l_foods.extend(1);
  l_foods(1) := l_food;

  dbms_output.put_line('foods(1,1)=' || l_foods(1)(1).name);
 
  l_foods.extend(1);
  l_foods(2) := l_food;

  l_food.trim(l_food.count);
  for i in 1 .. 2 loop
    l_food.extend(1);
    l_food(i) := obj_food('Scrambled Eggs '||i, 'Protein', 'Yellow');
  end loop;

  l_foods.extend(1);
  l_foods(3) := l_food;

  for i in 1 .. l_foods.count loop
    for j in 1 .. l_foods(i).count loop
      dbms_output.put_line('foods('||i||','||j||')=' || l_foods(i)(j).name);        
    end loop;  
  end loop;

END;


通过collection的trim、extend等操作,我们很容易理解它。在现实开发中,多数情况下使用的类型是Nested tables。

原创粉丝点击