首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Oracle PL/SQL -如何创建简单的数组变量?

Oracle PL/SQL -如何创建简单的数组变量?
EN

Stack Overflow用户
提问于 2011-08-10 22:41:01
回答 6查看 517.7K关注 0票数 137

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

代码语言:javascript
复制
string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};

编辑: Oracle: 9i

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-10 22:48:47

您可以对固定大小的数组使用VARRAY:

代码语言:javascript
复制
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;

或无界数组的表:

代码语言:javascript
复制
...
   type array_t is table of varchar2(10);
...

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

使用这两种方法中的任何一种,在添加元素之前都需要初始化和扩展集合:

代码语言:javascript
复制
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。

票数 258
EN

Stack Overflow用户

发布于 2011-08-10 23:58:32

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

代码语言:javascript
复制
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表),因为它们是内存中的数组。

代码语言:javascript
复制
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;

关联数组可以包含任何记录类型的组成。

希望对你有帮助,奥利。

票数 65
EN

Stack Overflow用户

发布于 2016-11-14 06:07:17

您还可以使用oracle defined collection

代码语言:javascript
复制
DECLARE 
  arrayvalues sys.odcivarchar2list;
BEGIN
  arrayvalues := sys.odcivarchar2list('Matt','Joanne','Robert');
  FOR x IN ( SELECT m.column_value m_value
               FROM table(arrayvalues) m )
  LOOP
    dbms_output.put_line (x.m_value||' is a good pal');
  END LOOP;
END;

我会使用内存中的数组。但通过uziberia提出的.COUNT改进:

代码语言:javascript
复制
DECLARE
  TYPE t_people IS TABLE OF varchar2(10) INDEX BY PLS_INTEGER;
  arrayvalues t_people;
BEGIN
  SELECT *
   BULK COLLECT INTO arrayvalues
   FROM (select 'Matt' m_value from dual union all
         select 'Joanne'       from dual union all
         select 'Robert'       from dual
    )
  ;
  --
  FOR i IN 1 .. arrayvalues.COUNT
  LOOP
    dbms_output.put_line(arrayvalues(i)||' is my friend');
  END LOOP;
END;

另一个解决方案是使用哈希图,就像@Jchomel做的here一样。

NB:

使用Oracle12c,您可以使用even query arrays directly now

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7012625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档