Reputation: 211
I have requirement where i need to append data to already populated object type. Data to be appended, depends on data which is already populated in object type. Can anyone please help me with this.
I tried below approach which is working fine. But I want to know if there is better way of doing it.
Also i need to assign uniq id to each record populated (for which I am using rownum pseudo column )
Below is code that i tried which is working fine. Please note that, in actual requirement, i have many attributes in object type and many filters and joins while populating object type. Below is just simplified code to know the solution.
-- table EMPLOYEE
CREATE TABLE EMPLOYEE
(
ENAME VARCHAR2(128) ,
EADDRESS VARCHAR2(200) ,
ESTATUS VARCHAR2(11) ,
PARENT_NAME VARCHAR2(128)
);
-- Object
CREATE OR REPLACE TYPE OBJ_USER_ACTIVITIES AS OBJECT
(
UNIQ_ID NUMBER(9) ,
EMPNAME VARCHAR2(128) ,
ADDRESS VARCHAR2(200) ,
STATUS VARCHAR2(11) ,
PARENT_NAME VARCHAR2(128)
);
-- Type
CREATE OR REPLACE TYPE TAB_USER_ACTIVITIES IS TABLE OF OBJ_USER_ACTIVITIES;
-- Procedure
CREATE OR REPLACE PROCEDURE Test_Tickets
IS
TEMP_USER_ACTIVITIES_1 TAB_USER_ACTIVITIES := TAB_USER_ACTIVITIES();
TEMP_USER_ACTIVITIES_2 TAB_USER_ACTIVITIES := TAB_USER_ACTIVITIES();
TEMP_USER_ACTIVITIES_FINAL TAB_USER_ACTIVITIES := TAB_USER_ACTIVITIES();
i integer;
BEGIN
-- First resultset
SELECT OBJ_USER_ACTIVITIES
(ROWNUM, EMPNAME, ADDRESS, STATUS, PARENT_NAME)
BULK COLLECT INTO TEMP_USER_ACTIVITIES_1
FROM
(
SELECT ENAME AS EMPNAME, EADDRESS AS ADDRESS, ESTATUS AS STATUS, PARENT_NAME
FROM EMPLOYEE
--WHERE SOME FILTER
);
i := TEMP_USER_ACTIVITIES_1.COUNT;
-- Build second resultset depending on valus of first resultset
SELECT OBJ_USER_ACTIVITIES
( i + ROWNUM, EMPNAME, ADDRESS, STATUS, PARENT_NAME )
BULK COLLECT INTO TEMP_USER_ACTIVITIES_2
FROM
(
SELECT ENAME AS EMPNAME, EADDRESS AS ADDRESS, ESTATUS AS STATUS, PARENT_NAME
FROM EMPLOYEE
WHERE ENAME IN ( SELECT PARENT_NAME FROM TABLE(TEMP_USER_ACTIVITIES_1) WHERE PARENT_NAME IS NOT NULL )
);
-- FINAL resultset combining above two resulset
SELECT OBJ_USER_ACTIVITIES
( UNIQ_ID, EMPNAME, ADDRESS, STATUS, PARENT_NAME )
BULK COLLECT INTO TEMP_USER_ACTIVITIES_FINAL
FROM
(
SELECT UNIQ_ID, EMPNAME, ADDRESS, STATUS, PARENT_NAME
FROM TABLE(TEMP_USER_ACTIVITIES_1)
UNION
SELECT UNIQ_ID, EMPNAME, ADDRESS, STATUS, PARENT_NAME
FROM TABLE(TEMP_USER_ACTIVITIES_2)
);
END;
Upvotes: 0
Views: 218
Reputation: 11596
There is a great set of nested table operators available to you for this. HEre is an example (with some of the other operators commented out just for completeness)
SQL> create or replace type MY_OBJ as object ( x int, y int );
2 /
Type created.
SQL>
SQL> create or replace type MY_OBJ_LIST as table of my_obj
2 /
Type created.
SQL>
SQL> set serverout on
SQL> declare
2 t1 my_obj_list :=
3 my_obj_list(
4 my_obj(1,2),
5 my_obj(3,4),
6 my_obj(5,6));
7
8 t2 my_obj_list :=
9 my_obj_list(
10 my_obj(7,8),
11 my_obj(9,10),
12 my_obj(11,12));
13
14 t3 my_obj_list := my_obj_list();
15 begin
16 t3 := t1 MULTISET UNION t2;
17
18 dbms_output.put_line('I now have '||t3.count||' elements');
19
20 -- t3 := t1 multiset union t2;
21 -- t3 := t1 multiset union distinct t2;
22 -- t3 := t1 multiset intersect t2;
23 -- t3 := t1 multiset intersect distinct t2;
24 -- t3 := set(t2);
25 -- t3 := t1 multiset except t2;
26 -- t3 := t1 multiset except distinct t2;
27
28 end;
29 /
I now have 6 elements
PL/SQL procedure successfully completed.
Upvotes: 1