1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
PROMPT ===================================================================
PROMPT Clean-up
PROMPT ===================================================================
DROP TABLE dept
/
DROP TYPE dept_type FORCE
/
DROP TABLE emp
/
DROP TYPE list_emp_ref_type
/
DROP TYPE emp_type
/
PROMPT ===================================================================
PROMPT Type and Tables DDL
PROMPT ===================================================================
CREATE TYPE emp_type AS OBJECT
(empno INTEGER
,ename VARCHAR2(30))
/
CREATE TYPE list_emp_ref_type AS TABLE OF REF emp_type
/
CREATE TABLE emp OF emp_type
/
CREATE TYPE dept_type AS OBJECT
(deptno INTEGER
,list_emp_ref list_emp_ref_type)
/
ALTER TYPE emp_type
ADD ATTRIBUTE
(dept_ref REF dept_type) CASCADE
/
CREATE TABLE dept OF dept_type
NESTED TABLE list_emp_ref STORE AS dept_emp
/
PROMPT ===================================================================
PROMPT Package
PROMPT ===================================================================
CREATE OR REPLACE PACKAGE emp_pkg AS
TYPE t_array_no IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
TYPE t_array_ref IS TABLE OF REF dept_type INDEX BY BINARY_INTEGER;
g_empno_null t_array_no;
g_empno t_array_no;
g_dept_ref_null t_array_ref;
g_dept_ref t_array_ref;
END;
/
PROMPT ===================================================================
PROMPT Trigger (BI)
PROMPT ===================================================================
CREATE OR REPLACE TRIGGER emp_bi1
BEFORE INSERT ON emp
FOR EACH ROW
BEGIN
emp_pkg.g_empno := emp_pkg.g_empno_null;
emp_pkg.g_dept_ref := emp_pkg.g_dept_ref_null;
END;
/
PROMPT ===================================================================
PROMPT Trigger (ARI)
PROMPT ===================================================================
CREATE OR REPLACE TRIGGER emp_ari1
AFTER INSERT ON emp
FOR EACH ROW
BEGIN
emp_pkg.g_empno (emp_pkg.g_empno.COUNT+1) := :NEW.empno;
emp_pkg.g_dept_ref(emp_pkg.g_dept_ref.COUNT+1) := :NEW.dept_ref;
END;
/
PROMPT ===================================================================
PROMPT Trigger (Table)
PROMPT ===================================================================
CREATE OR REPLACE TRIGGER emp_ai1
AFTER INSERT ON emp
BEGIN
FOR i IN 1..emp_pkg.g_empno.COUNT LOOP
INSERT INTO TABLE(SELECT list_emp_ref
FROM dept
WHERE deptno = DEREF(emp_pkg.g_dept_ref(i)).deptno)
SELECT REF(p)
FROM emp p
WHERE p.empno = emp_pkg.g_empno(i);
END LOOP;
END;
/
PROMPT ===================================================================
PROMPT Insert Testcase (3 dept, 2 empno)
PROMPT ===================================================================
SET SERVEROUTPUT ON SIZE 1000000
INSERT INTO dept (deptno,list_emp_ref) VALUES (10,list_emp_ref_type());
INSERT INTO dept (deptno,list_emp_ref) VALUES (20,list_emp_ref_type());
INSERT INTO dept (deptno,list_emp_ref) VALUES (30,list_emp_ref_type());
INSERT INTO emp (empno,ename,dept_ref) SELECT 1000,'Scott',REF(d)
FROM dept d
WHERE d.deptno = 10;
INSERT INTO emp (empno,ename,dept_ref) SELECT 2000,'Allen',REF(d)
FROM dept d
WHERE d.deptno = 20;
PROMPT ===================================================================
PROMPT Verification (employees references par le departement 10) (Scott)
PROMPT ===================================================================
SELECT DEREF(COLUMN_VALUE).ename
FROM THE(SELECT list_emp_ref
FROM dept
WHERE deptno = 10)
;
PROMPT ===================================================================
PROMPT Verification (employees references par le departement 20) (Allen)
PROMPT ===================================================================
SELECT DEREF(COLUMN_VALUE).ename
FROM THE(SELECT list_emp_ref
FROM dept
WHERE deptno = 20)
; |
Partager