oracle 集合賦值

給集合賦值可以通過INSERT, UPDATE, FETCHSELECT進行賦值,或者通過過程也可以賦值,你可以通過如下的方法指定一個集合中的一個特定的值:

collection_name(subscript) := expression;

我們來看看oracle官方文檔的例子:

1.數據類型的兼容

DECLARE
   TYPE last_name_typ IS VARRAY(3) OF VARCHAR2(64);
   TYPE surname_typ IS VARRAY(3) OF VARCHAR2(64);
-- 兩個有相同的類型
   group1 last_name_typ := last_name_typ('Jones','Wong','Marceau');
   group2 last_name_typ := last_name_typ('Klein','Patsos','Singh');
-- 下面這個定義雖然類似,但是確不是相同的類型
   group3 surname_typ := surname_typ('Trevisi','Macleod','Marquez');
BEGIN
-- 這個賦值可以完成,
   group1 := group2;
-- 下面這個因爲是不同的類型所以會報錯
--   group3 := group2; -- raises an error
END;
/

2.使用set操作符賦值(比較重要)

DECLARE
  TYPE nested_typ IS TABLE OF NUMBER;
  nt1 nested_typ := nested_typ(1,2,3);
  nt2 nested_typ := nested_typ(3,2,1);
  nt3 nested_typ := nested_typ(2,3,1,3);
  nt4 nested_typ := nested_typ(1,2,4);
  answer nested_typ;
  PROCEDURE print_nested_table(the_nt nested_typ) IS
     output VARCHAR2(128);
  BEGIN
     IF the_nt IS NULL THEN
        DBMS_OUTPUT.PUT_LINE('Results: <NULL>');
        RETURN;
     END IF;
     IF the_nt.COUNT = 0 THEN
        DBMS_OUTPUT.PUT_LINE('Results: empty set');
        RETURN;
     END IF;
     FOR i IN the_nt.FIRST .. the_nt.LAST
     LOOP
        output := output || the_nt(i) || ' ';
     END LOOP;
     DBMS_OUTPUT.PUT_LINE('Results: ' || output);
  END;
BEGIN
  answer := nt1 MULTISET UNION nt4; -- (1,2,3,1,2,4) 類似於UNION  ALL
  print_nested_table(answer);
  answer := nt1 MULTISET UNION nt3; -- (1,2,3,2,3,1,3)
  print_nested_table(answer);
  answer := nt1 MULTISET UNION DISTINCT nt3; -- (1,2,3) 類似於UNION
  print_nested_table(answer);
  answer := nt2 MULTISET INTERSECT nt3; -- (3,2,1)  兩個集合的交集
  print_nested_table(answer);
  answer := nt2 MULTISET INTERSECT DISTINCT nt3; -- (3,2,1)  兩個集合的交集 值是不重複的
  print_nested_table(answer);
  answer := SET(nt3); -- (2,3,1) --不能有重複的值
  print_nested_table(answer);
  answer := nt3 MULTISET EXCEPT nt2; -- (3)  集合的差集
  print_nested_table(answer);
  answer := nt3 MULTISET EXCEPT DISTINCT nt2; -- ()  去掉集合中重複值後,集合的差集
  print_nested_table(answer);
END;
/

3.使用複雜集合類型給VARRAY賦值

DECLARE
  TYPE emp_name_rec is RECORD (
    firstname    employees.first_name%TYPE,
    lastname     employees.last_name%TYPE,
    hiredate     employees.hire_date%TYPE
    );
    
-- Array type that can hold information 10 employees
   TYPE EmpList_arr IS VARRAY(10) OF emp_name_rec;
   SeniorSalespeople EmpList_arr;
   
-- Declare a cursor to select a subset of columns.
   CURSOR c1 IS SELECT first_name, last_name, hire_date FROM employees;
   Type NameSet IS TABLE OF c1%ROWTYPE;
   SeniorTen NameSet;
   EndCounter NUMBER := 10;
   
BEGIN
  SeniorSalespeople := EmpList_arr(); --集合的初始化,初始化一個空的集合
  SELECT first_name, last_name, hire_date BULK COLLECT INTO SeniorTen FROM
     employees WHERE job_id = 'SA_REP' ORDER BY hire_date;
  IF SeniorTen.LAST > 0 THEN
    IF SeniorTen.LAST < 10 THEN EndCounter := SeniorTen.LAST; 
    END IF;
    FOR i in 1..EndCounter LOOP
      SeniorSalespeople.EXTEND(1); -- 使用EXTEND新增一個集合中的值
      SeniorSalespeople(i) := SeniorTen(i);
      DBMS_OUTPUT.PUT_LINE(SeniorSalespeople(i).lastname || ', ' 
       || SeniorSalespeople(i).firstname || ', ' ||
       SeniorSalespeople(i).hiredate);
    END LOOP;
  END IF;
END;
/



 


 

 

 

 

 

發佈了26 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章