[Home] [Help]
PACKAGE BODY: APPS.GCS_AGGREGATION_PKG
Source
1 PACKAGE BODY GCS_AGGREGATION_PKG AS
2 /* $Header: gcsaggrb.pls 120.3 2006/02/06 19:34:28 yingliu noship $ */
3
4 --
5 -- PRIVATE GLOBAL VARIABLES
6 --
7 g_api VARCHAR2(40) := 'gcs.plsql.GCS_AGGREGATION_PKG';
8
9 --
10 -- PRIVATE EXCEPTIONS
11 --
12 GCS_AGGR_ENTRY_FAILURE EXCEPTION;
13
14 --
15 -- PRIVATE FUNCTIONS
16 --
17
18 --
19 -- Procedure
20 -- insert_prop_entry_lines
21 -- Purpose
22 -- Given the entry id with the "full" (100%) amount lines, create the
23 -- lines for the proportional calculation entry by multiplying the amounts
24 -- by the ownership percent.
25 -- Notes
26 --
27 PROCEDURE insert_prop_entry_lines(
28 p_prop_entry_id NUMBER,
29 p_full_entry_id NUMBER,
30 p_ownership_percent NUMBER,
31 p_curr_round_factor NUMBER)
32 IS
33 fn_name VARCHAR2(30) := 'INSERT_PROP_ENTRY_LINES';
34 BEGIN
35 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_PROCEDURE) THEN
36 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
37 g_api || '.' || fn_name,
38 GCS_UTILITY_PKG.g_module_enter || fn_name ||
39 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
40 END IF;
41 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_enter ||
42 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
43
44 INSERT INTO GCS_ENTRY_LINES gel1
45 (entry_id, line_type_code,
46 company_cost_center_org_id, financial_elem_id, product_id,
47 natural_account_id, channel_id, line_item_id, project_id,
48 customer_id, intercompany_id, task_id,
49 user_dim1_id, user_dim2_id, user_dim3_id, user_dim4_id,
50 user_dim5_id, user_dim6_id, user_dim7_id, user_dim8_id,
51 user_dim9_id, user_dim10_id,
52 xtd_balance_e, ytd_balance_e,
53 ptd_debit_balance_e, ptd_credit_balance_e,
54 ytd_debit_balance_e, ytd_credit_balance_e,
55 creation_date, created_by,
56 last_update_date, last_updated_by, last_update_login)
57 SELECT
58 p_prop_entry_id, line_type_code,
59 company_cost_center_org_id, financial_elem_id, product_id,
60 natural_account_id, channel_id, line_item_id, project_id,
61 customer_id, intercompany_id, task_id,
62 user_dim1_id, user_dim2_id, user_dim3_id, user_dim4_id,
63 user_dim5_id, user_dim6_id, user_dim7_id, user_dim8_id,
64 user_dim9_id, user_dim10_id,
65 round((xtd_balance_e * p_ownership_percent / 100) /
66 p_curr_round_factor) * p_curr_round_factor,
67 round((ytd_balance_e * p_ownership_percent / 100) /
68 p_curr_round_factor) * p_curr_round_factor,
69 round((ptd_debit_balance_e * p_ownership_percent / 100) /
70 p_curr_round_factor) * p_curr_round_factor,
71 round((ptd_credit_balance_e * p_ownership_percent / 100) /
72 p_curr_round_factor) * p_curr_round_factor,
73 round((ytd_debit_balance_e * p_ownership_percent / 100) /
74 p_curr_round_factor) * p_curr_round_factor,
75 round((ytd_credit_balance_e * p_ownership_percent / 100) /
76 p_curr_round_factor) * p_curr_round_factor,
77 sysdate, created_by,
78 sysdate, last_updated_by, last_update_login
79 FROM GCS_ENTRY_LINES gel2
80 WHERE gel2.entry_id = p_full_entry_id;
81
82 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_STATEMENT) THEN
83 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
84 g_api || '.' || fn_name,
85 'Inserted ' || to_char(SQL%ROWCOUNT) || ' row(s)');
86 END IF;
87
88 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_PROCEDURE) THEN
89 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
90 g_api || '.' || fn_name,
91 GCS_UTILITY_PKG.g_module_success || fn_name ||
92 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
93 END IF;
94 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_success ||
95 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
96
97 EXCEPTION
98 WHEN OTHERS THEN
99 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_UNEXPECTED) THEN
100 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
101 g_api || '.' || fn_name,
102 GCS_UTILITY_PKG.g_module_failure || fn_name ||
103 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
104 END IF;
105 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_failure ||
106 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
107 RAISE;
108 END insert_prop_entry_lines;
109
110 --
111 -- Procedure
112 -- maintain_entries
113 -- Purpose
114 -- Create the aggregation entries and lines.
115 -- Notes
116 --
117 PROCEDURE maintain_entries(
118 p_errbuf OUT NOCOPY VARCHAR2,
119 p_retcode OUT NOCOPY VARCHAR2,
120 p_entry_id OUT NOCOPY NUMBER,
121 p_stat_entry_id OUT NOCOPY NUMBER,
122 p_prop_entry_id OUT NOCOPY NUMBER,
123 p_stat_prop_entry_id OUT NOCOPY NUMBER,
124 p_consolidation_type VARCHAR2,
125 p_ownership_percent NUMBER,
126 p_curr_round_factor NUMBER,
127 p_stat_round_factor NUMBER,
128 p_stat_required VARCHAR2,
129 p_hierarchy_id NUMBER,
130 p_relationship_id NUMBER,
131 p_cons_entity_id NUMBER,
132 p_cons_entity_curr VARCHAR2,
133 p_cal_period_id NUMBER,
134 p_period_end_date DATE,
135 p_balance_type_code VARCHAR2,
136 p_dataset_code VARCHAR2)
137 IS
138 fn_name VARCHAR2(30) := 'MAINTAIN_ENTRIES';
139
140 l_category_code VARCHAR2(30);
141 BEGIN
142 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_PROCEDURE) THEN
143 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
144 g_api || '.' || fn_name,
145 GCS_UTILITY_PKG.g_module_enter || fn_name ||
146 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
147 END IF;
148 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_enter ||
149 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
150
151 -- Prepare all entry headers needed
152
153 -- Decide the category for the full entries
154 IF (p_consolidation_type = 'PARTIAL') THEN
155 l_category_code := 'PROPORTIONAL';
156 ELSE
157 l_category_code := 'AGGREGATION';
158 END IF;
159
160 GCS_ENTRY_PKG.create_entry_header(
161 p_errbuf, p_retcode,
162 p_entry_id,
163 p_hierarchy_id,
164 p_cons_entity_id,
165 p_cal_period_id,
166 p_cal_period_id,
167 'AUTOMATIC',
168 p_balance_type_code,
169 p_cons_entity_curr,
170 'SINGLE_RUN_FOR_PERIOD',
171 l_category_code);
172
173 IF (p_retcode = fnd_api.g_ret_sts_unexp_error) THEN
174 RAISE GCS_AGGR_ENTRY_FAILURE;
175 END IF;
176
177 IF (p_stat_required = 'Y') THEN
178 GCS_ENTRY_PKG.create_entry_header(
179 p_errbuf, p_retcode,
180 p_stat_entry_id,
181 p_hierarchy_id,
182 p_cons_entity_id,
183 p_cal_period_id,
184 p_cal_period_id,
185 'AUTOMATIC',
186 p_balance_type_code,
187 'STAT',
188 'SINGLE_RUN_FOR_PERIOD',
189 l_category_code);
190
191 IF (p_retcode = fnd_api.g_ret_sts_unexp_error) THEN
192 RAISE GCS_AGGR_ENTRY_FAILURE;
193 END IF;
194 END IF;
195
196 IF (p_consolidation_type = 'PARTIAL') THEN
197 GCS_ENTRY_PKG.create_entry_header(
198 p_errbuf, p_retcode,
199 p_prop_entry_id,
200 p_hierarchy_id,
201 p_cons_entity_id,
202 p_cal_period_id,
203 p_cal_period_id,
204 'AUTOMATIC',
205 p_balance_type_code,
206 p_cons_entity_curr,
207 'SINGLE_RUN_FOR_PERIOD',
208 'AGGREGATION');
209
210 IF (p_retcode = fnd_api.g_ret_sts_unexp_error) THEN
211 RAISE GCS_AGGR_ENTRY_FAILURE;
212 END IF;
213
214 IF (p_stat_required = 'Y') THEN
215 GCS_ENTRY_PKG.create_entry_header(
216 p_errbuf, p_retcode,
217 p_stat_prop_entry_id,
218 p_hierarchy_id,
219 p_cons_entity_id,
220 p_cal_period_id,
221 p_cal_period_id,
222 'AUTOMATIC',
223 p_balance_type_code,
224 'STAT',
225 'SINGLE_RUN_FOR_PERIOD',
226 'AGGREGATION');
227
228 IF (p_retcode = fnd_api.g_ret_sts_unexp_error) THEN
229 RAISE GCS_AGGR_ENTRY_FAILURE;
230 END IF;
231 END IF;
232 END IF;
233
234 -- Create the FULL amount lines for both entity's currency and STAT
235 GCS_AGGREGATION_DYNAMIC_PKG.insert_full_entry_lines(
236 p_entry_id,
237 p_stat_entry_id,
238 p_cons_entity_id,
239 p_hierarchy_id,
240 p_relationship_id,
241 p_cal_period_id,
242 p_period_end_date,
243 p_cons_entity_curr,
244 p_balance_type_code,
245 p_dataset_code);
246
247 -- Create proportional lines if necessary
248 IF (p_consolidation_type = 'PARTIAL') THEN
249 insert_prop_entry_lines(p_prop_entry_id,
250 p_entry_id,
251 p_ownership_percent,
252 p_curr_round_factor);
253
254 IF (p_stat_entry_id IS NOT NULL) THEN
255 insert_prop_entry_lines(p_stat_prop_entry_id,
256 p_stat_entry_id,
257 p_ownership_percent,
258 p_stat_round_factor);
259 END IF;
260 END IF;
261
262 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_PROCEDURE) THEN
263 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
264 g_api || '.' || fn_name,
265 GCS_UTILITY_PKG.g_module_success || fn_name ||
266 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
267 END IF;
268 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_success ||
269 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
270
271 EXCEPTION
272 WHEN GCS_AGGR_ENTRY_FAILURE THEN
273 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_EXCEPTION) THEN
274 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
275 g_api || '.' || fn_name,
276 GCS_UTILITY_PKG.g_module_failure || fn_name ||
277 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
278 END IF;
279 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_failure ||
280 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
281 RAISE GCS_AGGR_ENTRY_FAILURE;
282 WHEN OTHERS THEN
283 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_UNEXPECTED) THEN
284 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
285 g_api || '.' || fn_name,
286 GCS_UTILITY_PKG.g_module_failure || fn_name ||
287 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
288 END IF;
289 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_failure ||
290 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
291 RAISE;
292 END maintain_entries;
293
294
295 --
296 -- PUBLIC FUNCTIONS
297 --
298
299 PROCEDURE Aggregate(
300 p_errbuf OUT NOCOPY VARCHAR2,
301 p_retcode OUT NOCOPY VARCHAR2,
302 p_run_detail_id NUMBER,
303 p_hierarchy_id NUMBER,
304 p_relationship_id NUMBER,
305 p_cons_entity_id NUMBER,
306 p_cal_period_id NUMBER,
307 p_period_end_date DATE,
308 p_balance_type_code VARCHAR2,
309 p_stat_required VARCHAR2,
310 p_hier_dataset_code NUMBER)
311 IS
312 fn_name VARCHAR2(30) := 'AGGREGATE';
313
314 l_cons_entity_curr VARCHAR2(30);
315 l_consolidation_type VARCHAR2(30);
316 l_ownership_percent NUMBER;
317
318 l_entry_id NUMBER;
319 l_prop_entry_id NUMBER;
320 l_stat_entry_id NUMBER;
321 l_stat_prop_entry_id NUMBER;
322
323 l_curr_round_factor NUMBER;
324 l_stat_round_factor NUMBER;
325 BEGIN
326 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_PROCEDURE) THEN
327 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
328 g_api || '.' || fn_name,
329 GCS_UTILITY_PKG.g_module_enter || fn_name ||
330 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
331
332 -- parameters passed in
333 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
334 g_api || '.' || fn_name,
335 'p_run_detail_id = ' || to_char(p_run_detail_id));
336 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
337 g_api || '.' || fn_name,
338 'p_hierarchy_id = ' || to_char(p_hierarchy_id));
339 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
340 g_api || '.' || fn_name,
341 'p_relationship_id = ' || to_char(p_relationship_id));
342 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
343 g_api || '.' || fn_name,
344 'p_cons_entity_id = ' || to_char(p_cons_entity_id));
345 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
346 g_api || '.' || fn_name,
347 'p_cal_period_id = ' || to_char(p_cal_period_id));
348 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
349 g_api || '.' || fn_name,
350 'p_period_end_date = ' || to_char(p_period_end_date,
351 'DD-MON-YYYY'));
352 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
353 g_api || '.' || fn_name,
354 'p_balance_type_code = ' || p_balance_type_code);
355 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
356 g_api || '.' || fn_name,
357 'p_stat_required = ' || p_stat_required);
358 END IF;
359 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_enter ||
360 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
361
362 -- In case of an error, roll back to this point
363 SAVEPOINT gcs_aggregation_start;
364
365 -- ***** Setup *****
366 g_fnd_user_id := fnd_global.user_id;
367 g_fnd_login_id := fnd_global.login_id;
368
369 -- get the consolidation entity's currency
370 SELECT currency_code
371 INTO l_cons_entity_curr
372 FROM GCS_ENTITY_CONS_ATTRS
373 WHERE hierarchy_id = p_hierarchy_id
374 AND entity_id = p_cons_entity_id;
375
376 -- get the consolidation type and ownership percent
377 SELECT nvl(min(gt.consolidation_type_code), 'FULL'),
378 min(gcr.ownership_percent)
379 INTO l_consolidation_type, l_ownership_percent
380 FROM GCS_CONS_RELATIONSHIPS gcr,
381 GCS_TREATMENTS_B gt
382 WHERE gcr.cons_relationship_id = p_relationship_id
383 AND gcr.actual_ownership_flag = 'Y'
384 AND gt.treatment_id = gcr.treatment_id;
385
386 IF (l_consolidation_type = 'PARTIAL') THEN
387 -- get minimum accountable unit for the currency
388 SELECT nvl(minimum_accountable_unit, power(10, -precision))
389 INTO l_curr_round_factor
390 FROM FND_CURRENCIES
391 WHERE currency_code = l_cons_entity_curr;
392
393 IF (p_stat_required = 'Y') THEN
394 -- get minimum accountable unit for STAT
395 SELECT nvl(minimum_accountable_unit, power(10, -precision))
396 INTO l_stat_round_factor
397 FROM FND_CURRENCIES
398 WHERE currency_code = 'STAT';
399 END IF;
400 END IF;
401
402 -- ***** Main Process *****
403 maintain_entries(
404 p_errbuf,
405 p_retcode,
406 l_entry_id ,
407 l_stat_entry_id,
408 l_prop_entry_id,
409 l_stat_prop_entry_id,
410 l_consolidation_type,
411 l_ownership_percent,
412 l_curr_round_factor,
413 l_stat_round_factor,
414 p_stat_required,
415 p_hierarchy_id,
416 p_relationship_id,
417 p_cons_entity_id,
418 l_cons_entity_curr,
419 p_cal_period_id,
420 p_period_end_date,
421 p_balance_type_code,
422 p_hier_dataset_code);
423
424 -- Update run details with the new entry id's
425 IF (l_consolidation_type = 'PARTIAL') THEN
426 GCS_CONS_ENG_RUN_DTLS_PKG.update_entry_headers(p_run_detail_id,
427 l_prop_entry_id,
428 l_stat_prop_entry_id,
429 l_entry_id,
430 l_stat_entry_id);
431
432 ELSE
433 GCS_CONS_ENG_RUN_DTLS_PKG.update_entry_headers(p_run_detail_id,
434 l_entry_id,
435 l_stat_entry_id);
436 END IF;
437
438 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_PROCEDURE) THEN
439 FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
440 g_api || '.' || fn_name,
441 GCS_UTILITY_PKG.g_module_success || fn_name ||
442 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
443 END IF;
444 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_success ||
445 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
446
447 EXCEPTION
448 WHEN GCS_AGGR_ENTRY_FAILURE THEN
449 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_EXCEPTION) THEN
450 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
451 g_api || '.' || fn_name,
452 GCS_UTILITY_PKG.g_module_failure || fn_name ||
453 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
454 END IF;
455 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_failure ||
456 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
457
458 ROLLBACK TO gcs_aggregation_start;
459 -- p_errbuf and p_retcode are set by GCS_ENTRY_PKG.create_entry_header()
460 WHEN NO_DATA_FOUND THEN
461 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_EXCEPTION) THEN
462 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
463 g_api || '.' || fn_name,
464 'Consolidation Entity Curr = ' || l_cons_entity_curr);
465 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
466 g_api || '.' || fn_name,
467 'Dataset Code = ' || to_char(p_hier_dataset_code));
468 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
469 g_api || '.' || fn_name,
470 'Consolidation Type = ' || l_consolidation_type);
471 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
472 g_api || '.' || fn_name,
473 'Ownership Percent = ' || to_char(l_ownership_percent));
474 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
475 g_api || '.' || fn_name,
476 'Currency MAU = ' || to_char(l_curr_round_factor));
477 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
478 g_api || '.' || fn_name,
479 'STAT MAU = ' || to_char(l_stat_round_factor));
480
481 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
482 g_api || '.' || fn_name,
483 GCS_UTILITY_PKG.g_module_failure || fn_name ||
484 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
485 END IF;
486 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_failure ||
487 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
488
489 ROLLBACK TO gcs_aggregation_start;
490 p_errbuf := 'GCS_AGGR_NO_DATA_FOUND';
491 p_retcode := '2';
492 WHEN OTHERS THEN
493 IF (FND_LOG.G_CURRENT_RUNTIME_LEVEL <= FND_LOG.LEVEL_UNEXPECTED) THEN
494 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
495 g_api || '.' || fn_name,
496 SUBSTR(SQLERRM, 1, 4000));
497 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,
498 g_api || '.' || fn_name,
499 GCS_UTILITY_PKG.g_module_failure || fn_name ||
500 to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
501 END IF;
502 --FND_FILE.PUT_LINE(FND_FILE.LOG, GCS_UTILITY_PKG.g_module_failure ||
503 -- fn_name || to_char(sysdate, ' DD-MON-YYYY HH:MI:SS'));
504
505 ROLLBACK TO gcs_aggregation_start;
506 p_errbuf := 'GCS_AGGR_UNHANDLED_EXCEPTION';
507 p_retcode := '2';
508 END Aggregate;
509
510 END GCS_AGGREGATION_PKG;