※處理集合例外
※COLLECTION_IS_NULL
DECLARE
TYPE xxx_testnested IS VARRAY(3) OF VARCHAR2(10);
xxx xxx_testnested;
BEGIN
xxx(0) := '10';
EXCEPTION
WHEN COLLECTION_IS_NULL THEN
DBMS_OUTPUT.PUT_LINE('集合未初始化!');
END;
※SUBSCRIPT_BEYOND_COUNT
DECLARE
TYPE xxx_testnested IS VARRAY(3) OF VARCHAR2(10);
xxx xxx_testnested := xxx_testnested('a', 'b');
BEGIN
xxx(3) := '10';
EXCEPTION
WHEN SUBSCRIPT_BEYOND_COUNT THEN
DBMS_OUTPUT.PUT_LINE('超過index的個數!');
END;
※SUBSCRIPT_OUTSIDE_LIMIT
DECLARE
TYPE xxx_testnested IS VARRAY(3) OF VARCHAR2(10);
xxx xxx_testnested := xxx_testnested('a', 'b');
BEGIN
xxx(4) := '10';
EXCEPTION
WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN
DBMS_OUTPUT.PUT_LINE('超過最大極限!');
END;
※VALUE_ERROR
DECLARE
TYPE xxx_testnested IS VARRAY(3) OF VARCHAR2(10);
xxx xxx_testnested := xxx_testnested('a', 'b');
BEGIN
xxx('2') := '1';
xxx('x') := '2';
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('index類型錯誤!');
END;
※NO_DATA_FOUND
DECLARE
TYPE xxx_testnested IS TABLE OF VARCHAR2(10);
xxx xxx_testnested := xxx_testnested('a', 'b');
BEGIN
xxx.DELETE(1);
DBMS_OUTPUT.PUT_LINE(xxx(1));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('找不到資料!');
END;
※FORALL
FORALL是將SQL一次性的發送到資料庫執行※一般的修改
DECLARE
TYPE emp_empno IS VARRAY(8) OF EMP.EMPNO%TYPE;
xxx emp_empno := emp_empno(7369, 7902);
BEGIN
FOR i IN xxx.FIRST..xxx.LAST LOOP
UPDATE EMP SET sal = sal * 1.2 WHERE empno = xxx(i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('修改成功!');
END;
※這樣子修改比較粍效能
※使用FORALL
DECLARE
TYPE emp_empno IS VARRAY(8) OF EMP.EMPNO%TYPE;
xxx emp_empno := emp_empno(7369, 7902);
cou number := 0;
BEGIN
FORALL i IN xxx.FIRST..xxx.LAST
UPDATE EMP SET sal = sal * 1.2 WHERE empno = xxx(i);
FOR i IN xxx.FIRST..xxx.LAST LOOP
cou := cou + SQL%BULK_ROWCOUNT(i);
END LOOP;
DBMS_OUTPUT.PUT_LINE('修改了'|| cou || '筆!');
END;
※使用SQL%BULK_ROWCOUNT(i)可取得修改的筆數
※BULK COLLECT
BULK COLLECT是從資料庫一次性的取出多條資料※取得一個欄位的集合
DECLARE TYPE emp_ename IS VARRAY(8) OF EMP.ENAME%TYPE; xxx emp_ename; BEGIN SELECT ename BULK COLLECT INTO xxx FROM EMP WHERE DEPTNO = 10; FOR i IN xxx.FIRST..xxx.LAST LOOP DBMS_OUTPUT.PUT_LINE(xxx(i)); END LOOP; END;
※取得多個欄位的集合
DECLARE TYPE emp_all IS TABLE OF EMP%ROWTYPE; xxx emp_all; BEGIN SELECT * BULK COLLECT INTO xxx FROM EMP; FOR i IN xxx.FIRST..xxx.LAST LOOP DBMS_OUTPUT.PUT_LINE(xxx(i).empno); DBMS_OUTPUT.PUT_LINE(xxx(i).ename); DBMS_OUTPUT.PUT_LINE(xxx(i).deptno || CHR(10)); END LOOP; END;
沒有留言:
張貼留言