plsql developer教學 - Oracle PL / SQL-如何創建一個簡單的數組變量?




sql教學 pl/sql (5)

您可以將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。

我想創建一個可以在我的PL / SQL代碼中使用的內存數組變量。 我在Oracle PL / SQL中找不到任何使用純內存的集合,它們似乎都與表關聯。 我期待在我的PL / SQL(C#語法)中做這樣的事情:

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

編輯: Oracle:9i


另一個解決方案是使用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;

您可以聲明一個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 defined collection

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;

我會使用內存數組。 但是隨著.COUNT提出的.COUNT改進:

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;

另一個解決方案是在here使用像@Jchomel這樣的HashMap

注意:

使用Oracle 12c,您甚至可以直接查詢數組 !


不要檢查是否存在。 如有必要,嘗試刪除並捕獲異常...

declare
index_not_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(index_not_exists, -1418);
begin

    execute immediate 'drop index foo';
exception
    when index_not_exists then null;
end;
/




oracle plsql oracle9i