DBA Data[Home] [Help]

PACKAGE BODY: SYS.PRVTPARENTCHILD

Source


1 package body PrvtParentChild
2 IS
3 
4 Function getParentIDFromModelID
5        ( modelID IN varchar2 )
6        RETURN PARENTIDARRAY
7     IS
8        parentElementID PARENTIDARRAY := PARENTIDARRAY();
9        cur0 refCursor;
10        pID RAW(200);
11        sqlStmtBase varchar2(2000);
12        sqlStmt varchar2(2000);
13        counter number(38);
14        complexID varchar2(200);
15        BEGIN
16     sqlStmtBase := 'from xdb.xdb$complex_type ct where ( sys_op_r2o(ct.xmldata.all_kid) =';
17     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
18     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.choice_kid) = ';
19     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
20     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.sequence_kid) = ';
21     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
22     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.group_kid) = ';
23     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
24     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.extension.sequence_kid) = ';
25     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
26     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.extension.choice_kid) = ';
27     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
28     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.extension.all_kid) = ';
29     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
30     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.extension.group_kid) = ';
31     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
32     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.restriction.sequence_kid) = ';
33     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
34     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.restriction.choice_kid) = ';
35     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
36     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.restriction.all_kid) = ';
37     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
38     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.restriction.group_kid) = ';
39     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
40     sqlStmtBase := sqlStmtBase || ' )';
41 
42     sqlStmt := ' select count(*) ' || sqlStmtBase;
43     EXECUTE IMMEDIATE sqlStmt INTO counter ;
44     IF (counter <> 0) THEN
45         sqlStmt := 'select ct.sys_nc_oid$ ' || sqlStmtBase;
46         EXECUTE IMMEDIATE sqlStmt INTO complexID ;
47 
48         sqlStmt := ' select hextoraw(e.xmldata.property.prop_number) from xdb.xdb$element e where sys_op_r2o(e.xmldata.property.type_ref) = ';
49         sqlStmt := sqlStmt || Dbms_Assert.Enquote_Literal(complexID);
50         sqlStmt := sqlStmt ;
51         counter := 1;
52         OPEN cur0 FOR sqlStmt;
53         LOOP
54              FETCH cur0 INTO pID;
55              EXIT WHEN cur0%NOTFOUND;
56              parentElementID.extend;
57              parentElementID(counter) := pID;
58              counter := counter + 1;
59         END LOOP;
60         CLOSE cur0;
61         RETURN parentElementID;
62     ELSE
63        RETURN NULL;
64     END IF;
65 
66 
67     RETURN parentElementID;
68     EXCEPTION
69     WHEN OTHERS THEN
70       RETURN NULL;
71     END;
72 
73 Function getParentIDFromGroupID
74        ( groupID IN varchar2 )
75        RETURN PARENTIDARRAY
76     IS
77        modelID varchar2(200);
78        complexID varchar2(200);
79        counter number(38);
80        sqlStmtBase varchar2(2000);
81        sqlStmt varchar2(2000);
82        seqKid boolean := FALSE;
83        choiceKid boolean := FALSE;
84        allKid boolean := FALSE;
85        kidClause varchar2(100);
86        elementID varchar2(200);
87        parentElementID PARENTIDARRAY := PARENTIDARRAY();
88        cur0 refCursor;
89        pID RAW(200);
90     BEGIN
91     counter := 0;
92        -- Get the reference ID from the def ID
93        select count(*) INTO counter from xdb.xdb$group_ref rg, xdb.xdb$group_def dg where ref(dg) = rg.xmldata.groupref_ref and dg.sys_nc_oid$= groupID;
94        IF (counter <> 0) THEN
95           select rg.sys_nc_oid$ INTO elementID from xdb.xdb$group_ref rg, xdb.xdb$group_def dg where ref(dg) = rg.xmldata.groupref_ref and dg.sys_nc_oid$= groupID;
96        ELSE
97           RETURN NULL;
98        END IF;
99        -- choice
100       sqlStmtBase := 'from xdb.xdb$choice_model sm, table(sm.xmldata.groups) t where sys_op_r2o(t.column_value) = ';
101       sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(elementID);
102       sqlStmt := ' select count(*) ' || sqlStmtBase;
103        EXECUTE IMMEDIATE sqlStmt INTO counter ;
104        IF ( counter <> 0 ) THEN
105            sqlStmt := ' select sm.sys_nc_oid$ ' || sqlStmtBase;
106            EXECUTE IMMEDIATE sqlStmt INTO modelID ;
107            choiceKid := TRUE;
108        ELSE
109       sqlStmtBase := 'from xdb.xdb$sequence_model sm, table(sm.xmldata.groups) t where sys_op_r2o(t.column_value) = ';
110       sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(elementID);
111       sqlStmt := ' select count(*) ' || sqlStmtBase;
112        EXECUTE IMMEDIATE sqlStmt INTO counter ;
113           IF ( counter <> 0 ) THEN
114 
115            sqlStmt := ' select sm.sys_nc_oid$ ' || sqlStmtBase;
116            EXECUTE IMMEDIATE sqlStmt INTO modelID ;
117             seqKid := TRUE;
118           ELSE
119       sqlStmtBase := 'from xdb.xdb$all_model sm, table(sm.xmldata.groups) t where sys_op_r2o(t.column_value) = ';
120       sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(elementID);
121       sqlStmt := ' select count(*) ' || sqlStmtBase;
122             IF ( counter <> 0 ) THEN
123 
124            sqlStmt := ' select sm.sys_nc_oid$ ' || sqlStmtBase;
125            EXECUTE IMMEDIATE sqlStmt INTO modelID ;
126                 allKid := TRUE;
127             ELSE
128                -- could be a direct child
129     sqlStmtBase := 'from xdb.xdb$complex_type ct where ( ';
130     sqlStmtBase := sqlStmtBase || '  sys_op_r2o(ct.xmldata.group_kid) = ';
131     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(elementID);
132     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.extension.group_kid) = ';
133     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(elementID);
134     sqlStmtBase := sqlStmtBase || ' OR sys_op_r2o(ct.xmldata.complexcontent.restriction.group_kid) = ';
135     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(elementID);
136     sqlStmtBase := sqlStmtBase || ' )';
137 
138     sqlStmt := ' select count(*) ' || sqlStmtBase;
139     DBMS_OUTPUT.PUT_LINE ( sqlStmt);
140     EXECUTE IMMEDIATE sqlStmt INTO counter ;
141     IF (counter <> 0) THEN
142         sqlStmt := 'select ct.sys_nc_oid$ ' || sqlStmtBase;
143         EXECUTE IMMEDIATE sqlStmt INTO complexID ;
144 
145         sqlStmt := ' select hextoraw(e.xmldata.property.prop_number) from xdb.xdb$element e where sys_op_r2o(e.xmldata.property.type_ref) = ';
146         sqlStmt := sqlStmt || Dbms_Assert.Enquote_Literal(complexID);
147         sqlStmt := sqlStmt ;
148 
149         counter := 1;
150         OPEN cur0 FOR sqlStmt;
151         LOOP
152              FETCH cur0 INTO pID;
153              EXIT WHEN cur0%NOTFOUND;
154              parentElementID.extend;
155              parentElementID(counter) := pID;
156              counter := counter + 1;
157         END LOOP;
158         CLOSE cur0;
159         RETURN parentElementID;
160     ELSE
161        RETURN NULL;
162     END IF;
163             END IF;
164         END IF;
165        END IF;
166 
167        sqlStmtBase := '';
168        WHILE TRUE
169        LOOP
170 
171             IF (seqKid = TRUE) THEN kidClause := 'sequence_kids';
172             ELSIF (choiceKid = TRUE) THEN kidClause := 'choice_kids';
173             ELSE RETURN getParentIDFromModelID(modelID);
174             END IF;
175 
176             counter := 0;
177             sqlStmtBase := 'table(sm.xmldata.' || kidClause || ')t where sys_op_r2o(t.column_value) = ';
178             sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
179             sqlStmt := 'select count(*) from xdb.xdb$choice_model sm, ' || sqlStmtBase;
180             EXECUTE IMMEDIATE sqlStmt INTO counter  ;
181             IF (counter <> 0) THEN
182               sqlStmt := 'select sm.sys_nc_oid$ from xdb.xdb$choice_model sm, ' || sqlStmtBase;
183               EXECUTE IMMEDIATE sqlStmt INTO modelID ;
184               choicekid := TRUE; seqKid := FALSE; allKid := FALSE;
185             ELSE
186               sqlStmt := 'select count(*)   from xdb.xdb$sequence_model sm, ' || sqlStmtBase;
187               EXECUTE IMMEDIATE sqlStmt INTO counter;
188               IF (counter <> 0) THEN
189                  sqlStmt := 'select sm.sys_nc_oid$  from xdb.xdb$sequence_model sm, ' || sqlStmtBase;
190                  EXECUTE IMMEDIATE sqlStmt INTO modelID ;
191                  choicekid := FALSE; seqKid := TRUE; allKid := FALSE;
192               ELSE
193                  sqlStmt := 'select count(*)  from xdb.xdb$all_model sm, ' || sqlStmtBase;
194                  EXECUTE IMMEDIATE sqlStmt INTO counter ;
195                  IF (counter <> 0) THEN
196                     sqlStmt := 'select sm.sys_nc_oid$   from xdb.xdb$all_model sm, ' || sqlStmtBase;
197                     EXECUTE IMMEDIATE sqlStmt INTO modelID;
198                     choicekid := FALSE; seqKid := FALSE; allKid := TRUE;
199                  ELSE -- group
200                        RETURN getParentIDFromModelID(modelID);
201                  END IF;
202               END IF;
203            END IF;
204        END LOOP;
205 
206     RETURN NULL;
207     EXCEPTION
208     WHEN OTHERS THEN
209       RETURN NULL;
210 END;
211 
212 Function getParentID
213        ( elementID IN varchar2 )
214        RETURN PARENTIDARRAY
215     IS
216        modelID varchar2(200);
217        complexID varchar2(200);
218        counter number(38);
219        sqlStmtBase varchar2(2000);
220        sqlStmt varchar2(2000);
221 
222        seqKid boolean := FALSE;
223        choiceKid boolean := FALSE;
224        allKid boolean := FALSE;
225        kidClause varchar2(100);
226     BEGIN
227     counter := 0;
228        -- choice
229        select count(*) INTO counter from xdb.xdb$element e, xdb.xdb$choice_model sm,
230        table(sm.xmldata.elements)t where ref(e) = t.column_value and e.xmldata.property.prop_number = elementID ;
231        IF ( counter <> 0 ) THEN
232            select sm.sys_nc_oid$ INTO modelID from xdb.xdb$element e, xdb.xdb$choice_model sm, table(sm.xmldata.elements)t where
233            ref(e) = t.column_value and e.xmldata.property.prop_number =  elementID ;
234            choiceKid := TRUE;
235        ELSE
236           -- sequence
237           select count(*) INTO counter from xdb.xdb$element e, xdb.xdb$sequence_model sm,
238           table(sm.xmldata.elements)t where ref(e) = t.column_value and e.xmldata.property.prop_number = elementID ;
239           IF ( counter <> 0 ) THEN
240             select sm.sys_nc_oid$ INTO modelID from xdb.xdb$element e, xdb.xdb$sequence_model sm, table(sm.xmldata.elements)t where
241             ref(e) = t.column_value and e.xmldata.property.prop_number =  elementID ;
242             seqKid := TRUE;
243           ELSE
244             -- all
245             select count(*) INTO counter from xdb.xdb$element e, xdb.xdb$all_model sm,
246             table(sm.xmldata.elements)t where ref(e) = t.column_value and e.xmldata.property.prop_number =  elementID ;
247             IF ( counter <> 0 ) THEN
248                 select sm.sys_nc_oid$ INTO modelID from xdb.xdb$element e, xdb.xdb$all_model sm, table(sm.xmldata.elements)t where
249                 ref(e) = t.column_value and e.xmldata.property.prop_number =  elementID ;
250                 allKid := TRUE;
251             ELSE
252                RETURN NULL;
253             END IF;
254         END IF;
255        END IF;
256 
257        WHILE TRUE
258        LOOP
259             IF (seqKid = TRUE) THEN kidClause := 'sequence_kids';
260             ELSIF (choiceKid = TRUE) THEN kidClause := 'choice_kids';
261             ELSE RETURN getParentIDFromModelID(modelID);
262             END IF;
263 
264             counter := 0;
265             sqlStmtBase := 'table(sm.xmldata.' || kidClause || ')t where sys_op_r2o(t.column_value) = ';
266             sqlStmtBase := sqlStmtBase ||  Dbms_Assert.Enquote_Literal(modelID);
267             sqlStmt := 'select count(*) from xdb.xdb$choice_model sm, ' || sqlStmtBase;
268             EXECUTE IMMEDIATE sqlStmt INTO counter  ;
269             IF (counter <> 0) THEN
270               sqlStmt := 'select sm.sys_nc_oid$ from xdb.xdb$choice_model sm, ' || sqlStmtBase;
271               EXECUTE IMMEDIATE sqlStmt INTO modelID ;
272               choicekid := TRUE; seqKid := FALSE; allKid := FALSE;
273             ELSE
274               sqlStmt := 'select count(*)   from xdb.xdb$sequence_model sm, ' || sqlStmtBase;
275               EXECUTE IMMEDIATE sqlStmt INTO counter;
276               IF (counter <> 0) THEN
277                  sqlStmt := 'select sm.sys_nc_oid$  from xdb.xdb$sequence_model sm, ' || sqlStmtBase;
278                  EXECUTE IMMEDIATE sqlStmt INTO modelID ;
279                  choicekid := FALSE; seqKid := TRUE; allKid := FALSE;
280               ELSE
281                  sqlStmt := 'select count(*)  from xdb.xdb$all_model sm, ' || sqlStmtBase;
282                  EXECUTE IMMEDIATE sqlStmt INTO counter ;
283                  IF (counter <> 0) THEN
284                     sqlStmt := 'select sm.sys_nc_oid$   from xdb.xdb$all_model sm, ' || sqlStmtBase;
285                     EXECUTE IMMEDIATE sqlStmt INTO modelID;
286                     choicekid := FALSE; seqKid := FALSE; allKid := TRUE;
287                  ELSE -- group
288                     IF (seqKid = TRUE) THEN kidClause := 'sequence_kid';
289                     ELSIF (choiceKid = TRUE) THEN kidClause := 'choice_kid';
290                     ELSE kidClause := 'all_kid';
291                     END IF;
292                     sqlStmtBase := '  from xdb.xdb$group_def sm where sys_op_r2o(sm.xmldata. ' || kidClause || ') =';
293                     sqlStmtBase := sqlStmtBase || Dbms_Assert.Enquote_Literal(modelID);
294                     sqlStmt := 'select count(*) ' || sqlStmtBase;
295                     EXECUTE IMMEDIATE sqlStmt INTO counter ;
296                     IF (counter <> 0) THEN
297                        sqlStmt := 'select sm.sys_nc_oid$ ' || sqlStmtBase;
298                        EXECUTE IMMEDIATE sqlStmt INTO modelID;
299                        RETURN getParentIDFromGroupID(modelID);
300                     ELSE
301                        RETURN getParentIDFromModelID(modelID);
302                     END IF;
303                  END IF;
304               END IF;
305            END IF;
306        END LOOP;
307 
308     RETURN NULL;
309     EXCEPTION
310     WHEN OTHERS THEN
311        RETURN NULL;
312 END;
313 
314   Function sizeArray ( elementID IN varchar2 )
315        RETURN NUMBER
316   IS
317    p parentidarray;
318   BEGIN
319     p := PrvtParentChild.getparentID(elementID);
320     IF (p IS NULL) THEN
321        RETURN 0;
322     ELSE
323        RETURN p.count;
324     END IF;
325   END;
326 END;