如何创建一个简单的数组变量?

我想创建一个可以在我的PL / SQL代码中使用的内存数组变量。 我在Oracle PL / SQL中找不到任何使用纯内存的集合,它们似乎都与表关联。 我期待在我的PL / SQL(C#语法)中做这样的事情:

string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};

编辑: Oracle:9i


您可以将VARRAY用于固定大小的数组:

declare
   type array_t is varray(3) of varchar2(10);
   array array_t := array_t('Matt', 'Joanne', 'Robert');
begin
   for i in 1..array.count loop
       dbms_output.put_line(array(i));
   end loop;
end;

或无限数组的TABLE:

...
   type array_t is table of varchar2(10);
...

这里的“表”这个词与数据库表无关,令人困惑。 这两种方法都会创建内存数组。

使用这两种方法之一,您需要在添加元素之前对集合进行初始化和扩展:

declare
   type array_t is varray(3) of varchar2(10);
   array array_t := array_t(); -- Initialise it
begin
   for i in 1..3 loop
      array.extend(); -- Extend it
      array(i) := 'x';
   end loop;
end;

第一个索引是1而不是0。


您可以声明一个DBMS_SQL.VARCHAR2_TABLE来存放由BINARY_INTEGER索引的内存中变量长度数组:

DECLARE
   name_array dbms_sql.varchar2_table;
BEGIN
   name_array(1) := 'Tim';
   name_array(2) := 'Daisy';
   name_array(3) := 'Mike';
   name_array(4) := 'Marsha';
   --
   FOR i IN name_array.FIRST .. name_array.LAST
   LOOP
      -- Do something
   END LOOP;
END;

您可以使用关联数组(以前称为PL / SQL表),因为它们是内存数组。

DECLARE
   TYPE employee_arraytype IS TABLE OF employee%ROWTYPE
        INDEX BY PLS_INTEGER;
   employee_array employee_arraytype;
BEGIN
   SELECT *
     BULK COLLECT INTO employee_array
     FROM employee
    WHERE department = 10;
   --
   FOR i IN employee_array.FIRST .. employee_array.LAST
   LOOP
      -- Do something
   END LOOP;
END;

关联数组可以容纳任何组成的记录类型。

希望它可以帮助,Ollie。


另一个解决方案是使用Oracle集合作为Hashmap:

declare 
-- create a type for your "Array" - it can be of any kind, record might be useful
  type hash_map is table of varchar2(1000) index by varchar2(30);
  my_hmap hash_map ;
-- i will be your iterator: it must be of the index's type
  i varchar2(30);
begin
  my_hmap('a') := 'apple';
  my_hmap('b') := 'box';
  my_hmap('c') := 'crow';
-- then how you use it:

  dbms_output.put_line (my_hmap('c')) ;

-- or to loop on every element - it's a "collection"
  i := my_hmap.FIRST;

  while (i is not null)  loop     
    dbms_output.put_line(my_hmap(i));      
    i := my_hmap.NEXT(i);
  end loop;

end;
链接地址: http://www.djcxy.com/p/83733.html

上一篇: How to create a simple array variable?

下一篇: relationship (ER) diagram using Oracle SQL Developer