DBA Data[Home] [Help]

PACKAGE BODY: APPS.EPS

Source


1 PACKAGE BODY EPS AS
2 /* $Header: epsuserb.pls 115.2 2002/11/08 19:08:18 dkang ship $ */
3   --
4   --  Get error text
5   --
6   FUNCTION  getErrorMsg(status  NUMBER)
7             RETURN VARCHAR2 IS
8     msg  VARCHAR2(2000) := '' ;
9   BEGIN
10 
11     IF xrbGetMessage(status, msg, 2000) = 0 THEN
12       msg := 'Unknown error code or message file missing' ;
13     END IF;
14     RETURN msg ;
15 
16   END getErrorMsg ;
17 
18   --
19   -- Query express
20   --
21   FUNCTION query (express_server VARCHAR2,
22                   qry0  VARCHAR2,
23                   qry1  VARCHAR2,
24                   qry2  VARCHAR2,
25                   qry3  VARCHAR2,
26                   qry4  VARCHAR2,
27                   qry5  VARCHAR2,
28                   qry6  VARCHAR2,
29                   qry7  VARCHAR2,
30                   qry8  VARCHAR2,
31                   qry9  VARCHAR2) RETURN EPS_express_list_t AS
32     report_id NUMBER := 0;
33     t     EPS_express_list_t := EPS_express_list_t();
34     i     NUMBER := 1;
35     status NUMBER := 0;
36     map   VARCHAR2(100)  := '';
37     buffer VARCHAR2(4000) := '';
38     nrows NUMBER := 0;
39     ncols NUMBER := 0;
40   BEGIN
41     --
42     -- Generate a unique id for the query
43     --
44     SELECT EPS_report_id.NEXTVAL
45       INTO report_id
46       FROM DUAL;
47 
48     --
49     -- Prepare the query
50     --
51     status := XPPrepare(report_id, express_server, qry0) ;
52     IF status <> 0 THEN
53       DECLARE
54          msg  VARCHAR2(2000);
55          BEGIN
56              msg := getErrorMsg(status) ;
57              RAISE_APPLICATION_ERROR(-status, msg);
58          END;
59       RETURN t;
60     END IF;
61 
62     --
63     -- Fetch from the query
64     --
65     DECLARE
66       buffer_size NUMBER := 4000;
67       buffer_ptr  NUMBER := 0;
68       obj         EPS_express_t := EPS_express_t(NULL,NULL,NULL,NULL,NULL,
69                                                      NULL,NULL,NULL,NULL,NULL,
70                                                      NULL,NULL,NULL,NULL,NULL,
71                                                      NULL,NULL,NULL,NULL,NULL,
72                                                      NULL,NULL,NULL,NULL,NULL,
73                                                      NULL,NULL,NULL,NULL,NULL,
74                                                      NULL,NULL,NULL,NULL,NULL,
75                                                      NULL,NULL,NULL,NULL,NULL);
76       curr_row    NUMBER := 0;
77     BEGIN
78       LOOP
79         --
80         -- Fetch N Rows
81         --
82         status := XPFetchN(report_id, buffer_size, buffer, ncols, nrows);
83 
84         --
85         -- Put the rows into the table of objects
86         --
87         IF (status = 1403 OR status = 0) AND
88             nrows > 0
89         THEN
90           --
91           -- Parse each row
92           --
93           curr_row   := 1;
94           buffer_ptr := 1;
95           t.EXTEND(nrows);
96 
97           LOOP
98             t(i) := ParseRow(buffer,buffer_size,buffer_ptr,ncols,nrows);
99             i := i + 1;
100             curr_row := curr_row + 1;
101 
102             IF curr_row > nrows THEN
103               EXIT; -- LOOP
104             END IF;
105           END LOOP;
106         ELSE
107           DECLARE
108             msg  VARCHAR2(2000);
109           BEGIN
110             IF status = 1403 THEN
111               EXIT ;     -- LOOP
112             END IF ;
113             msg := getErrorMsg(status);
114             RAISE_APPLICATION_ERROR(-status, msg);
115           END;
116         END IF;
117 
118         IF status = 1403 THEN
119           EXIT; -- LOOP
120         END IF;
121       END LOOP;
122     EXCEPTION
123       WHEN NO_DATA_FOUND THEN
124         NULL;
125     END;
126 
127     --
128     -- Return the results
129     --
130     RETURN t;
131   END;
132 
133   --
134   -- Express DLL callout functions
135   --
136   --
137   -- OCI Callout - XPPrepare - Prepare an Express Query
138   --
139   FUNCTION XPPrepare(in_report_id      IN NATURAL,
140                      in_express_server IN VARCHAR2,
141                      in_qry            IN VARCHAR2)
142                     RETURN NATURAL AS
143   EXTERNAL
144   LIBRARY EPS_lib
145   NAME "XPPrepare"
146   LANGUAGE C
147   WITH CONTEXT;
148 
149   --
150   -- OCI Callout - XPFetch - Fetch a row from an Express Query
151   --
152   -- Return 0 SUCCESS else Exception return code if fail
153   --
154   FUNCTION XPFetch(in_report_id NATURAL,
155                    c0           IN OUT NOCOPY VARCHAR2,
156                    c1           IN OUT NOCOPY VARCHAR2,
157                    c2           IN OUT NOCOPY VARCHAR2,
158                    c3           IN OUT NOCOPY VARCHAR2,
159                    c4           IN OUT NOCOPY VARCHAR2,
160                    c5           IN OUT NOCOPY VARCHAR2,
161                    c6           IN OUT NOCOPY VARCHAR2,
162                    c7           IN OUT NOCOPY VARCHAR2,
163                    c8           IN OUT NOCOPY VARCHAR2,
164                    c9           IN OUT NOCOPY VARCHAR2,
165                    c10          IN OUT NOCOPY VARCHAR2,
166                    c11          IN OUT NOCOPY VARCHAR2,
167                    c12          IN OUT NOCOPY VARCHAR2,
168                    c13          IN OUT NOCOPY VARCHAR2,
169                    c14          IN OUT NOCOPY VARCHAR2,
170                    c15          IN OUT NOCOPY VARCHAR2,
171                    c16          IN OUT NOCOPY VARCHAR2,
172                    c17          IN OUT NOCOPY VARCHAR2,
173                    c18          IN OUT NOCOPY VARCHAR2,
174                    c19          IN OUT NOCOPY VARCHAR2,
175                    c20          IN OUT NOCOPY VARCHAR2,
176                    c21          IN OUT NOCOPY VARCHAR2,
177                    c22          IN OUT NOCOPY VARCHAR2,
178                    c23          IN OUT NOCOPY VARCHAR2,
179                    c24          IN OUT NOCOPY VARCHAR2,
180                    c25          IN OUT NOCOPY VARCHAR2,
181                    c26          IN OUT NOCOPY VARCHAR2,
182                    c27          IN OUT NOCOPY VARCHAR2,
183                    c28          IN OUT NOCOPY VARCHAR2,
184                    c29          IN OUT NOCOPY VARCHAR2,
185                    c30          IN OUT NOCOPY VARCHAR2,
186                    c31          IN OUT NOCOPY VARCHAR2,
187                    c32          IN OUT NOCOPY VARCHAR2,
188                    c33          IN OUT NOCOPY VARCHAR2,
189                    c34          IN OUT NOCOPY VARCHAR2,
190                    c35          IN OUT NOCOPY VARCHAR2,
191                    c36          IN OUT NOCOPY VARCHAR2,
192                    c37          IN OUT NOCOPY VARCHAR2,
193                    c38          IN OUT NOCOPY VARCHAR2,
194                    c39          IN OUT NOCOPY VARCHAR2)
195                   RETURN NATURAL AS
196   EXTERNAL
197   LIBRARY EPS_lib
198   NAME "XPFetch"
199   LANGUAGE C
200   WITH CONTEXT;
201 
202   --
203   -- OCI Callout - XPFetchN - Fetch multiple rows from an Express Query
204   --
205   -- Return 0 SUCCESS else Exception return code if fail
206   --
207   FUNCTION XPFetchN(in_report_id NATURAL,
208                     buffer_size  NATURAL,
209                     buffer       IN OUT NOCOPY VARCHAR2,
210                     num_cols     OUT NOCOPY NATURAL,
211                     num_rows     OUT NOCOPY NATURAL)
212                   RETURN NATURAL AS
213   EXTERNAL
214   LIBRARY EPS_lib
215   NAME "XPFetchN"
216   LANGUAGE C
217   WITH CONTEXT;
218 
219 
220   --
221   -- OCI Callout - xrbGetMessage - Get EPS error message
222   --
223   FUNCTION xrbGetMessage(msgno       IN NATURAL,
224                          buffer      IN OUT NOCOPY VARCHAR2,
225                          bufsize     IN NATURAL)
226                        RETURN NATURAL AS
227   EXTERNAL
228   LIBRARY EPS_lib
229   NAME "xrbGetMessage"
230   LANGUAGE C ;
231 
232 
233 
234   FUNCTION ParseRow(buffer      IN OUT NOCOPY VARCHAR2,
235                     buffer_size IN NUMBER,
236                     buffer_ptr  IN OUT NOCOPY NUMBER,
237                     ncols       IN NUMBER,
238                     nrows       IN NUMBER)
239                   RETURN EPS_express_t IS
240     t EPS_express_t := EPS_express_t(NULL,NULL,NULL,NULL,NULL,
241                                          NULL,NULL,NULL,NULL,NULL,
242                                          NULL,NULL,NULL,NULL,NULL,
243                                          NULL,NULL,NULL,NULL,NULL,
244                                          NULL,NULL,NULL,NULL,NULL,
245                                          NULL,NULL,NULL,NULL,NULL,
246                                          NULL,NULL,NULL,NULL,NULL,
247                                          NULL,NULL,NULL,NULL,NULL);
248   BEGIN
249     IF ncols >= 1 THEN
250       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c0);
251     END IF;
252     IF ncols >= 2 THEN
253       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c1);
254     END IF;
255     IF ncols >= 3 THEN
256       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c2);
257     END IF;
258     IF ncols >= 4 THEN
259       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c3);
260     END IF;
261     IF ncols >= 5 THEN
262       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c4);
263     END IF;
264     IF ncols >= 6 THEN
265       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c5);
266     END IF;
267     IF ncols >= 7 THEN
268       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c6);
269     END IF;
270     IF ncols >= 8 THEN
271       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c7);
272     END IF;
273     IF ncols >= 9 THEN
274       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c8);
275     END IF;
276     IF ncols >= 10 THEN
277       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c9);
278     END IF;
279     IF ncols >= 11 THEN
280       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c10);
281     END IF;
282     IF ncols >= 12 THEN
283       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c11);
284     END IF;
285     IF ncols >= 13 THEN
286       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c12);
287     END IF;
288     IF ncols >= 14 THEN
289       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c13);
290     END IF;
291     IF ncols >= 15 THEN
292       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c14);
293     END IF;
294     IF ncols >= 16 THEN
295       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c15);
296     END IF;
297     IF ncols >= 17 THEN
298       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c16);
299     END IF;
300     IF ncols >= 18 THEN
301       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c17);
302     END IF;
303     IF ncols >= 19 THEN
304       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c18);
305     END IF;
306     IF ncols >= 20 THEN
307       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c19);
308     END IF;
309     IF ncols >= 21 THEN
310       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c20);
311     END IF;
312     IF ncols >= 22 THEN
313       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c21);
314     END IF;
315     IF ncols >= 23 THEN
316       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c22);
317     END IF;
318     IF ncols >= 24 THEN
319       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c23);
320     END IF;
321     IF ncols >= 25 THEN
322       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c24);
323     END IF;
324     IF ncols >= 26 THEN
325       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c25);
326     END IF;
327     IF ncols >= 27 THEN
328       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c26);
329     END IF;
330     IF ncols >= 28 THEN
331       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c27);
332     END IF;
333     IF ncols >= 29 THEN
334       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c28);
335     END IF;
336     IF ncols >= 30 THEN
337       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c29);
338     END IF;
339     IF ncols >= 31 THEN
340       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c30);
341     END IF;
342     IF ncols >= 32 THEN
343       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c31);
344     END IF;
345     IF ncols >= 33 THEN
346       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c32);
347     END IF;
348     IF ncols >= 34 THEN
349       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c33);
350     END IF;
351     IF ncols >= 35 THEN
352       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c34);
353     END IF;
354     IF ncols >= 36 THEN
355       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c35);
356     END IF;
357     IF ncols >= 37 THEN
358       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c36);
359     END IF;
360     IF ncols >= 38 THEN
361       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c37);
362     END IF;
363     IF ncols >= 39 THEN
364       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c38);
365     END IF;
366     IF ncols >= 40 THEN
367       buffer_ptr := ParseCol(buffer,buffer_size,buffer_ptr,t.c39);
368     END IF;
369     RETURN t;
370   END;
371 
372   FUNCTION ParseCol(buffer      IN OUT NOCOPY VARCHAR2,
373                     buffer_size IN NUMBER,
374                     buffer_ptr  IN NUMBER,
375                     col_val     IN OUT NOCOPY VARCHAR2)
376                   RETURN NUMBER IS
377     buffer_ptr_new NUMBER := 0;
378     buffer_ptr_old NUMBER := 0;
379   BEGIN
380     -- the column lies between single \,
381     -- double \\s indicate a \ in the value and not a delimeter
382       buffer_ptr_new := buffer_ptr;
383     LOOP
384       buffer_ptr_old := buffer_ptr_new;
385       buffer_ptr_new := INSTR(buffer, '\', buffer_ptr_old, 1);
386 
387       --
388       -- Test for error finding the \
389       --
390       IF buffer_ptr_new = 0 THEN
391         DECLARE
392           msg  VARCHAR2(2000);
393         BEGIN
394           msg := getErrorMsg(20013) ;
395           RAISE_APPLICATION_ERROR(-20013, msg);
396         END;
397       END IF;
398 
399       --
400       -- Copy the output
401       --
402       col_val := col_val || SUBSTR(buffer, buffer_ptr_old, buffer_ptr_new - buffer_ptr_old);
403 
404       buffer_ptr_new := buffer_ptr_new + LENGTH('\'); -- move past the \
405 
406       --
407       -- Test for a \\
408       --
409       IF (buffer_ptr_new < buffer_size - 1) AND
410           SUBSTR(buffer, buffer_ptr_new, 1) = '\'
411       THEN
412         col_val := col_val || '\';
413         buffer_ptr_new := buffer_ptr_new + LENGTH('\');
414       ELSE
415         EXIT; -- LOOP;
416       END IF;
417     END LOOP;
418 
422        col_val := NULL ;
419     -- Check for encoded NA and empty measure string values
420 
421     IF  col_val = '__NULL' THEN
423     ELSIF col_val = '__EMPTY_STR' THEN
424        col_val := '' ;
425     END IF ;
426 
427     RETURN buffer_ptr_new;
428   END;
429 
430 END EPS;