給集合賦值可以通過INSERT, UPDATE
, FETCH
, SELECT進行賦值,或者通過過程也可以賦值,你可以通過如下的方法指定一個集合中的一個特定的值:
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;
/