Blog / People and Culture Blog
Working With Nested Table Oracle
1. Overview
This document talks about the steps to working with Oracle nested tables.Nested table is awesome feature of Oracle. You can create table inside a table, Which means one column can be treated as a table. Nested tables are faster than the parent child table relationship.
2. Technologies and Tools Used
The following technology has been used to achieve requirement
- Oracle PLSQL
3. Use Case
Assume that there is a requirement to achieve the customer needs by using nested tables .
4. Architecture
Step 1:
Create Object TYPE:
CREATE OR REPLACE TYPE emp_rec_type AS OBJECT
(
EMPNO NUMBER (4),
ENAME VARCHAR2 (10 BYTE),
JOB VARCHAR2 (9 BYTE),
MGR NUMBER (4),
HIREDATE DATE,
SAL NUMBER (7, 2),
COMM NUMBER (7, 2)
);
Create Table type :
CREATE TYPE emp_table_type AS TABLE OF emp_rec_type;
Create Table with Object type:
CREATE TABLE dept_details
( deptno NUMBER (2),
dname VARCHAR2 (14 byte),
loc VARCHAR2 (13 byte),
employees EMP_TABLE_TYPE
)nested TABLE employees store AS emp_tab_index;
emp_tab_index is nested table index
Need to create table and insert data in dept and emp tables (If not exist in db )
CREATE TABLE DEPT
(
DEPTNO NUMBER (2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2 (14),
LOC VARCHAR2 (13)
);
/
CREATE TABLE EMP
(
EMPNO NUMBER (4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2 (10),
JOB VARCHAR2 (9),
MGR NUMBER (4),
HIREDATE DATE,
SAL NUMBER (7, 2),
COMM NUMBER (7, 2),
DEPTNO NUMBER (2) CONSTRAINT FK_DEPTNO REFERENCES DEPT
);
/
INSERT INTO DEPT VALUES (10,’ACCOUNTING’,’NEW YORK’);
INSERT INTO DEPT VALUES (20,’RESEARCH’,’DALLAS’);
INSERT INTO DEPT VALUES (30,’SALES’,’CHICAGO’);
INSERT INTO DEPT VALUES (40,’OPERATIONS’,’BOSTON’);
INSERT INTO EMP VALUES (7369,’SMITH’,’CLERK’,7902,to_date(’17-12-1980′,’dd-mm-yyyy’),800,NULL,20);
INSERT INTO EMP VALUES (7499,’ALLEN’,’SALESMAN’,7698,to_date(’20-2-1981′,’dd-mm-yyyy’),1600,300,30);
INSERT INTO EMP VALUES (7521,’WARD’,’SALESMAN’,7698,to_date(’22-2-1981′,’dd-mm-yyyy’),1250,500,30);
INSERT INTO EMP VALUES (7566,’JONES’,’MANAGER’,7839,to_date(‘2-4-1981′,’dd-mm-yyyy’),2975,NULL,20);
INSERT INTO EMP VALUES (7654,’MARTIN’,’SALESMAN’,7698,to_date(’28-9-1981′,’dd-mm-yyyy’),1250,1400,30);
INSERT INTO EMP VALUES (7698,’BLAKE’,’MANAGER’,7839,to_date(‘1-5-1981′,’dd-mm-yyyy’),2850,NULL,30);
INSERT INTO EMP VALUES (7782,’CLARK’,’MANAGER’,7839,to_date(‘9-6-1981′,’dd-mm-yyyy’),2450,NULL,10);
INSERT INTO EMP VALUES (7788,’SCOTT’,’ANALYST’,7566,to_date(’13-JUL-87′,’dd-mm-rr’)-85,3000,NULL,20);
INSERT INTO EMP VALUES (7839,’KING’,’PRESIDENT’,NULL,to_date(’17-11-1981′,’dd-mm-yyyy’),5000,NULL,10);
INSERT INTO EMP VALUES (7844,’TURNER’,’SALESMAN’,7698,to_date(‘8-9-1981′,’dd-mm-yyyy’),1500,0,30);
INSERT INTO EMP VALUES (7876,’ADAMS’,’CLERK’,7788,to_date(’13-JUL-87′, ‘dd-mm-rr’)-51,1100,NULL,20);
INSERT INTO EMP VALUES (7900,’JAMES’,’CLERK’,7698,to_date(‘3-12-1981′,’dd-mm-yyyy’),950,NULL,30);
INSERT INTO EMP VALUES (7902,’FORD’,’ANALYST’,7566,to_date(‘3-12-1981′,’dd-mm-yyyy’),3000,NULL,20);
INSERT INTO EMP VALUES (7934,’MILLER’,’CLERK’,7782,to_date(’23-1-1982′,’dd-mm-yyyy’),1300,NULL,10);
/
COMMIT;
Step2:
INSERT into Nested table:
DECLARE
CURSOR c_dept
IS
SELECT deptno, dname, loc FROM dept;
TYPE l_dept_rec_type IS RECORD
( DEPTNO dept.deptno%TYPE,
DNAME dept.DNAME%TYPE,
LOC dept.LOC%TYPE
);
TYPE l_dept_tab_type IS TABLE OF l_dept_rec_type;
l_dept_no l_dept_tab_type;
CURSOR c_emp_list (P_DEPTNO DEPT.DEPTNO%TYPE)
IS
SELECT emp_rec_type (EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM)
FROM EMP
WHERE deptno = P_DEPTNO;
l_EMP_list_tab emp_table_type;
BEGIN
OPEN c_dept;
FETCH c_dept
BULK COLLECT INTO l_dept_no;
CLOSE c_dept;
FOR i IN l_dept_no.FIRST .. l_dept_no.LAST
LOOP
OPEN c_emp_list (l_dept_no (i).deptno);
FETCH c_emp_list
BULK COLLECT INTO l_EMP_list_tab;
CLOSE c_emp_list;
INSERT INTO dept_details (DEPTNO,
DNAME,
LOC,
employees)
VALUES (l_dept_no (i).deptno,
l_dept_no (i).dname,
l_dept_no (i).loc,
l_EMP_list_tab);
END LOOP;
commit;
END;
Step3:
Select Data from nested table:
SELECT ee.empno,
ee.ename,
ee.comm
FROM dept_details dd,
TABLE (employees) ee
WHERE ee.empno = 7788;
Step4:
UPDATE data in Nested Table:
UPDATE TABLE (SELECT dept_details.employees
FROM dept_details
WHERE dept_details.deptno = 10)
SET comm = 9000
WHERE empno = 7839;
Step5:
Delete from Nested table:
DELETE TABLE (SELECT dept_details.employees
FROM dept_details
WHERE dept_details.deptno = 10)
WHERE empno = 7839;
