DBA Data[Home] [Help]

PACKAGE BODY: APPS.FEM_DIM_MEMBER_LOADER_PKG

Source


1 PACKAGE BODY FEM_DIM_MEMBER_LOADER_PKG AS
2 -- $Header: femdimldr_pkb.plb 120.22 2008/02/15 18:20:28 gcheng ship $
3 
4 /***************************************************************************
5                     Copyright (c) 2003 Oracle Corporation
6                            Redwood Shores, CA, USA
7                              All rights reserved.
8  ***************************************************************************
9   FILENAME
10     femdimldr_pkb.plb
11 
12   DESCRIPTION
13     See femdimldr_pkh.pls for details
14 
15   HISTORY
16   Rob Flippo 20-Oct-2003  Created
17   Rob Flippo 24-Dec-2003  Fixed put message for unexpected error
18                           Added log messages in GET_ATTR_VERSION
19                           Fixed GET_ATTR_VERSION so that version_id
20                           select returns only versions for that
21                           attribute and dimension label combo
22   Rob Flippo 29-Dec-2003  Fixed read_only_flag select from
23                           FEM_DIM_ATTRIBUTES_B to
24                           assignment_is_read_only;
25                           Also fixed case where new member has
26                           TL row but with status <>'LOAD' - now
27                           such members get status update
28                           'MISSING NAME';
29   Rob Flippo 02-Jan-2004   Fixed problem where missing required
30                            attribute did not update _B status
31   Rob Flippo 06-Jan-2004   Fixed no_data_found problem for
32                            retrieving attr assign value set
33   Rob Flippo 16-Mar-2004   Modified for Drop3 db.  Implemented
34                            Process Locks;  Implemented other changes
35                            documented in the detail design doc.
36   Rob Flippo 24-Mar-2004   Fixed problem with null dimension_group
37                            for member loads.  To do this, added outer
38                            join (+) to attr_select and member_Select
39                            queries
40   Rob Flippo 31-Mar-2004   Implemented Error Reprocesing.  Fixed
41                            several bugs having to do with outputing
42                            the correct status for failed records,
43                            and preventing members from loading with
44                            insufficient req attr assignments in the
45                            _ATTR_T table.
46   Rob Flippo 06-May-2004   Implemented changes for Multi-processing.
47                            Also added support for non-value set
48                            attribute dims, like Financial Element,
49                            Dataset, etc.
50   Rob Flippo 29-June-2004  Remove deprecated code for
51                            BULK_FETCH_LIMIT profile option
52   Rob Flippo 16-Sep-2004   Bug#3835758  Incorrect logic on checking
53                            the Value Set of Attribute assignments
54                            Bug#3848996  Simple Dimension loads fail
55 
56                            Also fixed several issues with the
57                            status messaging. Previously, error rows
58                            were getting incorrect STATUS.
59                            Also removed the error row count from the
60                            log, since it is not possible for this
61                            number to be accurate due to the fact that
62                            the loader performs several bulk updates
63                            on bad data in the interface tables.
64 
65                            Also fixed the logic on checking attributes
66                            in FEM_DIM_ATTR_GRPS - this has been
67                            changed so that the loader ignores any
68                            entries into FEM_DIM_ATTR_GRPS for required
69                            attributes assigned. Because the DHM is
70                            supposed to prevent such occurrences - only
71                            optional attributes are allowed to be
72                            assigned to a specific group.
73   Rob Flippo 17-Sep-04     Bug#3843739 DIM LOAD REPROCESS FAILS IF
74                            _TL_T STATUS=LOAD.
75                            This is fixed by modifying the loader so
76                            that when run in Error Reprocessing mode
77                            it loads both 'LOAD' and error status
78                            records.
79                            Bug#3881433 ERROR MESSAGE REQUIRED TO
80                            DEBUG MULTI LANG LOADS THAT FAIL.
81                            The loader now updates the STATUS column
82                            in _TL_T table to "LANGUAGE_NOT_INSTALLED"
83                            for all records where the LANGUAGE value
84                            is not designated as installed in
85                            FND_LANGUAGES.
86   Rob Flippo 21-Sep-04     Bug#3900960 INSUFFICIENT ERROR MESSAGES
87                            WHEN RUNNING FEM DIMENSION LOADER
88                            - to fix this, add to_char wrapper
89                              on date values inside of the to_date
90   Rob Flippo 27-Sep-04     Bug#3906366 ADD ABILITY TO
91                            TRACK NUMBER OF ERROR ROWS IN THE MEMBER
92                            LOADER
93                            --  added accumulators for total rows
94                                to load as well as counting all the
95                                various error rows encountered
96                            Bug#3909390 SIMPLE DIM LOADER ISSUE WHEN
97                            SAME MEMBER_CODE IN 2 DIFFT TBLS
98                            -- This was fixed by adding a where
99                            condition on the "existing" mbr select stmt
100                             on dimension_varchar_label when the load
101                               is for simple dims.
102   Rob Flippo 28-Sep-04    Bug#3906218 NEED ABILITY TO UNDELETE
103                           DIMENSIONS
104                           -- added new procedure
105                              build_enable_update_stmt;  modified the
106                              Base_Update procedure to call this new
107                              update
108   Rob Flippo 01-OCT-04    Bug#3925620 CAL PERIOD LOAD FAILS WHEN
109                           UPDATING CAL_PERIOD_END_DATE ATTRIBUTE IN
110                           INTF TABLE
111                           -- The loader now allows update on
112                              assignment_is_read_only attributes, but
113                              only as long as the update is identical
114                              to the existing assignment.
115   Rob Flippo 11-OCT-04    Bug#3906182  Enable RCM dimensions for
116                           loading
117                           - added object_definition_id values
118                             to the CASE statement in Main
119   Rob Flippo 13-OCT-04    Added SIC and Credit Status dims
120 
121   Rob Flippo 27-OCT-04    Bug#3973837
122                           FEM.C.DP3.4: DIMENSION LOADER
123                           ERRORS ALL ATTRIBUTES IN ATTR_T TABLE
124                           -- this change affected the
125                              build_bad_attr_select_stmt procedure
126 
127   Rob Flippo 01-NOV-04   Attributes for members with
128                          invalid_dim_grps not getting updated -
129                          modified new_members procedure
130                          so that it continues even if bad drp
131                          or value_set so that the attr records
132                          get updated.
133   Rob Flippo 11-NOV-04   Bug#4002917 DIM LDR SHOULD PROHIBIT
134                          OVERLAP CAL PERIODS
135                          - modify the start/end date validations
136                            for cal period so that overlaps are
137                            prevented;
138                          also added restriction that
139                          cal_period_number must always be >0
140   Rob Flippo 22-NOV-04   Overlap changes
141                          Bug#4019853 - Fix Data Overlap logic -
142                          Added section that checks within the
143                          attr array for date overlaps.  This logic
144                          assumes num_of_processes = 1 for CAL_PEIOD
145                          load
146   Rob Flippo 23-NOV-04   Fixes to the error counts
147 
148   Rob Flippo 24-NOV-04   Bug#4031308 Remove periods_in_year check
149   Rob Flippo 16-DEC-04   Bug#4061097 CAN NOT CREATE BUDGET DIM USING
150                             DIMENSION MEMBER LOADER
151                          Bug#3654256 UPDATE DIMENSION NAMES IN DHM
152                             SHOULD ALSO UPDATE LOADER OBJECT NAMES
153                          -- the loader now requires a dim_id as a
154                            parm and reads the associated object_Def_id
155                             from the fem_Xdim_dimensions table
156   Rob Flippo 02-FEB-05   Bug#4066869 FEM.D MODIFY DIM MBR LOADER TO
157                          READ DIM_ID AS PARM INSTEAD OF OBJECT_DEF_ID
158                          Bug#4030717 FEM.D: MODIFY DIM MBR LOADER
159                          OVERLAP DATE LOGIC TO ALLOW MP FOR CAL_PERIOD
160                          Bug#3822561 FEM.D.1.DP1: MODIFY DIM MEMBER
161                          LOADER TO SUPPORT ATTRIBUTES OF CAL PERIOD
162                          -- added the CALPATTR columns to support
163                             attributes of CAL_PERIOD dimension;
164                          -- revised the OVERLAP logic so that it now
165                             uses temporary tables.  This means that
166                          CAL_PERIOD loads can now be Multi-processed
167                          -- implemented FEM_SHARED_ATTR_T as a
168                             shared interface table for attributed
169                             dimensions that don't have their own
170                             separate tables
171   Rob Flippo 02-FEB-18   Fix Dimension Group problem where if name
172                          is same for 2 dim grps in different dims
173                          the loader fails because of no where
174                          condition on dimension_id
175                          -- this prob recognized in FEM.C in
176                             bug#4189544
177   Rob Flippo 02-MAR-05   Bug#4170444 Add check to see if
178                          READ_ONLY_FLAG='Y' in the target ATTR
179                          table for existing rows.  If it is, then
180                          set STATUS = 'PROTECTED_ATTR_ASSIGN'
181   Rob Flippo 03-MAR-05  Modify base_update so that for dim grp
182                         load we don't
183                  get a unique dimgrp seq error unless the conflict is
184                  caused by a dimension group other than the one
185                  that is being loaded.
186   Rob Flippo 15-MAR-05  Bug#4226011
187                         - new entity attributes require new col
188                     USER_ASSIGN_ALLOWED_FLAG in FEM_DIM_ATTRIBUTES_B.
189                     Modify all attribute queries to exclude attributes
190                     where user_assign_allowed_flag = 'N';  Also add
191                     update in Pre_Valid_attr to mark rows where the
192                     attribute_varchar_label is
193                     user_assign_allowed_flag='N';
194                       -- also fix enabled_flag update stmt to use
195                          value_set in the subquery
196   Rob Flippo 22-MAR-05  Bug#4030730 add ability to update dimgrp
197                         of a member
198                     as long as member not in a sequence enforced hier;
199                         Add p_dimension_id as parm for
200                         build_remain_mbr_select
201   Rob Flippo 22-APR-05  Bug#4305050 Calendar_ID and Dimension_Group_ID
202                         were being swapped on insert member in
203                         Post_Cal_Periods procedure
204   sshanmug   28-APR-05  Support for Composite Dimension Loader
205                         Added the following PROCEDURES
206                         Pre_Process
207                         Process_Rows
208                         Get_Display_Codes
209 
210   sshanmug   09-MAY-05  Modified according to Nico Review comments
211                         Added a PROCEDURE  Metadata_Initialize
212   Rflippo    26-MAY-05  Bug#4355484
213                         Added raise_member_bus_event procedure
214                         to be called
215                         whenever a new member is created
216   Rob Flippo 02-JUN-05  Bug#4408918 Fix Overlap comparisons to not use
217                         to_char and instead do direct date compare
218                         using bind variables
219   Rob Flippo 14-JUN-05  Bug numbers:
220                         4107370 - folder security
221                         3920599 - log file changes
222                         3928148 - prevent TL update for
223                                   read only members
224                         3895203 - status update for level
225                                   specific attr
226                         3923485 - remove date_format_mask parm
227                         4429725 - array out of bounds error
228                         4429443 - changes for splitting out
229                                   comp dim loader
230   Rob Flippo 30-JUN-05  Bug#4355484
231                         CALL BUS EVENT WHEN CCC-ORGS
232                         LOADED WITH DIM LOADER
233                         As long as >0 new members created in a load
234                         the loader calls the bus. event
235   Rob Flippo 11-AUG-05  Bug#4547868 performance issue -
236                         fixed the Attr_assign_update so that the
237                         member_id and value_set_id are retrieved
238                         in the main attr query, thus allowing
239                         the later query on does_attr_exist
240                         to use those values directly, rather than join
241                         with the base table.
242                         Same applies to the actual
243                         ATTR update statement - it no longer
244                         joins with the base table.
245   Rob Flippo 07-OCT-05  Bug#4630742 10G issue -
246                         Attr_assign_update fails
247                         on does_attr_exist checks:  Modified the fetch
248                         so that both the "version" and
249                         "non-version" queries
250                         are identical for output variables;
251                         Bug#4628009 Fixed problem in
252                         Post_Cal_Periods where
253                         the Cal Period Name and Description table
254                         variables had a type of varchar2(30)
255                         instead of 150 and 255;
256                         Modified Cal period update statement  in
257                         build_tl_ro_mbr_upd_stmt for performance
258                         issue encountered during regression
259                         testing (no bug)
260   Rob Flippo 24-JAN-06  Bug#4927869 Change ICX_DATE_FORMAT to
261                         FEM_INTF_ATTR_DATE_FORMAT_MASK;
262   Rob Flippo 13-MAR-06  Bug#5068022 Need check on member name to ensure that
263                         it doesn't already exist.  Added new status
264                         'DUPLICATE_NAME' for this situation.  Edit occurs in
265                         new_members and tl_update procedures;
266   Rob Flippo 04-APR-06  Bug#5117594 Remove unique name check for Customer
267                         dimension
268 Naveen Kumar 26-APR-06  Bug#4736810. Added the call to get_mp_rows_rejected
269                         after the call to MP engine for composite dimensions.
270  Rob Flippo  28-APR-06  Bug 5174039
271                         New_Members and Attr_Assign_Update:  Added validation
272                         that calp start_date must be <= calp end date
273  Rob Flippo  18-JUL-06  Bug 5024575 Updates for Many-to-many attributes
274  Rob Flippo  04-AUG-06  Bug 5060746 Change literals to bind variables wherever possible
275  Rob Flippo  12-AUG-06  Bug 5459028 fixed bind variable error for
276                         :b_gv_apps_user_id
277 Naveen Kumar 07-Sep-06  Bug#4429427. Call to FEM_COMP_DIM_MEMBER_LOADER_PKG.Process_Rows
278                         through fem_multi_proc_pkg.MASTER altered to comply with Bind Variable Push
279                         architecture.
280 Rob Flippo  15-MAR-07  Bug#5900463 - TL rows for other languages
281                         getting deleted when new members are being
282                         loaded - modifications to build_calp_delete_stmt
283                         to fix this
284 Rob Flippo  15-MAR-07  Bug#5905501 Need to update source_lang so that
285                        translated rows get marked properly
286  G Cheng    15-FEM-08  6407625 (FP:6256819). Commented out two IF conditions
287                        in get_dimension_info
288 
289  *******************************************************************/
290 
291 -------------------------------
292 -- Declare package variables --
293 -------------------------------
294    f_set_status  BOOLEAN;
295 
296    c_log_level_1  CONSTANT  NUMBER  := fnd_log.level_statement;
297    c_log_level_2  CONSTANT  NUMBER  := fnd_log.level_procedure;
298    c_log_level_3  CONSTANT  NUMBER  := fnd_log.level_event;
299    c_log_level_4  CONSTANT  NUMBER  := fnd_log.level_exception;
300    c_log_level_5  CONSTANT  NUMBER  := fnd_log.level_error;
301    c_log_level_6  CONSTANT  NUMBER  := fnd_log.level_unexpected;
302 
303    v_log_level    NUMBER;
304 
305    gv_prg_msg      VARCHAR2(2000);
306    gv_callstack    VARCHAR2(2000);
307 
308 -- Global Variables for Post Processing information
309    gv_rows_fetched                    NUMBER := 0;
310    gv_rows_rejected                   NUMBER := 0;
311    gv_rows_loaded                     NUMBER := 0;
312    gv_temp_rows_rejected              NUMBER := 0;
313 
314    gv_dimgrp_rows_rejected            NUMBER := 0;
315 
316    gv_request_id  NUMBER := fnd_global.conc_request_id;
317    gv_apps_user_id     NUMBER := FND_GLOBAL.User_Id;
318    gv_login_id    NUMBER := FND_GLOBAL.Login_Id;
319    gv_pgm_id      NUMBER := FND_GLOBAL.Conc_Program_Id;
320    gv_pgm_app_id  NUMBER := FND_GLOBAL.Prog_Appl_ID;
321    gv_concurrent_status BOOLEAN;
322 
323    -- Engine SQL for Composite Dimension Loader
324 
325    g_select_statement  LONG;
326 
327 /*   -- This stores the details of each component dimensions of Flex Field
328 
329    TYPE rt_metadata IS RECORD (
330      dimension_id            fem_xdim_dimensions.dimension_id%TYPE,
331      member_col              fem_xdim_dimensions.member_col%TYPE,
332      member_display_code_col fem_xdim_dimensions.member_display_code_col%TYPE,
333      member_b_table_name     fem_xdim_dimensions.member_b_table_name%TYPE,
334      value_set_required_flag fem_xdim_dimensions.value_set_required_flag%TYPE,
335      dimension_varchar_label VARCHAR2(100),
336      member_sql              VARCHAR2(200));
337 
338    TYPE tt_metadata IS TABLE OF rt_metadata  INDEX BY BINARY_INTEGER;
339      t_metadata      tt_metadata;
340 
341 
342    -- This is used to store the values of the Interface(_T) tables
343    TYPE display_code_type IS TABLE OF VARCHAR2(150) INDEX BY BINARY_INTEGER;
344     t_global_vs_combo_dc   display_code_type;
345     t_fin_elem_dc   display_code_type;
346     t_ledger_dc     display_code_type;
347     t_cctr_org_dc   display_code_type;
348     t_product_dc    display_code_type;
349     t_channel_dc    display_code_type;
350     t_project_dc    display_code_type;
351     t_customer_dc   display_code_type;
352     t_task_dc       display_code_type;
353     t_user_dim1_dc  display_code_type;
354     t_user_dim2_dc  display_code_type;
355     t_user_dim3_dc  display_code_type;
356     t_user_dim4_dc  display_code_type;
357     t_user_dim5_dc  display_code_type;
358     t_user_dim6_dc  display_code_type;
359     t_user_dim7_dc  display_code_type;
360     t_user_dim8_dc  display_code_type;
361     t_user_dim9_dc  display_code_type;
362     t_user_dim10_dc display_code_type;
363 
364     -- This stores the concatenated display code for composite dimension
365     t_display_code  display_code_type;
366 
367     -- This stores the value of 'UOM_CODE' column for FEM_COST_OBECTS Table.
368     t_uom_code      display_code_type;
369 
370     --This is used to store the component dimensions of Composite Dimension
371 
372     TYPE dim_structure IS TABLE OF VARCHAR2(150) INDEX BY BINARY_INTEGER;
373     t_component_dim_dc dim_structure;*/
374 
375  --   TYPE varchar2_std_type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
376     t_status        varchar2_150_type;
377    -- Execution Mode Clause for all Fetches against the interface tables
378    --gv_exec_mode_clause VARCHAR2(100);
379 
380    -- Bulk Fetch profile no longer used
381    -- Default limit for all BULK Fetches
382    --gv_fetch_limit  NUMBER := NVL(FND_PROFILE.Value_Specific(
383    --                         'FEM_BULK_FETCH_LIMIT',gv_apps_user_id,null,null),
384    --                          c_fetch_limit);
385 
386 -------------------------------------
387 -- Array of Source System Codes for the load
388 -- This is a global table so that the data in it doesn't need
389 -- to be passed between procedures
390 -------------------------------------
391    tg_src_system_dc                varchar2_150_type;
392 
393 -----------------------------------------------
394 -- Declare private procedures and functions --
395 -----------------------------------------------
396 -- Wrapper module that calls all Primary modules
397 PROCEDURE Load_Dimension (
398   x_rows_rejected_accum        OUT NOCOPY NUMBER
399   ,x_rows_to_load               OUT NOCOPY NUMBER
400   ,p_execution_mode             IN       VARCHAR2
401   ,p_object_id                 IN       NUMBER
402   ,p_object_definition_id       IN       NUMBER
403   ,p_dimension_varchar_label    IN       VARCHAR2
404   ,p_master_request_id          IN       NUMBER);
405 
406 
407 -- Primary Modules:  These are procedures called from Load_Dimension
408 PROCEDURE Engine_Master_Prep ( p_dimension_varchar_label   IN  VARCHAR2
409                               ,p_object_definition_id      IN         NUMBER
410                               ,p_execution_mode            IN         VARCHAR2
411                               ,x_dimension_id               OUT NOCOPY NUMBER
412                               ,x_target_b_table             OUT NOCOPY VARCHAR2
413                               ,x_target_tl_table            OUT NOCOPY VARCHAR2
414                               ,x_target_attr_table          OUT NOCOPY VARCHAR2
415                               ,x_source_b_table             OUT NOCOPY VARCHAR2
416                               ,x_source_tl_table            OUT NOCOPY VARCHAR2
417                               ,x_source_attr_table          OUT NOCOPY VARCHAR2
418                               ,x_member_col                 OUT NOCOPY VARCHAR2
419                               ,x_member_dc_col              OUT NOCOPY VARCHAR2
420                               ,x_member_t_dc_col            OUT NOCOPY VARCHAR2
421                               ,x_member_name_col            OUT NOCOPY VARCHAR2
422                               ,x_member_t_name_col          OUT NOCOPY VARCHAR2
423                               ,x_member_description_col     OUT NOCOPY VARCHAR2
424                               ,x_value_set_required_flag    OUT NOCOPY VARCHAR2
425                               ,x_user_defined_flag          OUT NOCOPY VARCHAR2
426                               ,x_simple_dimension_flag      OUT NOCOPY VARCHAR2
427                               ,x_shared_dimension_flag      OUT NOCOPY VARCHAR2
428                               ,x_table_handler_name         OUT NOCOPY VARCHAR2
429                               ,x_composite_dimension_flag   OUT NOCOPY VARCHAR2
430                               ,x_structure_id               OUT NOCOPY NUMBER
431                               ,x_exec_mode_clause           OUT NOCOPY VARCHAR2
432                               ,x_eng_master_prep_status     OUT NOCOPY VARCHAR2
433                               ,x_hier_table_name            OUT NOCOPY VARCHAR2
434                               ,x_hier_dimension_flag        OUT NOCOPY VARCHAR2
435                               ,x_member_id_method_code      OUT NOCOPY VARCHAR2
436                               ,x_rows_to_load               OUT NOCOPY NUMBER
437                               ,x_date_format_mask           OUT NOCOPY VARCHAR2
438                               );
439 
440 
441 
442 PROCEDURE Register_process_execution (p_object_id IN NUMBER
443                                      ,p_obj_def_id IN NUMBER
444                                      ,p_execution_mode IN VARCHAR2
445                                      ,x_completion_status OUT NOCOPY VARCHAR2);
446 
447 PROCEDURE Eng_Master_Post_Proc (p_object_id IN NUMBER
448                                ,p_rows_rejected_accum IN NUMBER
449                                ,p_rows_to_load IN NUMBER);
450 
451 
452 PROCEDURE Post_dim_status (p_dimension_id   IN  VARCHAR2
453                           ,p_source_system_dc IN VARCHAR2
454                           ,p_source_attr_table IN VARCHAR2);
455 
456 /*--For Composite Dimension Loader
457 PROCEDURE Process_Rows (x_status OUT NOCOPY NUMBER
458                       ,x_message OUT NOCOPY VARCHAR2
459                       ,x_rows_processed OUT NOCOPY NUMBER
460                       ,x_rows_loaded OUT NOCOPY NUMBER
461                       ,x_rows_rejected OUT NOCOPY NUMBER
462                       ,p_eng_sql IN VARCHAR2
463                       ,p_data_slc IN VARCHAR2
464                       ,p_proc_num IN VARCHAR2
465                       ,p_slice_id IN VARCHAR2
466                       ,p_fetch_limit IN NUMBER
467                       ,p_load_type IN VARCHAR2
468                       ,p_dimension_varchar_label IN VARCHAR2
469                       ,p_execution_mode IN VARCHAR2
470                       ,p_structure_id IN NUMBER);
471 
472 /*PROCEDURE Pre_Process (x_pre_process_status OUT NOCOPY NUMBER
473                        ,p_execution_mode IN VARCHAR2
474                        ,p_dimension_varchar_label IN VARCHAR2);
475 
476 PROCEDURE Get_Display_Codes (p_dimension_varchar_label IN VARCHAR2,
477                              p_structure_id            IN NUMBER);
478 
479 PROCEDURE Metadata_Initialize(p_dimension_varchar_label IN VARCHAR2);*/
480 
481 PROCEDURE Get_Put_Messages (p_msg_count       IN   NUMBER
482                            ,p_msg_data        IN   VARCHAR2);
483 
484 procedure get_dimension_info (p_dimension_varchar_label    IN         VARCHAR2
485                              ,x_dimension_id               OUT NOCOPY NUMBER
486                              ,x_target_b_table             OUT NOCOPY VARCHAR2
487                              ,x_target_tl_table            OUT NOCOPY VARCHAR2
488                              ,x_target_attr_table          OUT NOCOPY VARCHAR2
489                              ,x_source_b_table             OUT NOCOPY VARCHAR2
490                              ,x_source_tl_table            OUT NOCOPY VARCHAR2
491                              ,x_source_attr_table          OUT NOCOPY VARCHAR2
492                              ,x_member_col                 OUT NOCOPY VARCHAR2
493                              ,x_member_dc_col              OUT NOCOPY VARCHAR2
494                              ,x_member_t_dc_col            OUT NOCOPY VARCHAR2
495                              ,x_member_name_col            OUT NOCOPY VARCHAR2
496                              ,x_member_t_name_col          OUT NOCOPY VARCHAR2
497                              ,x_member_description_col     OUT NOCOPY VARCHAR2
498                              ,x_value_set_required_flag    OUT NOCOPY VARCHAR2
499                              ,x_user_defined_flag          OUT NOCOPY VARCHAR2
500                              ,x_simple_dimension_flag      OUT NOCOPY VARCHAR2
501                              ,x_shared_dimension_flag      OUT NOCOPY VARCHAR2
502                              ,x_hier_table_name            OUT NOCOPY VARCHAR2
503                              ,x_hier_dimension_flag        OUT NOCOPY VARCHAR2
504                              ,x_member_id_method_code      OUT NOCOPY VARCHAR2
505                              ,x_table_handler_name         OUT NOCOPY VARCHAR2
506                              ,x_composite_dimension_flag   OUT NOCOPY VARCHAR2
507                              ,x_structure_id               OUT NOCOPY NUMBER);
508 
509 
510    procedure build_mbr_select_stmt  (p_load_type IN VARCHAR2
511                                 ,p_dimension_varchar_label IN VARCHAR2
512                                 ,p_dimension_id IN NUMBER
513                                 ,p_target_b_table IN VARCHAR2
514                                 ,p_target_tl_table IN VARCHAR2
515                                 ,p_source_b_table IN VARCHAR2
516                                 ,p_source_tl_table IN VARCHAR2
517                                 ,p_member_dc_col IN VARCHAR2
518                                 ,p_member_t_dc_col IN VARCHAR2
519                                 ,p_member_t_name_col IN VARCHAR2
520                                 ,p_member_description_col IN VARCHAR2
521                                 ,p_value_set_required_flag IN VARCHAR2
522                                 ,p_shared_dimension_flag IN VARCHAR2
523                                 ,p_hier_dimension_flag IN VARCHAR2
524                                 ,p_exists_flag IN VARCHAR2
525                                 ,p_exec_mode_clause IN VARCHAR2
526                                 ,x_select_stmt OUT NOCOPY VARCHAR2);
527 
528 procedure build_bad_tl_select_stmt  (p_load_type IN VARCHAR2
529                                 ,p_dimension_varchar_label IN VARCHAR2
530                                 ,p_dimension_id IN NUMBER
531                                 ,p_target_b_table IN VARCHAR2
532                                 ,p_target_tl_table IN VARCHAR2
533                                 ,p_source_b_table IN VARCHAR2
534                                 ,p_source_tl_table IN VARCHAR2
535                                 ,p_member_dc_col IN VARCHAR2
536                                 ,p_member_t_dc_col IN VARCHAR2
537                                 ,p_value_set_required_flag IN VARCHAR2
538                                 ,p_shared_dimension_flag IN VARCHAR2
539                                 ,p_hier_dimension_flag IN VARCHAR2
540                                 ,p_exec_mode_clause IN VARCHAR2
541                                 ,x_select_stmt OUT NOCOPY VARCHAR2);
542 
543 procedure build_tl_ro_mbr_upd_stmt  (p_load_type IN VARCHAR2
544                                    ,p_dimension_varchar_label IN VARCHAR2
545                                    ,p_dimension_id IN NUMBER
546                                    ,p_source_tl_table IN VARCHAR2
547                                    ,p_target_b_table IN VARCHAR2
548                                    ,p_member_dc_col IN VARCHAR2
549                                    ,p_member_t_dc_col IN VARCHAR2
550                                    ,p_exec_mode_clause IN VARCHAR2
551                                    ,p_shared_dimension_flag IN VARCHAR2
552                                    ,p_value_set_required_flag IN VARCHAR2
553                                    ,x_update_stmt OUT NOCOPY VARCHAR2);
554 
555 
556 procedure build_bad_lang_upd_stmt  (p_load_type IN VARCHAR2
557                                    ,p_dimension_varchar_label IN VARCHAR2
558                                    ,p_dimension_id IN NUMBER
559                                    ,p_source_tl_table IN VARCHAR2
560                                    ,p_exec_mode_clause IN VARCHAR2
561                                    ,p_shared_dimension_flag IN VARCHAR2
562                                    ,p_value_set_required_flag IN VARCHAR2
563                                    ,x_update_stmt OUT NOCOPY VARCHAR2);
564 
565 procedure build_enable_update_stmt (p_dimension_varchar_label IN VARCHAR2
566                                 ,p_dimension_id IN NUMBER
567                                 ,p_load_type IN VARCHAR2
568                                 ,p_target_b_table IN VARCHAR2
569                                 ,p_member_col IN VARCHAR2
570                                 ,p_member_dc_col IN VARCHAR2
571                                 ,p_value_set_required_flag IN VARCHAR2
572                                 ,x_update_stmt OUT NOCOPY VARCHAR2);
573 
574 procedure build_tl_update_stmt (p_dimension_varchar_label IN VARCHAR2
575                                 ,p_dimension_id IN NUMBER
576                                 ,p_load_type IN VARCHAR2
577                                 ,p_target_b_table IN VARCHAR2
578                                 ,p_target_tl_table IN VARCHAR2
579                                 ,p_member_col IN VARCHAR2
580                                 ,p_member_dc_col IN VARCHAR2
581                                 ,p_member_name_col IN VARCHAR2
582                                 ,p_member_description_col IN VARCHAR2
583                                 ,p_value_set_required_flag IN VARCHAR2
584                                 ,x_update_stmt OUT NOCOPY VARCHAR2);
585 
586 procedure build_tl_dupname_stmt (p_dimension_varchar_label IN VARCHAR2
587                                 ,p_dimension_id IN NUMBER
588                                 ,p_load_type IN VARCHAR2
589                                 ,p_target_b_table IN VARCHAR2
590                                 ,p_target_tl_table IN VARCHAR2
591                                 ,p_member_col IN VARCHAR2
592                                 ,p_member_dc_col IN VARCHAR2
593                                 ,p_member_name_col IN VARCHAR2
594                                 ,p_value_set_required_flag IN VARCHAR2
595                                 ,p_calling_mode IN VARCHAR2
596                                 ,x_select_stmt OUT NOCOPY VARCHAR2);
597 
598 procedure build_does_attr_exist_stmt (p_target_attr_table IN VARCHAR2
599                                 ,p_target_b_table IN VARCHAR2
600                                 ,p_member_col IN VARCHAR2
601                                 ,p_member_dc_col IN VARCHAR2
602                                 ,p_value_set_required_flag IN VARCHAR2
603                                 ,p_version_flag IN VARCHAR2
604                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
605 
606 procedure build_does_multattr_exist_stmt (p_target_attr_table IN VARCHAR2
607                                 ,p_target_b_table IN VARCHAR2
608                                 ,p_member_col IN VARCHAR2
609                                 ,p_member_dc_col IN VARCHAR2
610                                 ,p_value_set_required_flag IN VARCHAR2
611                                 ,p_attr_value_column_name IN VARCHAR2
612                                 ,p_attr_assign_vs_id IN NUMBER
613                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
614 
615 
616    procedure build_get_identical_assgn_stmt (p_target_attr_table IN VARCHAR2
617                                 ,p_target_b_table IN VARCHAR2
618                                 ,p_member_col IN VARCHAR2
619                                 ,p_member_dc_col IN VARCHAR2
620                                 ,p_value_set_required_flag IN VARCHAR2
621                                 ,p_date_format_mask IN VARCHAR2
622                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
623 
624 procedure build_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
625                                 ,p_dimension_id IN NUMBER
626                                 ,p_source_b_table IN VARCHAR2
627                                 ,p_source_attr_table IN VARCHAR2
628                                 ,p_target_b_table IN VARCHAR2
629                                 ,p_member_t_dc_col IN VARCHAR2
630                                 ,p_member_dc_col IN VARCHAR2
631                                 ,p_member_col IN VARCHAR2
632                                 ,p_value_set_required_flag IN VARCHAR2
633                                 ,p_shared_dimension_flag IN VARCHAR2
634                                 ,p_hier_dimension_flag IN VARCHAR2
635                                 ,p_outer_join_flag IN VARCHAR2
636                                 ,p_specific_member_flag IN VARCHAR2
637                                 ,p_exec_mode_clause IN VARCHAR2
638                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
639 
640 procedure build_attr_lvlspec_select_stmt (p_dimension_varchar_label IN VARCHAR2
641                                 ,p_dimension_id IN NUMBER
642                                 ,p_source_b_table IN VARCHAR2
643                                 ,p_source_attr_table IN VARCHAR2
644                                 ,p_target_b_table IN VARCHAR2
645                                 ,p_member_t_dc_col IN VARCHAR2
646                                 ,p_member_dc_col IN VARCHAR2
647                                 ,p_value_set_required_flag IN VARCHAR2
648                                 ,p_shared_dimension_flag IN VARCHAR2
649                                 ,p_hier_dimension_flag IN VARCHAR2
650                                 ,p_outer_join_flag IN VARCHAR2
651                                 ,p_exec_mode_clause IN VARCHAR2
652                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2);
653 
654 
655 procedure build_bad_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
656                                 ,p_dimension_id IN NUMBER
657                                 ,p_source_b_table IN VARCHAR2
658                                 ,p_source_tl_table IN VARCHAR2
659                                 ,p_source_attr_table IN VARCHAR2
660                                 ,p_target_b_table IN VARCHAR2
661                                 ,p_member_t_dc_col IN VARCHAR2
662                                 ,p_member_dc_col IN VARCHAR2
663                                 ,p_value_set_required_flag IN VARCHAR2
664                                 ,p_shared_dimension_flag IN VARCHAR2
665                                 ,p_exec_mode_clause IN VARCHAR2
666                                 ,x_bad_attr_select_stmt OUT NOCOPY VARCHAR2);
667 
668 
669 procedure verify_attr_member   (p_attribute_varchar_label IN VARCHAR2
670                                 ,p_dimension_varchar_label IN VARCHAR2
671                                 ,p_attr_member_dc IN VARCHAR2
672                                 ,p_attr_member_vs_dc IN VARCHAR2
673                                 ,x_attr_success OUT NOCOPY VARCHAR2
674                                 ,x_member OUT NOCOPY VARCHAR2);
675 
676 
677 procedure build_member_exists_stmt (p_member_table IN VARCHAR2
678                                 ,p_member_col IN VARCHAR2
679                                 ,p_member_dc_col IN VARCHAR2
680                                 ,p_value_set_required_flag IN VARCHAR2
681                                 ,x_member_exists_stmt OUT NOCOPY VARCHAR2);
682 
683 procedure build_bad_new_mbrs_stmt (p_load_type IN VARCHAR2
684                                 ,p_dimension_varchar_label IN VARCHAR2
685                                 ,p_source_b_table IN VARCHAR2
686                                 ,p_source_tl_table IN VARCHAR2
687                                 ,p_target_b_table IN VARCHAR2
688                                 ,p_member_t_dc_col IN VARCHAR2
689                                 ,p_member_dc_col IN VARCHAR2
690                                 ,p_value_set_required_flag IN VARCHAR2
691                                 ,p_shared_dimension_flag IN VARCHAR2
692                                 ,p_exec_mode_clause IN VARCHAR2
693                                 ,x_bad_member_select_stmt OUT NOCOPY VARCHAR2);
694 
695 procedure build_bad_attr_vers_stmt (p_dimension_varchar_label IN VARCHAR2
696                                    ,p_source_attr_table IN VARCHAR2
697                                    ,p_shared_dimension_flag IN VARCHAR2
698                                    ,p_exec_mode_clause IN VARCHAR2
699                                    ,x_bad_attr_vers_select_stmt OUT NOCOPY VARCHAR2);
700 
701 procedure get_attr_version (p_dimension_varchar_label IN VARCHAR2
702                            ,p_attribute_varchar_label IN VARCHAR2
703                            ,p_version_display_code IN VARCHAR2
704                            ,x_version_id OUT NOCOPY NUMBER);
705 
706 procedure build_insert_member_stmt (p_table_handler_name IN VARCHAR2
707                                    ,p_dimension_id IN NUMBER
708                                    ,p_value_set_required_flag IN VARCHAR2
709                                    ,p_hier_dimension_flag IN VARCHAR2
710                                    ,p_simple_dimension_flag IN VARCHAR2
711                                    ,p_member_id_method_code VARCHAR2
712                                    ,p_member_col IN VARCHAR2
713                                    ,p_member_dc_col IN VARCHAR
714                                    ,p_member_name_col IN VARCHAR2
715                                    ,x_insert_member_stmt OUT NOCOPY VARCHAR2);
716 
717 procedure build_insert_attr_stmt (p_target_attr_table IN VARCHAR2
718                                  ,p_target_b_table IN VARCHAR2
719                                  ,p_member_col IN VARCHAR2
720                                  ,p_member_dc_col IN VARCHAR2
721                                  ,p_value_set_required_flag IN VARCHAR2
722                                  ,x_insert_attr_stmt OUT NOCOPY VARCHAR2);
723 
724 
725 procedure build_status_update_stmt (p_source_table IN VARCHAR2
726                                    ,x_update_status_stmt OUT NOCOPY VARCHAR2);
727 
728 procedure build_dep_status_update_stmt (p_dimension_varchar_label IN VARCHAR2
729                                        ,p_source_table IN VARCHAR2
730                                        ,p_member_t_dc_col IN VARCHAR2
731                                        ,p_value_set_required_flag IN VARCHAR2
732                                        ,x_update_status_stmt OUT NOCOPY VARCHAR2);
733 
734 procedure build_attrlab_update_stmt (p_dimension_varchar_label IN VARCHAR2
735                                       ,p_source_attr_table IN VARCHAR2
736                                       ,p_shared_dimension_flag IN VARCHAR2
737                                       ,p_exec_mode_clause IN VARCHAR2
738                                       ,x_update_status_stmt OUT NOCOPY VARCHAR2);
739 
740 procedure build_not_user_label_upd_stmt (p_dimension_varchar_label IN VARCHAR2
741                                       ,p_source_attr_table IN VARCHAR2
742                                       ,p_shared_dimension_flag IN VARCHAR2
743                                       ,p_exec_mode_clause IN VARCHAR2
744                                       ,x_update_status_stmt OUT NOCOPY VARCHAR2);
745 
746 procedure build_delete_stmt (p_source_table IN VARCHAR2
747                             ,x_delete_stmt OUT NOCOPY VARCHAR2);
748 
749 procedure build_special_delete_stmt (p_source_table IN VARCHAR2
750                                     ,x_delete_stmt OUT NOCOPY VARCHAR2);
751 
752 procedure build_remain_mbr_select_stmt  (p_load_type IN VARCHAR2
753                                         ,p_dimension_id IN NUMBER
754                                         ,p_dimension_varchar_label IN VARCHAR2
755                                         ,p_shared_dimension_flag IN VARCHAR2
756                                         ,p_value_set_required_flag IN VARCHAR2
757                                         ,p_hier_dimension_flag IN VARCHAR2
758                                         ,p_source_b_table IN VARCHAR2
759                                         ,p_target_b_table IN VARCHAR2
760                                         ,p_member_col IN VARCHAR2
761                                         ,p_member_dc_col IN VARCHAR2
762                                         ,p_member_t_dc_col IN VARCHAR2
763                                         ,p_exec_mode_clause IN VARCHAR2
764                                         ,x_remain_mbr_select_stmt OUT NOCOPY VARCHAR2);
765 
766 procedure build_dimgrp_update_stmt (p_target_b_table IN VARCHAR2
767                                    ,p_value_set_required_flag IN VARCHAR2
768                                    ,p_member_dc_col IN VARCHAR2
769                                    ,x_update_stmt OUT NOCOPY VARCHAR2);
770 
771 procedure build_attr_update_stmt (p_target_attr_table IN VARCHAR2
772                                  ,p_target_b_table IN VARCHAR2
773                                  ,p_member_dc_col IN VARCHAR2
774                                  ,p_member_col IN VARCHAR2
775                                  ,p_value_set_required_flag IN VARCHAR2
776                                  ,x_update_stmt OUT NOCOPY VARCHAR2);
777 
778 procedure build_src_sys_select_stmt (p_dimension_varchar_label IN VARCHAR2
779                                     ,p_source_attr_table IN VARCHAR2
780                                     ,p_shared_dimension_flag IN VARCHAR2
781                                     ,x_src_sys_select_stmt OUT NOCOPY VARCHAR2);
782 
783 procedure get_mp_rows_rejected (x_rows_rejected OUT NOCOPY NUMBER
784                                ,x_rows_loaded OUT NOCOPY NUMBER);
785 
786 procedure build_seq_enf_hiercount_stmt (p_value_set_required_flag IN VARCHAR2
787                                  ,p_hier_table_name IN VARCHAR2
788                                  ,x_select_stmt OUT NOCOPY VARCHAR2);
789 
790 procedure calp_date_overlap_check(x_rows_rejected OUT NOCOPY NUMBER
791                                  ,p_operation_mode IN VARCHAR2);
792 
793 procedure build_calp_interim_insert_stmt (x_insert_calp_stmt OUT NOCOPY VARCHAR2
794                                          ,x_insert_calp_attr_stmt OUT NOCOPY VARCHAR2);
795 
796 procedure build_calp_status_update_stmt (p_operation_mode IN VARCHAR2
797                                         ,p_source_table IN VARCHAR2
798                                         ,x_update_status_stmt OUT NOCOPY VARCHAR2);
799 
800 procedure build_calp_delete_stmt (p_source_table IN VARCHAR2
801                                  ,p_operation_mode IN VARCHAR2
802                                  ,x_calp_delete_stmt OUT NOCOPY VARCHAR2);
803 
804 
805 procedure truncate_calp_interim;
806 
807 procedure get_attr_assign_calp          (x_cal_period_id OUT NOCOPY VARCHAR2
808                                         ,x_record_status OUT NOCOPY VARCHAR2
809                                         ,p_calendar_dc IN VARCHAR2
810                                         ,p_dimension_group_dc IN VARCHAR2
811                                         ,p_end_date IN DATE
812                                         ,p_cal_period_number IN NUMBER);
813 
814 
815 procedure raise_member_bus_event (p_dimension_varchar_label IN VARCHAR2);
816 
817 -----------------------------------------------------------------------------
818 --  Package bodies for functions/procedures
819 -----------------------------------------------------------------------------
820 
821 -------------------------------------------------------------
822 --  Procedure for getting number of rejected rows from the MP sub-processes
823 --  Bug#4355484 also gets the number of rows loaded so that we can figure
824 --  out if we created new members or not
825 -------------------------------------------------------------
826 procedure get_mp_rows_rejected (x_rows_rejected OUT NOCOPY NUMBER
827                                ,x_rows_loaded OUT NOCOPY NUMBER) IS
828 
829 BEGIN
830 
831 
832    SELECT NVL(SUM(rows_rejected),0), NVL(SUM(rows_loaded),0)
833    INTO x_rows_rejected, x_rows_loaded
834    FROM fem_mp_process_ctl_t
835    WHERE req_id = gv_request_id;
836 
837 END get_mp_rows_rejected;
838 -------------------------------------------------------------
839 --  Procedure for getting messages off the stack
840 -------------------------------------------------------------
841 PROCEDURE Get_Put_Messages (
842    p_msg_count       IN   NUMBER,
843    p_msg_data        IN   VARCHAR2
844 )
845 IS
846 
847 v_msg_count        NUMBER;
848 v_msg_data         VARCHAR2(4000);
849 v_msg_out          NUMBER;
850 v_message          VARCHAR2(4000);
851 
852 v_block  CONSTANT  VARCHAR2(80) :=
853    'fem.plsql.fem_dim_member_loader_pkg.get_put_messages';
854 
855 BEGIN
856 
857 FEM_ENGINES_PKG.TECH_MESSAGE
858  (p_severity => c_log_level_2,
859   p_module => v_block||'.msg_count',
860   p_msg_text => p_msg_count);
861 
862 v_msg_data := p_msg_data;
863 
864 IF (p_msg_count = 1)
865 THEN
866    FND_MESSAGE.Set_Encoded(v_msg_data);
867    v_message := FND_MESSAGE.Get;
868 
869    FEM_ENGINES_PKG.User_Message(
870      p_msg_text => v_message);
871 
872    FEM_ENGINES_PKG.TECH_MESSAGE
873     (p_severity => c_log_level_2,
874      p_module => v_block||'.msg_data',
875      p_msg_text => v_message);
876 
877 ELSIF (p_msg_count > 1)
878 THEN
879    FOR i IN 1..p_msg_count
880    LOOP
881       FND_MSG_PUB.Get(
882       p_msg_index => i,
883       p_encoded => c_false,
884       p_data => v_message,
885       p_msg_index_out => v_msg_out);
886 
887       FEM_ENGINES_PKG.User_Message(
888         p_msg_text => v_message);
889 
890       FEM_ENGINES_PKG.TECH_MESSAGE
891        (p_severity => c_log_level_2,
892         p_module => v_block||'.msg_data',
893         p_msg_text => v_message);
894 
895    END LOOP;
896 END IF;
897 
898    FND_MSG_PUB.Initialize;
899 
900 END Get_Put_Messages;
901 
902 
903 /*===========================================================================+
904  | PROCEDURE
905  |              Raise_member_bus_event
906  |
907  | DESCRIPTION
908  |                 Raises a business event for when a new member is
909  |                 created or updated
910  |
911  | SCOPE - PRIVATE
912  |
913  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
914  |
915  | ARGUMENTS  : IN:
916  |
917  |              OUT:
918  |
919  |              IN/ OUT:
920  |
921  | RETURNS    : NONE
922  |
923  | NOTES
924  |
925  |
926  | MODIFICATION HISTORY
927  |   Rob Flippo   25-MAY-05  Created
928  +===========================================================================*/
929 
930 procedure raise_member_bus_event (p_dimension_varchar_label IN VARCHAR2) IS
931 
932     v_param_list                wf_parameter_list_t;
933     v_event_sequence            NUMBER;
934     c_proc_name VARCHAR2(30) := 'Raise_bus_event';
935 BEGIN
936    FEM_ENGINES_PKG.TECH_MESSAGE
937     (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
938 
939 
940    SELECT FEM_DHM_METADATA_OPS_KEY_S.nextval
941    INTO v_event_sequence
942    FROM dual;
943 
944 
945    WF_EVENT.addparametertolist
946      (p_name          => 'DIMENSION_VARCHAR_LABEL',
947       p_value         => p_dimension_varchar_label,
948       p_parameterlist => v_param_list);
949 
950 
951  WF_Event.Raise( p_event_name => 'oracle.apps.fem.dhm.dimension.event'
952                 ,p_event_key  => v_event_sequence
953                 ,p_parameters => v_param_list);
954 
955    FEM_ENGINES_PKG.TECH_MESSAGE
956     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
957 
958 
959 END raise_member_bus_event;
960 
961 
962 /*===========================================================================+
963  | PROCEDURE
964  |              Engine_Master_Prep
965  |
966  | DESCRIPTION
967  |                 Called from Load Dimension
968  |                 Validates input parameters and gets dimension metadata
969  |                 for the run
970  | SCOPE - PRIVATE
971  |
972  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
973  |
974  | ARGUMENTS  : IN:
975  |
976  |
977  |              OUT:
978  |
979  |
980  |
981  |              IN/ OUT:
982  |
983  | RETURNS    : NONE
984  |
985  | NOTES
986  |    Added SQL verification on having multiple versions for the dimension
987  |    marked as "Default = Y".  Since this data error causes unexpected behavior
988  |    in the loader, the loader throws an exception for this and requires the
989  |    user to clean up the versions for that dimension before proceeding with
990  |    the load
991  |
992  | MODIFICATION HISTORY
993  |  Rob Flippo  27-FEB-04  Created
994  |  Rob Flippo  21-SEP-04  Bug#3900960  Add mesaging for when 0 rows found
995  |                         for Snapshot loading
996  |  Rob Flippo  16-MAR-05  Bug#4244082 Added x_hier_table_name
997  |  Rob Flippo  24-JAN-06  Bug#4927869 - Changed ICX Date format to
998  |                         FEM_INTF_ATTR_DATE_FORMAT_MASK;
999  +===========================================================================*/
1000 
1001 PROCEDURE Engine_Master_Prep ( p_dimension_varchar_label   IN  VARCHAR2
1002                               ,p_object_definition_id      IN         NUMBER
1003                               ,p_execution_mode            IN         VARCHAR2
1004                               ,x_dimension_id               OUT NOCOPY NUMBER
1005                               ,x_target_b_table             OUT NOCOPY VARCHAR2
1006                               ,x_target_tl_table            OUT NOCOPY VARCHAR2
1007                               ,x_target_attr_table          OUT NOCOPY VARCHAR2
1008                               ,x_source_b_table             OUT NOCOPY VARCHAR2
1009                               ,x_source_tl_table            OUT NOCOPY VARCHAR2
1010                               ,x_source_attr_table          OUT NOCOPY VARCHAR2
1011                               ,x_member_col                 OUT NOCOPY VARCHAR2
1012                               ,x_member_dc_col              OUT NOCOPY VARCHAR2
1013                               ,x_member_t_dc_col            OUT NOCOPY VARCHAR2
1014                               ,x_member_name_col            OUT NOCOPY VARCHAR2
1015                               ,x_member_t_name_col          OUT NOCOPY VARCHAR2
1016                               ,x_member_description_col     OUT NOCOPY VARCHAR2
1017                               ,x_value_set_required_flag    OUT NOCOPY VARCHAR2
1018                               ,x_user_defined_flag          OUT NOCOPY VARCHAR2
1019                               ,x_simple_dimension_flag      OUT NOCOPY VARCHAR2
1020                               ,x_shared_dimension_flag      OUT NOCOPY VARCHAR2
1021                               ,x_table_handler_name         OUT NOCOPY VARCHAR2
1022                               ,x_composite_dimension_flag   OUT NOCOPY VARCHAR2
1023                               ,x_structure_id               OUT NOCOPY NUMBER
1024                               ,x_exec_mode_clause           OUT NOCOPY VARCHAR2
1025                               ,x_eng_master_prep_status     OUT NOCOPY VARCHAR2
1026                               ,x_hier_table_name            OUT NOCOPY VARCHAR2
1027                               ,x_hier_dimension_flag        OUT NOCOPY VARCHAR2
1028                               ,x_member_id_method_code      OUT NOCOPY VARCHAR2
1029                               ,x_rows_to_load               OUT NOCOPY NUMBER
1030                               ,x_date_format_mask           OUT NOCOPY VARCHAR2
1031                               )
1032 IS
1033 
1034 -- Variable for validating if the Date Format Mask is valid
1035    v_date_format_result              DATE;
1036    c_proc_name VARCHAR2(30) := 'Engine_Maser_Prep';
1037    v_default_version_count NUMBER;
1038    v_temp_attribute VARCHAR2(30);  -- temporary holding variable for attribute
1039                                    -- when there is more than 1 default version
1040                                    -- defined for it
1041    v_sql_stmt          VARCHAR2(4000);  -- variable for holding NDS statements
1042    v_dim_label_where_cond VARCHAR2(1000);
1043 
1044    -- for testing the date format
1045    v_test_date DATE;
1046 
1047    -- variables for counting rows in the source tables
1048    v_source_b_count    NUMBER :=0;
1049    v_source_tl_count   NUMBER :=0;
1050    v_source_attr_count NUMBER :=0;
1051    v_source_dimgrpb_count NUMBER :=0;
1052    v_source_dimgrptl_count NUMBER :=0;
1053    v_obj_def_display_name VARCHAR2(150); -- translatable name for the load operation
1054 
1055    CURSOR c_attr_vers (p_dimension_id NUMBER) IS
1056       SELECT attribute_id, attribute_varchar_label
1057       FROM fem_dim_attributes_b
1058       WHERE dimension_id = p_dimension_id;
1059 
1060 BEGIN
1061 
1062    FEM_ENGINES_PKG.TECH_MESSAGE
1063     (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
1064 
1065 /**************************************************************
1066 RCF 5/31/2005 Bug#3923485  Commenting out date_format_mask validation
1067               since we are going to use the ICX: Date Format Mask profile option
1068    BEGIN
1069       IF p_date_format_mask IS NULL THEN
1070          RAISE e_invalid_date_mask;
1071       END IF;
1072       v_date_format_result := to_date((to_char(sysdate,p_date_format_mask)),p_date_format_mask);
1073    EXCEPTION
1074       WHEN e_invalid_date_result THEN
1075          RAISE e_invalid_date_mask;
1076       WHEN e_invalid_date_month THEN
1077          RAISE e_invalid_date_mask;
1078    END;
1079 ***************************************************************/
1080 
1081    ------------------------------------------------------------------------------
1082    -- Bug#4927869 Date format mask comes from FEM_INTF_ATTR_DATE_FORMAT_MASK profile option
1083    ------------------------------------------------------------------------------
1084    x_date_format_mask:= FND_PROFILE.Value_Specific(
1085                         'FEM_INTF_ATTR_DATE_FORMAT_MASK',null,null,null);
1086 
1087    BEGIN
1088       IF x_date_format_mask IS NULL THEN
1089          RAISE e_invalid_date_mask;
1090       ELSE
1091          v_test_date := to_date((to_char(sysdate,x_date_format_mask)),x_date_format_mask);
1092       END IF;
1093    EXCEPTION
1094       WHEN OTHERS THEN
1095          RAISE e_invalid_date_mask;
1096    END;
1097 
1098 
1099    ------------------------------------------------------------------------------
1100    -- Validate the Dimension input parameter and get the source and target table
1101    -- names for the members and translatable names/descriptions
1102    ------------------------------------------------------------------------------
1103 
1104    get_dimension_info (p_dimension_varchar_label
1105                       ,x_dimension_id
1106                       ,x_target_b_table
1107                       ,x_target_tl_table
1108                       ,x_target_attr_table
1109                       ,x_source_b_table
1110                       ,x_source_tl_table
1111                       ,x_source_attr_table
1112                       ,x_member_col
1113                       ,x_member_dc_col
1114                       ,x_member_t_dc_col
1115                       ,x_member_name_col
1116                       ,x_member_t_name_col
1117                       ,x_member_description_col
1118                       ,x_value_set_required_flag
1119                       ,x_user_defined_flag
1120                       ,x_simple_dimension_flag
1121                       ,x_shared_dimension_flag
1122                       ,x_hier_table_name
1123                       ,x_hier_dimension_flag
1124                       ,x_member_id_method_code
1125                       ,x_table_handler_name
1126                       ,x_composite_dimension_flag
1127                       ,x_structure_id);
1128 
1129    -- Setting the Execution Mode clause for Selects against the interface tables
1130    IF p_execution_mode = 'S' THEN
1131       x_exec_mode_clause := ' IN (''LOAD'')';
1132    ELSE
1133       x_exec_mode_clause := ' LIKE ''%''';
1134    END IF; -- execution mode where condition
1135 
1136    -- Begin comp_dim_loader code
1137    IF x_composite_dimension_flag = 'N' THEN
1138 
1139    -- Verification that only one default version exists
1140    -- for each attribute of the dimension being processed
1141    FOR attr IN c_attr_vers (x_dimension_id) LOOP
1142       SELECT count(*)
1143       INTO v_default_version_count
1144       FROM fem_dim_attr_versions_b
1145       WHERE attribute_id = attr.attribute_id
1146       AND default_version_flag='Y';
1147 
1148       IF (v_default_version_count > 1) THEN
1149          v_temp_attribute := attr.attribute_varchar_label;
1150          RAISE e_mult_default_version;
1151       END IF;
1152    END LOOP;  -- c_attr_vers cursor
1153 
1154    -- Bug#3900960  Raise exception when Snapshot load and 0 rows found
1155    -- in all interface tables
1156    IF x_shared_dimension_flag = 'Y' and x_value_set_required_flag = 'N' THEN
1157       v_dim_label_where_cond :=  ' AND dimension_varchar_label = '''||p_dimension_varchar_label||'''';
1158    ELSE v_dim_label_where_cond := '';
1159    END IF;
1160  END IF;
1161 
1162       FEM_ENGINES_PKG.TECH_MESSAGE
1163        (p_severity => c_log_level_1,
1164         p_module => c_block||'.'||'Engine_Master_Prep',
1165         p_msg_text => 'Check for Source rows');
1166 
1167       v_sql_stmt := 'SELECT count(*) FROM '||x_source_b_table||
1168                     ' WHERE status '||x_exec_mode_clause||
1169                     v_dim_label_where_cond;
1170 
1171       FEM_ENGINES_PKG.TECH_MESSAGE
1172        (p_severity => c_log_level_1,
1173         p_module => c_block||'.'||'Engine_Master_Prep'||'.source_b',
1174         p_msg_text => v_sql_stmt);
1175       execute immediate v_sql_stmt
1176          into v_source_b_count;
1177 
1178    IF x_composite_dimension_flag = 'N' then --
1179 
1180       v_sql_stmt := 'SELECT count(*) FROM '||x_source_tl_table||
1181                     ' WHERE status '||x_exec_mode_clause||
1182                     v_dim_label_where_cond;
1183       FEM_ENGINES_PKG.TECH_MESSAGE
1184        (p_severity => c_log_level_1,
1185         p_module => c_block||'.'||'Engine_Master_Prep'||'.source_tl',
1186         p_msg_text => v_sql_stmt);
1187       execute immediate v_sql_stmt
1188          into v_source_tl_count;
1189 
1190 
1191       IF x_simple_dimension_flag ='N' THEN
1192          v_sql_stmt := 'SELECT count(*) FROM '||x_source_attr_table||
1193                     ' WHERE status '||x_exec_mode_clause||
1194                     v_dim_label_where_cond;
1195       FEM_ENGINES_PKG.TECH_MESSAGE
1196        (p_severity => c_log_level_1,
1197         p_module => c_block||'.'||'Engine_Master_Prep'||'.source_attr',
1198         p_msg_text => v_sql_stmt);
1199          execute immediate v_sql_stmt
1200             into v_source_attr_count;
1201       END IF;
1202 
1203    FEM_ENGINES_PKG.TECH_MESSAGE
1204     (c_log_level_1,c_block||'.'||c_proc_name||'.after attr count',null);
1205 
1206       IF x_hier_dimension_flag = 'Y' THEN
1207          v_sql_stmt := 'SELECT count(*) FROM fem_dimension_grps_b_t '||
1208                        ' WHERE dimension_varchar_label ='||
1209                        ''''||p_dimension_varchar_label||''''||
1210                        ' AND status '||x_exec_mode_clause;
1211          FEM_ENGINES_PKG.TECH_MESSAGE
1212           (p_severity => c_log_level_1,
1213            p_module => c_block||'.'||'Engine_Master_Prep'||'.dimgrp_b',
1214            p_msg_text => v_sql_stmt);
1215          execute immediate v_sql_stmt
1216             into v_source_dimgrpb_count;
1217          v_sql_stmt := 'SELECT count(*) FROM fem_dimension_grps_tl_t '||
1218                        'WHERE dimension_varchar_label ='||
1219                        ''''||p_dimension_varchar_label||''''||
1220                        ' AND status '||x_exec_mode_clause;
1221          FEM_ENGINES_PKG.TECH_MESSAGE
1222           (p_severity => c_log_level_1,
1223            p_module => c_block||'.'||'Engine_Master_Prep'||'.dimgrp_tl',
1224            p_msg_text => v_sql_stmt);
1225 
1226          execute immediate v_sql_stmt
1227             into v_source_dimgrptl_count;
1228       END IF;
1229 
1230       -- If no rows exist in all source tables, quit with an exception
1231       IF --p_execution_mode = 'S' AND
1232          v_source_b_count = 0 AND v_source_tl_count = 0 AND
1233          v_source_attr_count = 0 AND v_source_dimgrpb_count = 0 AND
1234          v_source_dimgrptl_count = 0 THEN
1235          RAISE e_no_rows_to_load;
1236       END IF;
1237    ELSE
1238 
1239        IF --p_execution_mode = 'S' AND
1240          v_source_b_count = 0 THEN
1241 
1242          RAISE e_no_rows_to_load;
1243       END IF;
1244 
1245        x_rows_to_load := v_source_b_count;
1246    END IF;
1247 
1248 
1249      x_rows_to_load := v_source_b_count + v_source_tl_count + v_source_attr_count
1250                        + v_source_dimgrpb_count + v_source_dimgrptl_count;
1251 
1252    x_eng_master_prep_status := 'SUCCESS';
1253 
1254    FEM_ENGINES_PKG.TECH_MESSAGE
1255     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
1256 
1257    EXCEPTION
1258       WHEN e_no_rows_to_load THEN
1259 
1260          SELECT display_name
1261          INTO v_obj_def_display_name
1262          FROM fem_object_definition_vl
1263          WHERE object_definition_id = p_object_definition_id;
1264 
1265          FEM_ENGINES_PKG.TECH_MESSAGE
1266           (p_severity => c_log_level_5
1267           ,p_module => c_block||'.'||c_proc_name||'.Exception'
1268           ,p_app_name => c_fem
1269           ,p_msg_name => G_NO_ROWS_TO_LOAD
1270           ,P_TOKEN1 => 'OPERATION'
1271           ,P_VALUE1 => v_obj_def_display_name);
1272 
1273          FEM_ENGINES_PKG.USER_MESSAGE
1274           (p_app_name => c_fem
1275           ,p_msg_name => G_NO_ROWS_TO_LOAD
1276           ,P_TOKEN1 => 'OPERATION'
1277           ,P_VALUE1 => v_obj_def_display_name);
1278 
1279          x_eng_master_prep_status := 'ERROR';
1280 
1281       WHEN e_invalid_date_mask THEN
1282 
1283          FEM_ENGINES_PKG.TECH_MESSAGE
1284           (p_severity => c_log_level_5
1285           ,p_module => c_block||'.'||c_proc_name||'.Exception'
1286           ,p_app_name => c_fem
1287           ,p_msg_name => G_INVALID_DATE_MASK);
1288 
1289          FEM_ENGINES_PKG.USER_MESSAGE
1290           (p_app_name => c_fem
1291           ,p_msg_name => G_INVALID_DATE_MASK);
1292 
1293          x_eng_master_prep_status := 'ERROR';
1294 
1295 
1296       WHEN e_dimension_not_found THEN
1297 
1298          FEM_ENGINES_PKG.TECH_MESSAGE
1299           (p_severity => c_log_level_5
1300           ,p_module => c_block||'.'||c_proc_name||'.Exception'
1301           ,p_app_name => c_fem
1302           ,p_msg_name => G_DIM_NOT_FOUND);
1303 
1304          FEM_ENGINES_PKG.USER_MESSAGE
1305           (p_app_name => c_fem
1306           ,p_msg_name => G_DIM_NOT_FOUND);
1307 
1308          x_eng_master_prep_status := 'ERROR';
1309 
1310       WHEN e_invalid_simple_dim THEN
1311 
1312          FEM_ENGINES_PKG.TECH_MESSAGE
1313           (p_severity => c_log_level_5
1314           ,p_module => c_block||'.'||c_proc_name||'.Exception'
1315           ,p_app_name => c_fem
1316           ,p_msg_name => G_INVALID_SIMPLE_DIM);
1317 
1318          FEM_ENGINES_PKG.USER_MESSAGE
1319           (p_app_name => c_fem
1320           ,p_msg_name => G_INVALID_SIMPLE_DIM);
1321 
1322          x_eng_master_prep_status := 'ERROR';
1323 
1324       WHEN e_mult_default_version THEN
1325 
1326          FEM_ENGINES_PKG.TECH_MESSAGE
1327           (p_severity => c_log_level_5
1328           ,p_module => c_block||'.'||c_proc_name||'.Exception'
1329           ,p_app_name => c_fem
1330           ,p_msg_name => G_MULT_DEFAULT_VERSION);
1331 
1332          FEM_ENGINES_PKG.USER_MESSAGE
1333           (p_app_name => c_fem
1334           ,p_msg_name => G_MULT_DEFAULT_VERSION
1335           ,P_TOKEN1 => 'ATTRIBUTE_VARCHAR_LABEL'
1336           ,P_VALUE1 => v_temp_attribute);
1337 
1338          x_eng_master_prep_status := 'ERROR';
1339 
1340 
1341 END Engine_Master_Prep;
1342 
1343 /*===========================================================================+
1344  | PROCEDURE
1345  |              Register_process_execution
1346  |
1347  | DESCRIPTION
1348  |    Registers the concurrent request in FEM_PL_REQUESTS, registers
1349  |    the object execution in FEM_PL_OBJECT_EXECUTIION, obtaining an
1350  |    FEM "execution lock, and performs other FEM process initialization
1351  |    steps.
1352  | SCOPE - PRIVATE
1353  |
1354  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1355  |
1356  | ARGUMENTS  : IN:
1357  |
1358  |
1359  |              OUT:
1360  |       x_completion_code returns 0 for success, 2 for failure.
1361  |
1362  |
1363  |              IN/ OUT:
1364  |
1365  | RETURNS    : NONE
1366  |
1367  | NOTES
1368  |
1369  |
1370  | MODIFICATION HISTORY
1371  |    Rob Flippo   27-FEB-04  Created
1372  |
1373  +===========================================================================*/
1374 
1375 PROCEDURE Register_process_execution (p_object_id IN NUMBER
1376                                      ,p_obj_def_id IN NUMBER
1377                                      ,p_execution_mode IN VARCHAR2
1378                                      ,x_completion_status OUT NOCOPY VARCHAR2)
1379 IS
1380 
1381       v_API_return_status  VARCHAR2(30);
1382       v_exec_state       VARCHAR2(30); -- NORMAL, RESTART, RERUN
1383       v_num_msg          NUMBER;
1384       v_stmt_type        fem_pl_tables.statement_type%TYPE;
1385       i                  PLS_INTEGER;
1386       v_msg_count        NUMBER;
1387       v_msg_data         VARCHAR2(4000);
1388       v_previous_request_id NUMBER;
1389 
1390       Exec_Lock_Exists   EXCEPTION;
1391       e_pl_register_req_failed  EXCEPTION;
1392       e_exec_lock_failed  EXCEPTION;
1393 
1394 
1395    BEGIN
1396       x_completion_status := 'SUCCESS';
1397 
1398       FEM_ENGINES_PKG.Tech_Message
1399         (p_severity => c_log_level_2,
1400          p_module   => c_block||'.'||'Register_process_execution',
1401          p_msg_text => 'BEGIN');
1402 
1403    -- Call the FEM_PL_PKG.Register_Request API procedure to register
1404    -- the concurrent request in FEM_PL_REQUESTS.
1405 
1406       FEM_PL_PKG.Register_Request
1407         (P_API_VERSION            => c_api_version,
1408          P_COMMIT                 => c_false,
1409          P_CAL_PERIOD_ID          => null,
1410          P_LEDGER_ID              => null,
1411          P_DATASET_IO_OBJ_DEF_ID  => null,
1412          P_OUTPUT_DATASET_CODE    => null,
1413          P_SOURCE_SYSTEM_CODE     => null,
1414          P_EFFECTIVE_DATE         => null,
1415          P_RULE_SET_OBJ_DEF_ID    => null,
1416          P_RULE_SET_NAME          => null,
1417          P_REQUEST_ID             => gv_request_id,
1418          P_USER_ID                => gv_apps_user_id,
1419          P_LAST_UPDATE_LOGIN      => gv_login_id,
1420          P_PROGRAM_ID             => gv_pgm_id,
1421          P_PROGRAM_LOGIN_ID       => gv_login_id,
1422          P_PROGRAM_APPLICATION_ID => gv_pgm_app_id,
1423          P_EXEC_MODE_CODE         => p_execution_mode,
1424          P_DIMENSION_ID           => null,
1425          P_TABLE_NAME             => null,
1426          P_HIERARCHY_NAME         => null,
1427          X_MSG_COUNT              => v_msg_count,
1428          X_MSG_DATA               => v_msg_data,
1429          X_RETURN_STATUS          => v_API_return_status);
1430 
1431          FEM_ENGINES_PKG.Tech_Message
1432            (p_severity => c_log_level_1,
1433             p_module   => c_block||'.'||'Register_request.v_api_return_status',
1434             p_msg_text => v_API_return_status);
1435 
1436       IF v_API_return_status NOT IN  ('S') THEN
1437          RAISE e_pl_register_req_failed;
1438       END IF;
1439    -- Check for process locks and process overlaps and register
1440    -- the execution in FEM_PL_OBJECT_EXECUTIONS, obtaining an execution lock.
1441 
1442       FEM_PL_PKG.Register_Object_Execution
1443         (P_API_VERSION               => c_api_version,
1444          P_COMMIT                    => c_false,
1445          P_REQUEST_ID                => gv_request_id,
1446          P_OBJECT_ID                 => p_object_id,
1447          P_EXEC_OBJECT_DEFINITION_ID => p_obj_def_id,
1448          P_USER_ID                   => gv_apps_user_id,
1449          P_LAST_UPDATE_LOGIN         => gv_login_id,
1450          P_EXEC_MODE_CODE            => p_execution_mode,
1451          X_EXEC_STATE                => v_exec_state,
1452          X_PREV_REQUEST_ID           => v_previous_request_id,
1453          X_MSG_COUNT                 => v_msg_count,
1454          X_MSG_DATA                  => v_msg_data,
1455          X_RETURN_STATUS             => v_API_return_status);
1456 
1457       IF v_API_return_status NOT IN  ('S') THEN
1458       -- Lock exists or API call failed
1459          RAISE e_exec_lock_failed;
1460       END IF;
1461 
1462       FEM_PL_PKG.Register_Object_Def
1463         (P_API_VERSION               => c_api_version,
1464          P_COMMIT                    => c_false,
1465          P_REQUEST_ID                => gv_request_id,
1466          P_OBJECT_ID                 => p_object_id,
1467          P_OBJECT_DEFINITION_ID      => p_obj_def_id,
1468          P_USER_ID                   => gv_apps_user_id,
1469          P_LAST_UPDATE_LOGIN         => gv_login_id,
1470          X_MSG_COUNT                 => v_msg_count,
1471          X_MSG_DATA                  => v_msg_data,
1472          X_RETURN_STATUS             => v_API_return_status);
1473 
1474       IF v_API_return_status NOT IN  ('S') THEN
1475       -- Lock exists or API call failed
1476          RAISE e_exec_lock_failed;
1477       END IF;
1478 
1479    -- Successful completion
1480 
1481       FEM_ENGINES_PKG.Tech_Message
1482         (p_severity => c_log_level_1,
1483          p_module   => c_block||'.'||'Register_process_execution',
1484          p_msg_text => 'END');
1485 
1486 
1487       COMMIT;
1488 
1489    EXCEPTION
1490       WHEN e_pl_register_req_failed THEN
1491          -- get errors from the stack
1492          Get_Put_Messages (
1493             p_msg_count => v_msg_count,
1494             p_msg_data => v_msg_data);
1495 
1496          -- display user message
1497          FEM_ENGINES_PKG.USER_MESSAGE
1498          (P_APP_NAME => c_fem
1499          ,P_MSG_NAME => G_PL_REG_REQUEST_ERR);
1500 
1501       FEM_ENGINES_PKG.USER_MESSAGE
1502        (P_APP_NAME => c_fem
1503        ,P_MSG_NAME => 'FEM_DIM_MBR_LDR_OBJEXEC');
1504 
1505          x_completion_status := 'ERROR';
1506 
1507          RAISE e_pl_registration_failed;
1508 
1509       WHEN e_exec_lock_failed THEN
1510          -- get errors from the stack
1511          -- Bug#3920599 - remove extraneous messages
1512          --   Get_Put_Messages (
1513          --     p_msg_count => v_msg_count,
1514          --      p_msg_data => v_msg_data);
1515 
1516          --FEM_ENGINES_PKG.USER_MESSAGE
1517          --(P_APP_NAME => c_fem
1518          --,P_MSG_NAME => G_PL_OBJ_EXEC_LOCK_ERR);
1519 
1520          FEM_ENGINES_PKG.USER_MESSAGE
1521           (P_APP_NAME => c_fem
1522           ,P_MSG_NAME => 'FEM_DIM_MBR_LDR_OBJEXEC');
1523 
1524          FEM_ENGINES_PKG.Tech_Message
1525            (p_severity => c_log_level_1,
1526             p_module   => c_block||'.'||'Register_process_execution',
1527             p_msg_text => 'raising Exec_Lock_failed');
1528 
1529          FEM_PL_PKG.Unregister_Request(
1530             P_API_VERSION               => c_api_version,
1531             P_COMMIT                    => c_true,
1532             P_REQUEST_ID                => gv_request_id,
1533             X_MSG_COUNT                 => v_msg_count,
1534             X_MSG_DATA                  => v_msg_data,
1535             X_RETURN_STATUS             => v_API_return_status);
1536       -- Technical messages have already been logged by the API;
1537 
1538          x_completion_status := 'ERROR';
1539 
1540          RAISE e_pl_registration_failed;
1541 
1542    END Register_Process_Execution;
1543 
1544 
1545 /*===========================================================================+
1546  | PROCEDURE
1547  |              Eng_Master_Post_Proc
1548  |
1549  | DESCRIPTION
1550  |    Updates the PL data model with rows rejected and rows loaded
1551  |    Registers the Dimension Load Status
1552  | SCOPE - PRIVATE
1553  |
1554  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1555  |
1556  | ARGUMENTS  : IN:
1557  |
1558  |
1559  |              OUT:
1560  |
1561  |
1562  |
1563  |              IN/ OUT:
1564  |
1565  | RETURNS    : NONE
1566  |
1567  | NOTES
1568  |
1569  |
1570 
1571  | MODIFICATION HISTORY
1572  |    Rob Flippo   4-MAR-04  Created
1573  |    Rob Flippo   16-SEP-2004  Removing the error row count message
1574  |                             Since it is impossible to get an accrurate count
1575  |                             of error rows given that a number of status updates
1576  |                             are bulk
1577  |
1578  +===========================================================================*/
1579 
1580 PROCEDURE Eng_Master_Post_Proc (p_object_id IN NUMBER
1581                                ,p_rows_rejected_accum IN NUMBER
1582                                ,p_rows_to_load IN NUMBER)
1583 IS
1584 
1585    v_execution_status VARCHAR2(30);
1586    v_msg_count NUMBER;
1587    v_msg_data VARCHAR2(4000);
1588    v_API_return_status VARCHAR2(30);
1589    --v_rows_rejected NUMBER;
1590    e_post_process EXCEPTION;
1591    v_rows_loaded NUMBER;
1592 
1593 BEGIN
1594    v_rows_loaded := p_rows_to_load - p_rows_rejected_accum;
1595 
1596    IF p_rows_rejected_accum > 0 THEN
1597       v_execution_status := 'ERROR_RERUN';
1598       gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
1599    ELSE v_execution_status := 'SUCCESS';
1600         gv_concurrent_status := fnd_concurrent.set_completion_status('NORMAL',null);
1601    END IF;
1602    /*****************************************
1603    -- Clean out the data slice table
1604    FEM_MULTI_PROC_PKG.Delete_Data_Slices(
1605       p_req_id => gv_request_id);
1606    ******************************************/
1607 
1608    ------------------------------------
1609    -- Update Object Execution Errors --
1610    ------------------------------------
1611    FEM_PL_PKG.Update_Obj_Exec_Errors(
1612      P_API_VERSION               => c_api_version,
1613      P_COMMIT                    => c_true,
1614      P_REQUEST_ID                => gv_request_id,
1615      P_OBJECT_ID                 => p_object_id,
1616      P_ERRORS_REPORTED           => p_rows_rejected_accum,
1617      P_ERRORS_REPROCESSED        => 0,
1618      P_USER_ID                   => gv_apps_user_id,
1619      P_LAST_UPDATE_LOGIN         => null,
1620      X_MSG_COUNT                 => v_msg_count,
1621      X_MSG_DATA                  => v_msg_data,
1622      X_RETURN_STATUS             => v_API_return_status);
1623 
1624    IF v_API_return_status NOT IN ('S') THEN
1625       RAISE e_post_process;
1626    END IF;
1627 
1628    ----------------------------------
1629    -- Update Number of Rows Loaded --
1630    ----------------------------------
1631 
1632    ------------------------------------
1633    -- Update Object Execution Status --
1634    ------------------------------------
1635 
1636    FEM_PL_PKG.Update_Obj_Exec_Status(
1637      P_API_VERSION               => c_api_version,
1638      P_COMMIT                    => c_true,
1639      P_REQUEST_ID                => gv_request_id,
1640      P_OBJECT_ID                 => p_object_id,
1641      P_EXEC_STATUS_CODE          => v_execution_status,
1642      P_USER_ID                   => gv_apps_user_id,
1643      P_LAST_UPDATE_LOGIN         => null,
1644      X_MSG_COUNT                 => v_msg_count,
1645      X_MSG_DATA                  => v_msg_data,
1646      X_RETURN_STATUS             => v_API_return_status);
1647 
1648    IF v_API_return_status NOT IN ('S') THEN
1649       RAISE e_post_process;
1650    END IF;
1651 
1652    ---------------------------
1653    -- Update Request Status --
1654    ---------------------------
1655    FEM_PL_PKG.Update_Request_Status(
1656      P_API_VERSION               => c_api_version,
1657      P_COMMIT                    => c_true,
1658      P_REQUEST_ID                => gv_request_id,
1659      P_EXEC_STATUS_CODE          => v_execution_status,
1660      P_USER_ID                   => gv_apps_user_id,
1661      P_LAST_UPDATE_LOGIN         => null,
1662      X_MSG_COUNT                 => v_msg_count,
1663      X_MSG_DATA                  => v_msg_data,
1664      X_RETURN_STATUS             => v_API_return_status);
1665 
1666    IF v_API_return_status NOT IN ('S') THEN
1667       RAISE e_post_process;
1668    END IF;
1669 
1670    -------------------
1671    -- Post Messages --
1672    -------------------
1673 
1674    FEM_ENGINES_PKG.USER_MESSAGE
1675     (P_APP_NAME => c_fem
1676     ,P_MSG_NAME => 'FEM_SD_LDR_PROCESS_SUMMARY'
1677     ,P_TOKEN1 => 'LOADNUM'
1678     ,P_VALUE1 => v_rows_loaded
1679     ,P_TOKEN2 => 'REJECTNUM'
1680     ,P_VALUE2 => p_rows_rejected_accum);
1681 
1682    IF v_execution_status = 'ERROR_RERUN' THEN
1683 
1684       FEM_ENGINES_PKG.USER_MESSAGE
1685        (P_APP_NAME => c_fem
1686        ,P_MSG_NAME => 'FEM_EXEC_RERUN');
1687 
1688    ELSE
1689       FEM_ENGINES_PKG.USER_MESSAGE
1690        (P_APP_NAME => c_fem
1691        ,P_MSG_NAME => 'FEM_EXEC_SUCCESS');
1692    END IF;
1693 
1694    FEM_ENGINES_PKG.TECH_MESSAGE
1695     (p_severity => c_log_level_3,
1696      p_module => c_block||'.'||'Eng_Master_Post_Proc',
1697      p_msg_text => 'End');
1698 
1699 EXCEPTION
1700    WHEN e_post_process THEN
1701       -- get messages from the stack
1702       Get_Put_Messages (
1703          p_msg_count => v_msg_count,
1704          p_msg_data => v_msg_data);
1705 
1706       FEM_ENGINES_PKG.TECH_MESSAGE
1707        (p_severity => c_log_level_1,
1708         p_module => c_block||'.'||'Eng_Master_Post_Proc',
1709         p_msg_text => 'Post Process failed');
1710 
1711       FEM_ENGINES_PKG.USER_MESSAGE
1712        (P_APP_NAME => c_fem
1713        ,P_MSG_NAME => G_EXT_LDR_POST_PROC_ERR);
1714 
1715 
1716    WHEN OTHERS THEN
1717       -- get messages from the stack
1718       Get_Put_Messages (
1719          p_msg_count => v_msg_count,
1720          p_msg_data => v_msg_data);
1721 
1722       gv_prg_msg := sqlerrm;
1723       gv_callstack := dbms_utility.format_call_stack;
1724 
1725       FEM_ENGINES_PKG.TECH_MESSAGE
1726        (p_severity => c_log_level_6
1727        ,p_module => c_block||'.'||'Eng_Master_Post_Proc.Unexpected Exception'
1728        ,p_msg_text => gv_prg_msg);
1729 
1730       FEM_ENGINES_PKG.TECH_MESSAGE
1731        (p_severity => c_log_level_6
1732        ,p_module => c_block||'.'||'Eng_Master_Post_Proc.Unexpected Exception'
1733        ,p_msg_text => gv_callstack);
1734 
1735       FEM_ENGINES_PKG.USER_MESSAGE
1736        (p_app_name => c_fem
1737        ,p_msg_text => gv_prg_msg);
1738 
1739       FEM_ENGINES_PKG.USER_MESSAGE
1740        (P_APP_NAME => c_fem
1741        ,P_MSG_NAME => G_EXT_LDR_POST_PROC_ERR);
1742 
1743 
1744 END Eng_Master_Post_Proc;
1745 
1746 
1747 /*===========================================================================+
1748  | PROCEDURE
1749  |              Pre_Validation
1750  |
1751  | DESCRIPTION
1752  |     New Dimension Members without corresponding TL records
1753  |     This step processes members that do not yet exist in FEM
1754  |     but that do not have at least one TL record in the _TL_T interface table.
1755  |     These groups are "bad" so we will update their status to MISSING_NAME
1756  |
1757  |     This step also updates the records in the TL_T table where the LANGUAGE
1758  |     is not installed.
1759  |
1760  |
1761  | SCOPE - PRIVATE
1762  |
1763  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1764  |
1765  | ARGUMENTS  : IN:
1766  |
1767  |
1768  |              OUT:
1769  |
1770  |              IN/ OUT:
1771  |
1772  | RETURNS    : NONE
1773  |
1774  | NOTES
1775  |
1776  |   1.	Update Status of all "new" members missing TL_T record with 'MISSING_NAME'
1777  |   2.	(Simple Dim = 'N') Update Status of attribute assignments where the member
1778  |      doesn't exist in FEM and also is not in the join of _B_T/_TL_T with 'INVALID_MEMBER'
1779  |   3.	Special Status update for CAL PERIOD attribute assignment records
1780  |      with invalid CALENDAR_DISPLAY_CODE or DIMENSION_GROUP_DISPLAY_CODE.
1781  |      Status is 'INVALID_MEMBER'
1782  |   4.	(Simple Dim = 'N') Update status of all attribute assignment records where the
1783  |      VERSION_DISPLAY_CODE doesn't exist.  Status is 'INVALID_VERSION'
1784  |
1785  | MODIFICATION HISTORY
1786  |    Rob Flippo   22-MAR-04  Created
1787  |    Rob Flippo   17-SEP-04  Modified to add update on the _TL_T tables where
1788  |                            the LANGUAGE is not installed
1789  |
1790  +===========================================================================*/
1791 
1792 PROCEDURE Pre_Validation (p_eng_sql IN VARCHAR2
1793                          ,p_data_slc IN VARCHAR2
1794                          ,p_proc_num IN NUMBER
1795                          ,p_partition_code           IN  NUMBER
1796                          ,p_fetch_limit IN NUMBER
1797                          ,p_load_type IN VARCHAR2
1798                          ,p_dimension_varchar_label IN VARCHAR2
1799                          ,p_dimension_id IN NUMBER
1800                          ,p_source_b_table IN VARCHAR2
1801                          ,p_source_tl_table IN VARCHAR2
1802                          ,p_source_attr_table IN VARCHAR2
1803                          ,p_target_b_table IN VARCHAR2
1804                          ,p_member_t_dc_col IN VARCHAR2
1805                          ,p_member_dc_col IN VARCHAR2
1806                          ,p_value_set_required_flag IN VARCHAR2
1807                          ,p_simple_dimension_flag IN VARCHAR2
1808                          ,p_shared_dimension_flag IN VARCHAR2
1809                          ,p_exec_mode_clause IN VARCHAR2
1810                          ,p_master_request_id IN NUMBER)
1811 
1812 
1813 IS
1814 -- Constants
1815    c_proc_name                      VARCHAR2(30) := 'Pre_Validation';
1816 -- Dynamic SQL statement variables
1817    x_bad_mbr_select_stmt             VARCHAR2(4000);
1818    x_update_mbr_status_stmt          VARCHAR2(4000);
1819 
1820 -- Count variables for manipulating the member and attribute arrays
1821    v_mbr_last_row                    NUMBER;
1822    v_rows_rejected                   NUMBER :=0;
1823    v_temp_rows_rejected              NUMBER :=0;
1824 
1825 -- Other variables
1826    v_fetch_limit                     NUMBER;
1827 
1828 -- MP variables
1829    v_loop_counter                    NUMBER;
1830    v_slc_id                          NUMBER;
1831    v_slc_val                         VARCHAR2(100);
1832    v_slc_val2                        VARCHAR2(100);
1833    v_slc_val3                        VARCHAR2(100);
1834    v_slc_val4                        VARCHAR2(100);
1835    v_mp_status                       VARCHAR2(30);
1836    v_mp_message                      VARCHAR2(4000);
1837    v_num_vals                        NUMBER;
1838    v_part_name                       VARCHAR2(4000);
1839 
1840 -------------------------------------
1841 -- Declare bulk collection columns --
1842 -------------------------------------
1843 
1844 -- Common abbreviations:
1845 --    t_ = array of raw interface table member rows
1846 --    tf = "final" array of interface table member rows that have been validated for insert
1847 --    ta = array of raw interface table attribute rows
1848 --    tfa = "final" array of interface table attribute rows that have been validated for insert
1849 
1850    t_rowid                           rowid_type;
1851    t_b_status                        varchar2_std_type;
1852 
1853 ---------------------
1854 -- Declare cursors --
1855 ---------------------
1856    cv_get_bad_mbr        cv_curs;
1857 
1858 BEGIN
1859    FEM_ENGINES_PKG.TECH_MESSAGE
1860     (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
1861 
1862 
1863    --x_status := 0; -- initialize status of the Pre_Validation procedure
1864    --x_message := 'COMPLETE:NORMAL';
1865 
1866 
1867    build_bad_new_mbrs_stmt (p_load_type
1868                            ,p_dimension_varchar_label
1869                            ,p_source_b_table
1870                            ,p_source_tl_table
1871                            ,p_target_b_table
1872                            ,p_member_t_dc_col
1873                            ,p_member_dc_col
1874                            ,p_value_set_required_flag
1875                            ,p_shared_dimension_flag
1876                            ,p_exec_mode_clause
1877                            ,x_bad_mbr_select_stmt);
1878 
1879    IF p_data_slc IS NOT NULL THEN
1880       x_bad_mbr_select_stmt := REPLACE(x_bad_mbr_select_stmt,'{{data_slice}}',p_data_slc);
1881    ELSE
1882       x_bad_mbr_select_stmt := REPLACE(x_bad_mbr_select_stmt,'{{data_slice}}','1=1');
1883    END IF;
1884 
1885    -- set the local fetch limit variable based on the parameter
1886    -- this will be null for Dimension Group loads
1887    v_fetch_limit := p_fetch_limit;
1888    IF v_fetch_limit IS NULL THEN
1889       v_fetch_limit := 10000;
1890    END IF;
1891 
1892    FEM_ENGINES_PKG.TECH_MESSAGE
1893     (c_log_level_1,c_block||'.'||c_proc_name||'.bad_new_mbrs_select_stmt',x_bad_mbr_select_stmt);
1894 
1895    build_status_update_stmt (p_source_b_table
1896                             ,x_update_mbr_status_stmt);
1897 
1898    FEM_ENGINES_PKG.TECH_MESSAGE
1899     (c_log_level_1,c_block||'.'||c_proc_name||'.update_mbr_status_stmt '
1900     ,x_update_mbr_status_stmt);
1901 
1902    v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
1903                         -- the data slice loop
1904 LOOP
1905 
1906    IF p_load_type <> ('DIMENSION_GROUP') THEN
1907 
1908       FEM_Multi_Proc_Pkg.Get_Data_Slice(
1909         x_slc_id => v_slc_id,
1910         x_slc_val1 => v_slc_val,
1911         x_slc_val2 => v_slc_val2,
1912         x_slc_val3 => v_slc_val3,
1913         x_slc_val4 => v_slc_val4,
1914         x_num_vals  => v_num_vals,
1915         x_part_name => v_part_name,
1916         p_req_id => p_master_request_id,
1917         p_proc_num => p_proc_num);
1918 
1919       FEM_ENGINES_PKG.TECH_MESSAGE
1920        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
1921        ,v_slc_val);
1922       FEM_ENGINES_PKG.TECH_MESSAGE
1923        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
1924        ,v_slc_val2);
1925       FEM_ENGINES_PKG.TECH_MESSAGE
1926        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
1927        ,v_slc_val3);
1928       FEM_ENGINES_PKG.TECH_MESSAGE
1929        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
1930        ,v_slc_val4);
1931 
1932 
1933       EXIT WHEN (v_slc_id IS NULL);
1934    ELSE
1935       EXIT WHEN (v_loop_counter > 0);
1936       v_loop_counter := v_loop_counter + 1;
1937    END IF;
1938 
1939    IF p_load_type <> ('DIMENSION_GROUP') THEN
1940 
1941       OPEN cv_get_bad_mbr FOR x_bad_mbr_select_stmt USING v_slc_val, v_slc_val2;
1942    ELSE
1943       OPEN cv_get_bad_mbr FOR x_bad_mbr_select_stmt;
1944    END IF;
1945 
1946    LOOP
1947       ------------------------------------------------------------------
1948       -- Bulk Collect Rows from the source _B_T table missing TL_T name
1949       -- where the member does not already exist in FEM
1950       -- Using Dynamic SELECT Statement
1951       ------------------------------------------------------------------
1952 
1953       FETCH cv_get_bad_mbr BULK COLLECT INTO
1954              t_rowid
1955             ,t_b_status
1956       LIMIT v_fetch_limit;
1957 
1958       ----------------------------------------------
1959       -- EXIT Fetch LOOP If No Rows are Retrieved --
1960       ----------------------------------------------
1961 
1962       v_mbr_last_row := t_rowid.LAST;
1963 
1964       FEM_ENGINES_PKG.TECH_MESSAGE
1965       (c_log_level_1,c_block||'.'||c_proc_name||'.v_mbr_last_row'
1966       ,v_mbr_last_row);
1967 
1968       IF (v_mbr_last_row IS NULL)
1969       THEN
1970          EXIT;
1971       END IF;
1972 
1973       ----------------------------------------------------------
1974       -- Update Status of Bad Member Collection
1975       ----------------------------------------------------------
1976       FORALL i IN 1..v_mbr_last_row
1977          EXECUTE IMMEDIATE x_update_mbr_status_stmt
1978          USING t_b_status(i)
1979               ,t_rowid(i)
1980               ,t_b_status(i);
1981 
1982       COMMIT;
1983 
1984       ----------------------------------------------------------
1985       -- Count the error rows
1986       ----------------------------------------------------------
1987       v_rows_rejected := v_rows_rejected + v_mbr_last_row;
1988       FEM_ENGINES_PKG.TECH_MESSAGE
1989       (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
1990       ,v_rows_rejected);
1991 
1992       ----------------------------------------------------------
1993       -- Clear the array for the next BULK fetch
1994       ----------------------------------------------------------
1995       t_rowid.DELETE;
1996       t_b_status.DELETE;
1997 
1998    END LOOP; -- bad_members
1999 
2000    IF p_load_type <> ('DIMENSION_GROUP') THEN
2001       FEM_Multi_Proc_Pkg.Post_Data_Slice(
2002         p_req_id => p_master_request_id,
2003         p_slc_id => v_slc_id,
2004         p_status => v_mp_status,
2005         p_message => v_mp_message,
2006         p_rows_processed => 0,
2007         p_rows_loaded => 0,
2008         p_rows_rejected => v_rows_rejected);
2009    END IF;
2010 
2011 END LOOP; -- data_slice loop
2012 
2013    IF p_load_type = ('DIMENSION_GROUP') THEN
2014       gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected;
2015    END IF;
2016 
2017    IF cv_get_bad_mbr%ISOPEN THEN
2018       CLOSE cv_get_bad_mbr;
2019    END IF;
2020    --x_rows_rejected := v_rows_rejected;
2021    FEM_ENGINES_PKG.TECH_MESSAGE
2022     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
2023 
2024    EXCEPTION
2025       WHEN OTHERS THEN
2026          IF cv_get_bad_mbr%ISOPEN THEN
2027             CLOSE cv_get_bad_mbr;
2028          END IF;
2029          --x_status:= 2;
2030          --x_message := 'COMPLETE:ERROR';
2031 
2032          gv_prg_msg := sqlerrm;
2033          gv_callstack := dbms_utility.format_call_stack;
2034 
2035          FEM_ENGINES_PKG.TECH_MESSAGE
2036           (p_severity => c_log_level_6
2037           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2038           ,p_msg_text => gv_prg_msg);
2039 
2040          FEM_ENGINES_PKG.TECH_MESSAGE
2041           (p_severity => c_log_level_6
2042           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2043           ,p_msg_text => gv_callstack);
2044 
2045       FEM_ENGINES_PKG.USER_MESSAGE
2046        (p_app_name => c_fem
2047        ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
2048        ,P_TOKEN1 => 'ERR_MSG'
2049        ,P_VALUE1 => gv_prg_msg);
2050 
2051          RAISE e_main_terminate;
2052 
2053 
2054 END Pre_Validation;
2055 
2056 
2057 /*===========================================================================+
2058  | PROCEDURE
2059  |              Pre_Validation_Attr
2060  |
2061  | DESCRIPTION
2062  |     This procedure performs validations on the _ATTR_T table for bad records
2063  |
2064  |     Attribute assignment rows with bad version_display_code
2065  |     This step processes records in the _ATTR_T table
2066  |     that have a version_display_code which does not exist in FEM.
2067  |     These assignments are "bad" so we will update their status to INVALID_VERSION
2068  |
2069  |     Attribute assignment rows where the member doesn't exist in FEM
2070  |     and the member doesn't exist in the join of the _B_T and _TL_T tables.
2071  |     The member in this case is either a 'MISSING_NAME' member in the _B_T,
2072  |     or it is just a non-existent member.  These attribute assignment rows are
2073  |     marked as 'INVALID_MEMBER'.
2074  |
2075  | SCOPE - PRIVATE
2076  |
2077  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2078  |
2079  | ARGUMENTS  : IN:
2080  |
2081  |
2082  |              OUT:
2083  |
2084  |              IN/ OUT:
2085  |
2086  | RETURNS    : NONE
2087  |
2088  | NOTES
2089  |
2090  | MODIFICATION HISTORY
2091  |    Rob Flippo   15-APR-04  Created
2092  |    Rob Flippo   15-MAR-05  Bug#4226011 added call to not_user_label procedure
2093  |                            to update attr_t records where the attribute
2094  |                            is user_assign_allowed_flag = 'N';
2095  |    Rob Flippo   09-JUN-05  Bug#3895203 modified to update level specific
2096  |                            attributes
2097  +===========================================================================*/
2098 
2099 PROCEDURE Pre_Validation_Attr (p_eng_sql IN VARCHAR2
2100                          ,p_data_slc IN VARCHAR2
2101                          ,p_proc_num IN VARCHAR2
2102                          ,p_partition_code IN NUMBER
2103                          ,p_fetch_limit IN NUMBER
2104                          ,p_load_type IN VARCHAR2
2105                          ,p_dimension_varchar_label IN VARCHAR2
2106                          ,p_dimension_id IN NUMBER
2107                          ,p_source_b_table IN VARCHAR2
2108                          ,p_source_tl_table IN VARCHAR2
2109                          ,p_source_attr_table IN VARCHAR2
2110                          ,p_target_b_table IN VARCHAR2
2111                          ,p_member_t_dc_col IN VARCHAR2
2112                          ,p_member_dc_col IN VARCHAR2
2113                          ,p_value_set_required_flag IN VARCHAR2
2114                          ,p_simple_dimension_flag IN VARCHAR2
2115                          ,p_shared_dimension_flag IN VARCHAR2
2116                          ,p_hier_dimension_flag IN VARCHAR2
2117                          ,p_exec_mode_clause IN VARCHAR2
2118                          ,p_master_request_id IN NUMBER)
2119 IS
2120 -- Constants
2121    c_proc_name                      VARCHAR2(30) := 'Pre_Validation_Attr';
2122 -- Dynamic SQL statement variables
2123    x_bad_attr_select_stmt            VARCHAR2(4000);
2124    x_bad_attr_vers_select_stmt       VARCHAR2(4000);
2125    x_not_user_label_status_stmt      VARCHAR2(4000);
2126    x_bad_attrlab_status_stmt         VARCHAR2(4000);
2127    x_update_attr_status_stmt         VARCHAR2(4000);
2128    x_special_calp_status_stmt        VARCHAR2(4000);
2129    x_attr_lvlspec_select_stmt       VARCHAR2(4000);
2130 
2131 -- Count variables for manipulating the member and attribute arrays
2132    v_attr_last_row                   NUMBER;
2133    v_rows_rejected                   NUMBER :=0;
2134    v_rows_loaded                     NUMBER :=0;
2135    v_temp_rows_rejected              NUMBER :=0;
2136    v_bulk_rows_rejected              NUMBER :=0; -- rows rejected for any status
2137                                                  --bulk update statements
2138 
2139 -- Other variables
2140    v_fetch_limit                     NUMBER;
2141 
2142 -- MP variables
2143    v_loop_counter                    NUMBER;
2144    v_slc_id                          NUMBER;
2145    v_slc_val                         VARCHAR2(100);
2146    v_slc_val2                        VARCHAR2(100);
2147    v_slc_val3                        VARCHAR2(100);
2148    v_slc_val4                        VARCHAR2(100);
2149    v_mp_status                       VARCHAR2(30);
2150    v_mp_message                      VARCHAR2(4000);
2151    v_num_vals                        NUMBER;
2152    v_part_name                       VARCHAR2(4000);
2153 
2154 
2155 -------------------------------------
2156 -- Declare bulk collection columns --
2157 -------------------------------------
2158 
2159 -- Common abbreviations:
2160 --    t_ = array of raw interface table member rows
2161 --    tf = "final" array of interface table member rows that have been validated for insert
2162 --    ta = array of raw interface table attribute rows
2163 --    tfa = "final" array of interface table attribute rows that have been validated for insert
2164 
2165    t_rowid                           rowid_type;
2166    t_b_status                        varchar2_std_type;
2167 
2168 ---------------------
2169 -- Declare cursors --
2170 ---------------------
2171    cv_get_bad_attr       cv_curs;
2172    cv_get_bad_attr_vers  cv_curs;
2173 
2174 BEGIN
2175    FEM_ENGINES_PKG.TECH_MESSAGE
2176     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
2177 
2178    --DBMS_SESSION.SET_SQL_TRACE (sql_trace => TRUE);
2179    --x_status := 0; -- initialize status of the Pre_Validation procedure
2180    --x_message := 'COMPLETE:NORMAL';
2181 
2182 
2183    -- set the local fetch limit variable based on the parameter
2184    -- this will be null for Dimension Group loads
2185    v_fetch_limit := p_fetch_limit;
2186    IF v_fetch_limit IS NULL THEN
2187       v_fetch_limit := 10000;
2188    END IF;
2189 
2190      -----------------------------------------------------------------------
2191      -- Update rows in the _ATTR_T table where the attribute_varchar_label
2192      -- doesn't exist
2193      ----------------------------------------------------------------------------
2194       FEM_ENGINES_PKG.TECH_MESSAGE
2195        (c_log_level_3,c_block||'.'||c_proc_name
2196         ,'Invalid ATTRIBUTE_VARCHAR_LABEL');
2197 
2198 
2199       build_attrlab_update_stmt (p_dimension_varchar_label
2200                                ,p_source_attr_table
2201                                ,p_shared_dimension_flag
2202                                ,p_exec_mode_clause
2203                                ,x_bad_attrlab_status_stmt);
2204 
2205       IF p_data_slc IS NOT NULL THEN
2206          x_bad_attrlab_status_stmt := REPLACE(x_bad_attrlab_status_stmt,'{{data_slice}}',p_data_slc);
2207       ELSE
2208          x_bad_attrlab_status_stmt := REPLACE(x_bad_attrlab_status_stmt,'{{data_slice}}','1=1');
2209       END IF;
2210 
2211       FEM_ENGINES_PKG.TECH_MESSAGE
2212        (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attrlab_status_stmt',x_bad_attrlab_status_stmt);
2213 
2214 
2215       build_not_user_label_upd_stmt (p_dimension_varchar_label
2216                                ,p_source_attr_table
2217                                ,p_shared_dimension_flag
2218                                ,p_exec_mode_clause
2219                                ,x_not_user_label_status_stmt);
2220 
2221       IF p_data_slc IS NOT NULL THEN
2222          x_not_user_label_status_stmt := REPLACE(x_not_user_label_status_stmt,'{{data_slice}}',p_data_slc);
2223       ELSE
2224          x_not_user_label_status_stmt := REPLACE(x_not_user_label_status_stmt,'{{data_slice}}','1=1');
2225       END IF;
2226 
2227       FEM_ENGINES_PKG.TECH_MESSAGE
2228        (c_log_level_1,c_block||'.'||c_proc_name||'.not_user_label_status_stmt',x_not_user_label_status_stmt);
2229 
2230 
2231 
2232       FEM_ENGINES_PKG.TECH_MESSAGE
2233        (c_log_level_3,c_block||'.'||c_proc_name
2234         ,'Attribute assignments for Invalid member');
2235 
2236       build_status_update_stmt (p_source_attr_table
2237                                ,x_update_attr_status_stmt);
2238 
2239       build_bad_attr_select_stmt (p_dimension_varchar_label
2240                                  ,p_dimension_id
2241                                  ,p_source_b_table
2242                                  ,p_source_tl_table
2243                                  ,p_source_attr_table
2244                                  ,p_target_b_table
2245                                  ,p_member_t_dc_col
2246                                  ,p_member_dc_col
2247                                  ,p_value_set_required_flag
2248                                  ,p_shared_dimension_flag
2249                                  ,p_exec_mode_clause
2250                                  ,x_bad_attr_select_stmt);
2251       IF p_data_slc IS NOT NULL THEN
2252          x_bad_attr_select_stmt := REPLACE(x_bad_attr_select_stmt,'{{data_slice}}',p_data_slc);
2253       ELSE
2254          x_bad_attr_select_stmt := REPLACE(x_bad_attr_select_stmt,'{{data_slice}}','1=1');
2255       END IF;
2256 
2257 
2258       build_attr_lvlspec_select_stmt (p_dimension_varchar_label
2259                              ,p_dimension_id
2260                              ,p_source_b_table
2261                              ,p_source_attr_table
2262                              ,p_target_b_table
2263                              ,p_member_t_dc_col
2264                              ,p_member_dc_col
2265                              ,p_value_set_required_flag
2266                              ,p_shared_dimension_flag
2267                              ,p_hier_dimension_flag
2268                              ,'Y'
2269                              ,p_exec_mode_clause
2270                              ,x_attr_lvlspec_select_stmt);
2271 
2272       IF p_data_slc IS NOT NULL THEN
2273          x_attr_lvlspec_select_stmt := REPLACE(x_attr_lvlspec_select_stmt,'{{data_slice}}',p_data_slc);
2274       ELSE
2275          x_attr_lvlspec_select_stmt := REPLACE(x_attr_lvlspec_select_stmt,'{{data_slice}}','1=1');
2276       END IF;
2277 
2278 
2279       build_bad_attr_vers_stmt (p_dimension_varchar_label
2280                                ,p_source_attr_table
2281                                ,p_shared_dimension_flag
2282                                ,p_exec_mode_clause
2283                                ,x_bad_attr_vers_select_stmt);
2284 
2285       IF p_data_slc IS NOT NULL THEN
2286          x_bad_attr_vers_select_stmt := REPLACE(x_bad_attr_vers_select_stmt,'{{data_slice}}',p_data_slc);
2287       ELSE
2288          x_bad_attr_vers_select_stmt := REPLACE(x_bad_attr_vers_select_stmt,'{{data_slice}}','1=1');
2289       END IF;
2290 
2291 
2292       FEM_ENGINES_PKG.TECH_MESSAGE
2293        (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attr_vers_select_stmt',x_bad_attr_vers_select_stmt);
2294 
2295       FEM_ENGINES_PKG.TECH_MESSAGE
2296        (c_log_level_1,c_block||'.'||c_proc_name||'.update_attr_status_stmt '
2297        ,x_update_attr_status_stmt);
2298 
2299       FEM_ENGINES_PKG.TECH_MESSAGE
2300        (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attr_select_stmt'
2301        ,x_bad_attr_select_stmt);
2302 
2303       FEM_ENGINES_PKG.TECH_MESSAGE
2304        (c_log_level_1,c_block||'.'||c_proc_name||'.attr_lvlspec_select_stmt'
2305        ,x_attr_lvlspec_select_stmt);
2306 
2307       LOOP
2308 
2309          IF p_load_type <> ('DIMENSION_GROUP') THEN
2310 
2311          FEM_Multi_Proc_Pkg.Get_Data_Slice(
2312            x_slc_id => v_slc_id,
2313            x_slc_val1 => v_slc_val,
2314            x_slc_val2 => v_slc_val2,
2315            x_slc_val3 => v_slc_val3,
2316            x_slc_val4 => v_slc_val4,
2317            x_num_vals  => v_num_vals,
2318            x_part_name => v_part_name,
2319            p_req_id => p_master_request_id,
2320            p_proc_num => p_proc_num);
2321 
2322          FEM_ENGINES_PKG.TECH_MESSAGE
2323           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
2324           ,v_slc_val);
2325          FEM_ENGINES_PKG.TECH_MESSAGE
2326           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
2327           ,v_slc_val2);
2328          FEM_ENGINES_PKG.TECH_MESSAGE
2329           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
2330           ,v_slc_val3);
2331          FEM_ENGINES_PKG.TECH_MESSAGE
2332           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
2333           ,v_slc_val4);
2334 
2335 
2336          EXIT WHEN (v_slc_id IS NULL);
2337          ELSE
2338             EXIT WHEN (v_loop_counter > 0);
2339             v_loop_counter := v_loop_counter + 1;
2340          END IF;
2341 
2342          ---------------------------------------------------------------------------
2343          -- Execute the updates
2344          IF p_load_type <> ('DIMENSION_GROUP') THEN
2345             EXECUTE IMMEDIATE x_bad_attrlab_status_stmt USING v_slc_val, v_slc_val2;
2346          ELSE
2347             EXECUTE IMMEDIATE x_bad_attrlab_status_stmt;
2348          END IF;
2349          v_bulk_rows_rejected := SQL%ROWCOUNT;
2350          v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2351 
2352          IF p_load_type <> ('DIMENSION_GROUP') THEN
2353             EXECUTE IMMEDIATE x_not_user_label_status_stmt USING v_slc_val, v_slc_val2;
2354          ELSE
2355             EXECUTE IMMEDIATE x_not_user_label_status_stmt;
2356          END IF;
2357          v_bulk_rows_rejected := SQL%ROWCOUNT;
2358          v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2359          ---------------------------------------------------------------------------
2360 
2361 
2362          IF p_load_type <> ('DIMENSION_GROUP') THEN
2363             OPEN cv_get_bad_attr FOR x_bad_attr_select_stmt USING v_slc_val, v_slc_val2;
2364          ELSE
2365             OPEN cv_get_bad_attr FOR x_bad_attr_select_stmt;
2366          END IF;
2367 
2368 
2369          LOOP
2370             -------------------------------------------
2371             -- Bulk Collect Rows from the source _ATTR_T table
2372             -- where the member doesn't exist in FEM and the member
2373             -- doesn't exist in the join of _B_T/_TL_T tables
2374             -- but the version is a valid version
2375             -- Using Dynamic SELECT Statement
2376             -------------------------------------------
2377             FETCH cv_get_bad_attr BULK COLLECT INTO
2378                 t_rowid
2379                ,t_b_status
2380             LIMIT v_fetch_limit;
2381 
2382             ----------------------------------------------
2383             -- EXIT Fetch LOOP If No Rows are Retrieved --
2384             ----------------------------------------------
2385             v_attr_last_row := t_rowid.LAST;
2386 
2387             FEM_ENGINES_PKG.TECH_MESSAGE
2388             (c_log_level_1,c_block||'.'||c_proc_name||'.v_attr_last_row'
2389             ,v_attr_last_row);
2390 
2391             IF (v_attr_last_row IS NULL)
2392             THEN
2393                EXIT;
2394             END IF;
2395 
2396             ----------------------------------------------------------
2397             -- Update Status of Bad Attr Collection
2398             ----------------------------------------------------------
2399             FORALL i IN 1..v_attr_last_row
2400                EXECUTE IMMEDIATE x_update_attr_status_stmt
2401                USING t_b_status(i)
2402                     ,t_rowid(i)
2403                     ,t_b_status(i);
2404 
2405                COMMIT;
2406 
2407             ----------------------------------------------------------
2408             -- Count the error rows
2409             ----------------------------------------------------------
2410             v_rows_rejected := v_rows_rejected + v_attr_last_row;
2411             FEM_ENGINES_PKG.TECH_MESSAGE
2412             (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
2413             ,v_rows_rejected);
2414 
2415             ----------------------------------------------------------
2416             -- Clear the array for the next BULK fetch
2417             ----------------------------------------------------------
2418             t_rowid.DELETE;
2419             t_b_status.DELETE;
2420 
2421          END LOOP; -- attributes with Invalid Member
2422          IF cv_get_bad_attr%ISOPEN THEN
2423             CLOSE cv_get_bad_attr;
2424          END IF;
2425 
2426 
2427          IF p_hier_dimension_flag = 'Y' AND p_load_type <> 'DIMENSION_GROUP' THEN
2428             OPEN cv_get_bad_attr FOR x_attr_lvlspec_select_stmt USING v_slc_val, v_slc_val2;
2429 
2430             LOOP
2431                -------------------------------------------
2432                -- Bulk Collect Rows from the source _ATTR_T table
2433                -- where the attribute is a level specific attribute
2434                -- and the member doesn't belong to that level
2435                -------------------------------------------
2436                FETCH cv_get_bad_attr BULK COLLECT INTO
2437                    t_rowid
2438                   ,t_b_status
2439                LIMIT v_fetch_limit;
2440 
2441                ----------------------------------------------
2442                -- EXIT Fetch LOOP If No Rows are Retrieved --
2443                ----------------------------------------------
2444                v_attr_last_row := t_rowid.LAST;
2445 
2446                FEM_ENGINES_PKG.TECH_MESSAGE
2447                (c_log_level_1,c_block||'.'||c_proc_name||'.v_attr_last_row'
2448                ,v_attr_last_row);
2449 
2450                IF (v_attr_last_row IS NULL)
2451                THEN
2452                   EXIT;
2453                END IF;
2454 
2455                ----------------------------------------------------------
2456                -- Update Status of Bad Attr Collection
2457                ----------------------------------------------------------
2458                FORALL i IN 1..v_attr_last_row
2459                   EXECUTE IMMEDIATE x_update_attr_status_stmt
2460                   USING t_b_status(i)
2461                        ,t_rowid(i)
2462                        ,t_b_status(i);
2463 
2464                   COMMIT;
2465 
2466                ----------------------------------------------------------
2467                -- Count the error rows
2468                ----------------------------------------------------------
2469                v_rows_rejected := v_rows_rejected + v_attr_last_row;
2470                FEM_ENGINES_PKG.TECH_MESSAGE
2471                (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
2472                ,v_rows_rejected);
2473 
2474                ----------------------------------------------------------
2475                -- Clear the array for the next BULK fetch
2476                ----------------------------------------------------------
2477                t_rowid.DELETE;
2478                t_b_status.DELETE;
2479 
2480             END LOOP; -- attributes with Invalid Member
2481             IF cv_get_bad_attr%ISOPEN THEN
2482                CLOSE cv_get_bad_attr;
2483             END IF;
2484          END IF;  -- p_hier_dimension_flag = 'Y'
2485 
2486          IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
2487             --------------------------------------------------------------
2488             -- Special Status Update for CAL_PERIOD ATTR_T records
2489             -- where either the CALENDAR_DISPLAY_CODE or DIMENSION_GROUP_DISPLAY_CODE
2490             -- do not exist.  We have to update these records because they will
2491             -- not otherwise be marked as Invalid since they don't show up in any
2492             -- of the CAL_PERIOD cursors
2493             ----------------------------------------------------------------
2494             x_special_calp_status_stmt := 'UPDATE fem_cal_periods_attr_t B'||
2495                                        ' SET status = ''INVALID_CALENDAR'''||
2496                                        ' WHERE NOT EXISTS (SELECT 0 FROM fem_calendars_b C2'||
2497                                        ' WHERE C2.calendar_display_code = B.calendar_display_code)'||
2498                                        ' AND   {{data_slice}} '||
2499                                        ' AND B.STATUS'||p_exec_mode_clause;
2500 
2501             IF p_data_slc IS NOT NULL THEN
2502                x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}',p_data_slc);
2503             ELSE
2504                x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}','1=1');
2505             END IF;
2506 
2507             EXECUTE IMMEDIATE x_special_calp_status_stmt USING v_slc_val, v_slc_val2;
2508             v_bulk_rows_rejected := SQL%ROWCOUNT;
2509             v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2510             FEM_ENGINES_PKG.TECH_MESSAGE
2511              (c_log_level_1,c_block||'.'||c_proc_name||'.bulk_rows_rejected',v_bulk_rows_rejected);
2512 
2513 
2514             x_special_calp_status_stmt := 'UPDATE fem_cal_periods_attr_t B'||
2515                                           ' SET status = ''INVALID_DIMENSION_GROUP'''||
2516                                           ' WHERE NOT EXISTS (SELECT 0 FROM fem_dimension_grps_b D2'||
2517                                           ' WHERE D2.dimension_group_display_code = B.dimension_group_display_code)'||
2518                                           ' AND   {{data_slice}} '||
2519                                           ' AND EXISTS (SELECT 0 FROM FEM_CALENDARS_B C3'||
2520                                           ' WHERE C3.calendar_display_code = B.calendar_display_code)'||
2521                                           ' AND B.STATUS'||p_exec_mode_clause;
2522             IF p_data_slc IS NOT NULL THEN
2523                x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}',p_data_slc);
2524             ELSE
2525                x_special_calp_status_stmt := REPLACE(x_special_calp_status_stmt,'{{data_slice}}','1=1');
2526             END IF;
2527 
2528             EXECUTE IMMEDIATE x_special_calp_status_stmt USING v_slc_val, v_slc_val2;
2529             v_bulk_rows_rejected := SQL%ROWCOUNT;
2530             v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
2531             FEM_ENGINES_PKG.TECH_MESSAGE
2532              (c_log_level_1,c_block||'.'||c_proc_name||'.bulk_rows_rejected',v_bulk_rows_rejected);
2533 
2534             --------------------------------------------------------------------------
2535             -- END Special CAL_PERIOD Status Update
2536             --------------------------------------------------------------------------
2537          END IF;  -- special CAL_PERIOD status update
2538          --------------------------------------------------------------------------
2539          -- BEGIN Invalid Version Display Code in ATTR_T table
2540          --------------------------------------------------------------------------
2541          FEM_ENGINES_PKG.TECH_MESSAGE
2542           (c_log_level_3,c_block||'.'||c_proc_name
2543            ,'Attribute assignments with invalid version_display_code');
2544 
2545          FEM_ENGINES_PKG.TECH_MESSAGE
2546           (c_log_level_1,c_block||'.'||c_proc_name||'.bad_attr_vers_select_stmt',x_bad_attr_vers_select_stmt);
2547 
2548          FEM_ENGINES_PKG.TECH_MESSAGE
2549           (c_log_level_1,c_block||'.'||c_proc_name||'.update_attr_status_stmt '
2550           ,x_update_attr_status_stmt);
2551 
2552          IF p_load_type <> ('DIMENSION_GROUP') THEN
2553             OPEN cv_get_bad_attr_vers FOR x_bad_attr_vers_select_stmt USING v_slc_val, v_slc_val2;
2554          ELSE
2555             OPEN cv_get_bad_attr_vers FOR x_bad_attr_vers_select_stmt;
2556          END IF;
2557 
2558          LOOP
2559             -------------------------------------------
2560             -- Bulk Collect Rows from the source _ATTR_T table
2561             -- where the version_display_code doesn't exist
2562             -- Using Dynamic SELECT Statement
2563             -------------------------------------------
2564 
2565             FETCH cv_get_bad_attr_vers BULK COLLECT INTO
2566                    t_rowid
2567                   ,t_b_status
2568             LIMIT v_fetch_limit;
2569 
2570             ----------------------------------------------
2571             -- EXIT Fetch LOOP If No Rows are Retrieved --
2572             ----------------------------------------------
2573             v_attr_last_row := t_rowid.LAST;
2574 
2575             FEM_ENGINES_PKG.TECH_MESSAGE
2576             (c_log_level_1,c_block||'.'||c_proc_name||'.v_attr_last_row'
2577             ,v_attr_last_row);
2578 
2579             IF (v_attr_last_row IS NULL)
2580             THEN
2581                EXIT;
2582             END IF;
2583 
2584             ----------------------------------------------------------
2585             -- Update Status of Bad Attr Version Collection
2586             ----------------------------------------------------------
2587             FORALL i IN 1..v_attr_last_row
2588                EXECUTE IMMEDIATE x_update_attr_status_stmt
2589                USING t_b_status(i)
2590                     ,t_rowid(i)
2591                     ,t_b_status(i);
2592 
2593                 COMMIT;
2594 
2595             ----------------------------------------------------------
2596             -- Count the error rows
2597             ----------------------------------------------------------
2598             v_rows_rejected := v_rows_rejected + v_attr_last_row;
2599             FEM_ENGINES_PKG.TECH_MESSAGE
2600             (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
2601             ,v_rows_rejected);
2602 
2603             ----------------------------------------------------------
2604             -- Clear the array for the next BULK fetch
2605             ----------------------------------------------------------
2606             t_rowid.DELETE;
2607             t_b_status.DELETE;
2608 
2609          END LOOP; -- bad_attr_vers
2610 
2611    FEM_Multi_Proc_Pkg.Post_Data_Slice(
2612      p_req_id => p_master_request_id,
2613      p_slc_id => v_slc_id,
2614      p_status => v_mp_status,
2615      p_message => v_mp_message,
2616      p_rows_processed => 0,
2617      p_rows_loaded => 0,
2618      p_rows_rejected => v_rows_rejected);
2619 
2620       END LOOP; -- get_data_slice
2621       IF cv_get_bad_attr_vers%ISOPEN THEN
2622          CLOSE cv_get_bad_attr_vers;
2623       END IF;
2624 
2625    --x_rows_rejected := v_rows_rejected;
2626    FEM_ENGINES_PKG.TECH_MESSAGE
2627     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
2628 
2629    EXCEPTION
2630       WHEN OTHERS THEN
2631          IF cv_get_bad_attr%ISOPEN THEN
2632             CLOSE cv_get_bad_attr;
2633          END IF;
2634 
2635          IF cv_get_bad_attr_vers%ISOPEN THEN
2636             CLOSE cv_get_bad_attr;
2637          END IF;
2638          --x_status:= 2;
2639          --x_message := 'COMPLETE:ERROR';
2640 
2641          gv_prg_msg := sqlerrm;
2642          gv_callstack := dbms_utility.format_call_stack;
2643 
2644          FEM_ENGINES_PKG.TECH_MESSAGE
2645           (p_severity => c_log_level_6
2646           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2647           ,p_msg_text => gv_prg_msg);
2648 
2649          FEM_ENGINES_PKG.TECH_MESSAGE
2650           (p_severity => c_log_level_6
2651           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
2652           ,p_msg_text => gv_callstack);
2653 
2654          FEM_ENGINES_PKG.USER_MESSAGE
2655           (p_app_name => c_fem
2656           ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
2657           ,P_TOKEN1 => 'ERR_MSG'
2658           ,P_VALUE1 => gv_prg_msg);
2659 
2660       /*   FEM_ENGINES_PKG.USER_MESSAGE
2661           (p_app_name => c_fem
2662           ,p_msg_text => gv_prg_msg); */
2663 
2664 
2665          RAISE e_main_terminate;
2666 
2667 
2668 END Pre_Validation_Attr;
2669 
2670 
2671 /*===========================================================================+
2672  | PROCEDURE
2673  |              New_Members
2674  |
2675  | DESCRIPTION
2676  |  Loop through the members that do not yet exist and have names/desc in the TL table
2677  |  to perform validations and eventually insert into the target dimension member tables
2678  |  In the case where the user provides multiple versions of the attribute
2679  |  assignments for the same member, only the "default" version is read for "required"
2680  |  attributes
2681  | SCOPE - PRIVATE
2682  |
2683  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
2684  |
2685  | ARGUMENTS  : IN:
2686  |
2687  |
2688  |              OUT:
2689  |
2690  |              IN/ OUT:
2691  |
2692  | RETURNS    : NONE
2693  |
2694  | NOTES
2695  |
2696  |   New Members
2697  |
2698  |   1.	Retrieve members from join of _B_T/_TL_T where the member does not
2699  |      already exist in FEM.
2700  |   2.	If Simple Dim = 'N', for each member, retrieve all "required" attribute
2701  |      assignment records from _ATTR_T where the VERSION_DISPLAY_CODE exists.
2702  |   3.	If number attribute assignments < number of required attributes, the member
2703  |      fails with status = 'MISSING_REQUIRED_ATTRIBUTE'.  The _TL_T gets
2704  |      'INVALID_MEMBER' and all of the _ATTR_T records get 'INVALID_MEMBER'.
2705  |   4.	If the number of attribute assignments = number of required attributes,
2706  |      then each assignment record is validated individually:
2707  |      	For Dimension Groups - check the Dim Group Sequence.  Failure =
2708  |         'DIM_GROUP_SEQUENCE_NOT_UNIQUE'.
2709  |      	For Dimension Groups (CAL_PERIOD only) - check Time Group Type Code.
2710  |          Failure = 'INVALID_TIME_GROUP_TYPE'.
2711  |      	If a DIMENSION assignment, then assignment value must exist in the
2712  |          attribute dimension table.  Status = 'INVALID_DIM_ASSIGNMENT' for failure
2713  |      	If a DATE assignment, then assignment value must be a valid date.
2714  |          Status='INVALID_DATE' for failure
2715  |      	If a NUMBER assignment, then assignment value must be a valid number.
2716  |          Status = 'INVALID_NUMBER' for failure.
2717  |      	Special CAL_PERIOD validation on GL_PERIOD_NUM attribute - attribute
2718  |          assignment must match value in the CAL_PERIOD_NUMBER identifier column
2719  |           Status = 'INVALID_CAL_PERIOD_END_DATE' for failure
2720  |
2721  |      The _B_T gets 'INVALID_REQUIRED_ATTRIBUTE' whenever one fails.  The
2722  |      _TL_T gets 'INVALID_MEMBER'.
2723  |   5.	Insert success records into FEM.  Only the _TL_T record for the user's
2724  |      current session is used to initially create the member - records for
2725  |      other installed languages default to that value for this stage.
2726  |   6.	Delete success records from _B_T/_TL_T/_ATTR_T.
2727  |
2728  |   SPECIAL NOTE:  The x_rows_loaded output variable is only populated if a
2729  |                  new member is created.  It does not represent the number of
2730  |                  rows loaded.  Rather, it is just serving as a flag to indicate
2731  |                  that at least one new member was created.
2732  | MODIFICATION HISTORY
2733  |  Rob Flippo 22-MAR-04  Created
2734  |  Rob Flippo 13-SEP-04  Bug#3835758  Validation on the attr_Assign_vs
2735  |                                     was modified to include dimension_id
2736  |                                     in the where condition
2737  |
2738  |  Rob Flippo 14-SEP-04  Removed the build_dep_status_update procedure call
2739  |                        since attribute records where the member is invalid
2740  |                        is already handled in the attr_update section
2741  |  Rob Flippo 15-SEP-04  Bug#3835758  Added exception handler so no failure
2742  |                        if VS didn't exist.  Also moved the section
2743  |                        that verifies the VS so that only called
2744  |                        for DIMENSION attributes;
2745  |  Rob Flippo 16-NOV-04  Bug#4002917  for preventing overlap cal periods
2746  |                        Added a new section in the attr validations for
2747  |                        checking date overlap conditions;  also added
2748  |                        new validation to require cal_period_number > 0;
2749  |  Rob Flippo 22-NOV-04  Bug#4019066 Add validation on Accounting_Year
2750  |                        and GL_PERIOD_NUM for CAL_PERIOD;  ACCOUNTING_YEAR
2751  |                        must be >=1900 and <= 2599 while GL_PERIOD_NUM
2752  |                          must be <= periods_in_year for the Time Group Type
2753  | Rob Flippo  24-NOV-04  Bug#4041308 Remove periods_in_year check
2754  | Rob Flippo  03-JAN-05  Bug#4030717 FEM.D: MODIFY DIM MBR LOADER OVERLAP
2755  |                        DATE LOGIC TO ALLOW MP FOR CAL_PERIOD
2756  |                        -- using 2 new interim tables for Cal Period loads
2757  |                           FEM_CALP_INTERIM_T and FEM_CALP_ATTR_INTERIM_T
2758  |                           The loader inserts from the final array into
2759  |                           these new tables, then performs date overlap
2760  |                           check before moving all good records into FEM
2761  | Rob Flippo  30-JUN-05  Bug#4355484
2762  |                        CALL BUS EVENT WHEN CCC-ORGS LOADED WITH DIM LOADER
2763  |                        As long as >0 new members created in a load, the
2764  |                        loader calls the bus. event
2765  | Rob Flippo  10-MAR-06  Bug#5068022 - unique constraint error on duplicate
2766  |                        names
2767  | Rob Flippo 04-APR-06  Bug#5117594 Remove unique name check for Customer
2768  |                       dimension
2769  | Rob Flippo 28-APR-06  Bug 5174039 Added validation that calp start_date
2770  |                       must be <= calp end date
2771  | Rob Flippo 04-AUG-06  Bug 5060746 Change literals to bind variables wherever possible
2772  +===========================================================================*/
2773 
2774 PROCEDURE New_Members (p_eng_sql IN VARCHAR2
2775                       ,p_data_slc IN VARCHAR2
2776                       ,p_proc_num IN VARCHAR2
2777                       ,p_partition_code IN NUMBER
2778                       ,p_fetch_limit IN NUMBER
2779                       ,p_load_type IN VARCHAR2
2780                       ,p_dimension_varchar_label IN VARCHAR2
2781                       ,p_date_format_mask IN VARCHAR2
2782                       ,p_dimension_id IN VARCHAR2
2783                       ,p_target_b_table IN VARCHAR2
2784                       ,p_target_tl_table IN VARCHAR2
2785                       ,p_target_attr_table IN VARCHAR2
2786                       ,p_source_b_table IN VARCHAR2
2787                       ,p_source_tl_table IN VARCHAR2
2788                       ,p_source_attr_table IN VARCHAR2
2789                       ,p_table_handler_name IN VARCHAR2
2790                       ,p_member_col IN VARCHAR2
2791                       ,p_member_dc_col IN VARCHAR2
2792                       ,p_member_name_col IN VARCHAR2
2793                       ,p_member_t_dc_col IN VARCHAR2
2794                       ,p_member_t_name_col IN VARCHAR2
2795                       ,p_member_description_col IN VARCHAR2
2796                       ,p_value_set_required_flag IN VARCHAR2
2797                       ,p_simple_dimension_flag IN VARCHAR2
2798                       ,p_shared_dimension_flag IN VARCHAR2
2799                       ,p_hier_dimension_flag IN VARCHAR2
2800                       ,p_member_id_method_code IN VARCHAR2
2801                       ,p_exec_mode_clause IN VARCHAR2
2802                       ,p_master_request_id IN NUMBER)
2803 IS
2804 -- Constants
2805    c_proc_name                       VARCHAR2(30) := 'New_Members';
2806 
2807 -- variables storing temporary state information
2808    v_attr_success                    VARCHAR2(30);
2809    v_temp_member                     VARCHAR2(100);
2810    v_count                           NUMBER;
2811    v_req_attribute_count             NUMBER;
2812 
2813 -- Dynamic SQL statement variables
2814    x_select_stmt                     VARCHAR2(4000);
2815    x_attr_select_stmt                VARCHAR2(4000);
2816    x_remain_mbr_select_stmt          VARCHAR2(4000);
2817    x_insert_member_stmt              VARCHAR2(4000);
2818    x_insert_attr_stmt                VARCHAR2(4000);
2819    x_update_stmt                     VARCHAR2(4000);
2820    x_attr_update_stmt                VARCHAR2(4000);
2821    x_update_tl_stmt                  VARCHAR2(4000);
2822    x_update_dep_attr_status_stmt     VARCHAR2(4000);
2823    x_update_dep_tl_status_stmt       VARCHAR2(4000);
2824    x_update_attr_status_stmt         VARCHAR2(4000);
2825    x_update_mbr_status_stmt          VARCHAR2(4000);
2826    x_update_tl_status_stmt           VARCHAR2(4000);
2827    x_update_dimgrp_stmt              VARCHAR2(4000);
2828    x_delete_attr_stmt                VARCHAR2(4000);
2829    x_special_delete_attr_stmt        VARCHAR2(4000);
2830    x_delete_mbr_stmt                 VARCHAR2(4000);
2831    x_delete_tl_stmt                  VARCHAR2(4000);
2832    x_does_attr_exist_stmt            VARCHAR2(4000);
2833    x_does_attr_exist_novers_stmt     VARCHAR2(4000);
2834    x_overlap_sql_stmt                VARCHAR2(4000);
2835    x_adj_period_stmt                 VARCHAR2(4000);
2836    x_dupname_count_stmt              VARCHAR2(4000);
2837 
2838    -- special stmt for CAL_PERIOD loads only
2839    -- for inserting into interim tables (to support Date Overlap checks)
2840    x_calp_interim_stmt        VARCHAR2(4000);
2841    x_calp_attr_interim_stmt   VARCHAR2(4000);
2842 
2843 -- Count variables for manipulating the member and attribute arrays
2844    v_dupname_count                   NUMBER := 0;
2845    v_attr_final_count                NUMBER := 0;
2846    v_mbr_final_count                 NUMBER := 0;
2847    v_mbr_count                       NUMBER := 0;
2848    v_mbr_subcount                    NUMBER := 0;
2849    v_attr_count                      NUMBER := 0;
2850    v_final_mbr_last_row              NUMBER;
2851    v_attr_last_row                   NUMBER;
2852    v_mbr_last_row                    NUMBER;
2853    v_rows_fetched                    NUMBER;
2854    v_temp_rows_rejected              NUMBER :=0;
2855    v_rows_rejected                   NUMBER :=0;
2856    v_rows_loaded                     NUMBER :=0;
2857    v_temp_rows_loaded                NUMBER :=0;
2858    v_adj_period_count                NUMBER :=0;
2859    v_overlap_count                   NUMBER :=0;  -- counter for the number of
2860                                                   -- cal periods that have overlapping
2861                                                   -- dates in the _ATTR_T table
2862    v_duplicate_attr_count            NUMBER;  -- counter for verifying that duplicate
2863                                               -- assignments for same attr don't exist
2864                                               -- in the interface table
2865 
2866    -- Other variables
2867    v_fetch_limit                     NUMBER;
2868 
2869 -- MP variables
2870    v_loop_counter                    NUMBER;
2871    v_slc_id                          NUMBER;
2872    v_slc_val                         VARCHAR2(100);
2873    v_slc_val2                        VARCHAR2(100);
2874    v_slc_val3                        VARCHAR2(100);
2875    v_slc_val4                        VARCHAR2(100);
2876    v_mp_status                       VARCHAR2(30);
2877    v_mp_message                      VARCHAR2(4000);
2878    v_num_vals                        NUMBER;
2879    v_part_name                       VARCHAR2(4000);
2880 
2881 -------------------------------------
2882 -- Declare bulk collection columns --
2883 -------------------------------------
2884 
2885 -- Common abbreviations:
2886 --    t_ = array of raw interface table member rows
2887 --    tf = "final" array of interface table member rows that have been validated for insert
2888 --    ta = array of raw interface table attribute rows
2889 --    tfa = "final" array of interface table attribute rows that have been validated for insert
2890 
2891    t_rowid                           rowid_type;
2892    t_tl_rowid                        rowid_type;
2893    tf_tl_rowid                       rowid_type;
2894    tf_rowid                          rowid_type;
2895    ta_rowid                          rowid_type;
2896    tfa_rowid                         rowid_type;
2897 
2898 
2899    --t_member_id                       number_type;
2900    t_value_set_id                    number_type;
2901    t_dimension_group_id              number_type;
2902    t_calendar_id                     number_type;
2903    t_cal_period_number               number_type;
2904    t_dimension_group_seq             number_type;
2905    t_time_group_type_code            varchar2_std_type;
2906    t_seq_conflict_count              number_type;
2907    -- t_periods_in_year                 number_type;  -- not used at this time
2908                                                       -- per bug#4031308
2909 
2910    --tf_member_id                      number_type;
2911    tf_value_set_id                   number_type;
2912    tf_dimension_group_id             number_type;
2913    tf_calendar_id                    number_type;
2914    tf_cal_period_number              number_type;
2915    tf_dimension_group_seq            number_type;
2916    tf_time_dimension_group_key       number_type;
2917    tf_time_group_type_code           varchar2_std_type;
2918    tf_dimension_id                   number_type;
2919    tf_dimgrp_dimension_group_id      number_type;
2920 
2921    ta_attribute_id                   number_type;
2922    ta_attribute_dimension_id         number_type;
2923    ta_dim_attr_numeric_member        number_type;
2924    ta_number_assign_value            number_type;
2925    ta_version_id                     number_type;
2926    ta_attr_assign_vs_id              number_type;
2927    ta_attr_exists_count              number_type;  -- count of existing attr assign with version_id
2928    ta_attr_exists_novers_count       number_type;  -- count of existing attr assign without version_id
2929 
2930 
2931    tfa_attribute_id                  number_type;
2932    tfa_dim_attr_numeric_member       number_type;
2933    tfa_number_assign_value           number_type;
2934    tfa_version_id                    number_type;
2935    tfa_attr_assign_vs_id             number_type;
2936 
2937    t_cal_period_end_date             date_type;
2938    ta_cal_period_end_date            date_type;
2939    tf_cal_period_end_date            date_type;
2940    tfa_cal_period_end_date           date_type;
2941    t_cal_period_start_date           date_type;
2942    tf_cal_period_start_date          date_type;
2943 
2944    ta_date_assign_value              date_type;
2945    tfa_date_assign_value             date_type;
2946 
2947    t_b_status                        varchar2_std_type;
2948    t_tl_status                       varchar2_std_type;
2949    tf_status                         varchar2_std_type;
2950 
2951    ta_attribute_varchar_label        varchar2_std_type;
2952    tfa_attribute_varchar_label       varchar2_std_type;
2953    ta_attr_value_column_name         varchar2_std_type;
2954    ta_attribute_data_type_code       varchar2_std_type;
2955    ta_dim_attr_varchar_member        varchar2_std_type;
2956    ta_status                         varchar2_std_type;
2957 
2958 
2959    tfa_dim_attr_varchar_member       varchar2_std_type;
2960    tfa_status                        varchar2_std_type;
2961 
2962    t_member_dc                       varchar2_150_type;
2963    t_calendar_dc                     varchar2_150_type;
2964    t_value_set_dc                    varchar2_150_type;
2965    t_dimension_group_dc              varchar2_150_type;
2966    t_member_name                     varchar2_150_type;
2967    t_adj_period_flag                 flag_type;  -- Y means it is an adj period
2968 
2969    tf_member_dc                      varchar2_150_type;
2970    tf_member_name                    varchar2_150_type;
2971    tf_calendar_dc                    varchar2_150_type;
2972    tf_dimension_group_dc             varchar2_150_type;
2973    tf_adj_period_flag                flag_type;
2974 
2975    ta_member_dc                      varchar2_150_type;
2976    ta_value_set_dc                   varchar2_150_type;
2977    ta_version_display_code           varchar2_150_type;
2978    ta_attr_assign_vs_dc              varchar2_150_type;
2979 
2980    tfa_member_dc                     varchar2_150_type;
2981    tfa_value_set_dc                  varchar2_150_type;
2982 
2983    t_member_desc                     desc_type;
2984    tf_member_desc                    desc_type;
2985 
2986    t_new_member_flag                 flag_type;
2987 
2988    ta_attribute_required_flag        flag_type;
2989    ta_allow_mult_assign_flag         flag_type;
2990    ta_read_only_flag                 flag_type;
2991    ta_allow_mult_versions_flag       flag_type;
2992    ta_use_interim_table_flag         flag_type; -- placeholder only - not functional
2993 
2994    t_language                        lang_type;
2995    tf_language                       lang_type;
2996    ta_language                       lang_type;
2997 
2998    ta_varchar_assign_value           varchar2_1000_type;
2999    ta_attribute_assign_value         varchar2_1000_type;
3000    tfa_varchar_assign_value          varchar2_1000_type;
3001 
3002    ta_member_read_only_flag          flag_type;  -- designates if the member is
3003                                                  -- read only;  this is ignored
3004                                                  -- in the new_member section and
3005                                                  -- only included for consistency
3006                                                  -- with the bulk select
3007    -- variables for holding attributes of CAL_PERIOD
3008    ta_calpattr_cal_dc                varchar2_std_type;
3009    ta_calpattr_dimgrp_dc             varchar2_std_type;
3010    ta_calpattr_end_date              date_type;
3011    ta_calpattr_period_num            number_type;
3012 
3013 ---------------------
3014 -- Declare cursors --
3015 ---------------------
3016    cv_get_rows           cv_curs;
3017    cv_get_attr_rows      cv_curs;
3018 
3019 BEGIN
3020    FEM_ENGINES_PKG.TECH_MESSAGE
3021     (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
3022 
3023    --DBMS_SESSION.SET_SQL_TRACE (sql_trace => TRUE);
3024 
3025    FEM_ENGINES_PKG.TECH_MESSAGE
3026     (c_log_level_1,c_block||'.'||c_proc_name||'.p_simple_dimension_flag'
3027      ,p_simple_dimension_flag);
3028 
3029    --x_status := 0; -- initialize status of the New_Members procedure
3030    --x_message := 'COMPLETE:NORMAL';
3031 
3032    ------------------------------------------------------------------------------
3033    -- Build the select stmt for new Dimension members using the information
3034    -- returned from get_dimension_info
3035    ------------------------------------------------------------------------------
3036 
3037    build_mbr_select_stmt  (p_load_type
3038                           ,p_dimension_varchar_label
3039                           ,p_dimension_id
3040                           ,p_target_b_table
3041                           ,p_target_tl_table
3042                           ,p_source_b_table
3043                           ,p_source_tl_table
3044                           ,p_member_dc_col
3045                           ,p_member_t_dc_col
3046                           ,p_member_t_name_col
3047                           ,p_member_description_col
3048                           ,p_value_set_required_flag
3049                           ,p_shared_dimension_flag
3050                           ,p_hier_dimension_flag
3051                           ,'N'
3052                           ,p_exec_mode_clause
3053                           ,x_select_stmt);
3054 
3055    IF p_data_slc IS NOT NULL THEN
3056       x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}',p_data_slc);
3057    ELSE
3058       x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}','1=1');
3059    END IF;
3060 
3061    -- set the local fetch limit variable based on the parameter
3062    -- this will be null for Dimension Group loads
3063    v_fetch_limit := p_fetch_limit;
3064    IF v_fetch_limit IS NULL THEN
3065       v_fetch_limit := 10000;
3066    END IF;
3067 
3068    FEM_ENGINES_PKG.TECH_MESSAGE
3069    (c_log_level_1,c_block||'.'||c_proc_name||'.member select_stmt'
3070    ,x_select_stmt);
3071 
3072 
3073   build_insert_member_stmt (p_table_handler_name
3074                            ,p_dimension_id
3075                            ,p_value_set_required_flag
3076                            ,p_hier_dimension_flag
3077                            ,p_simple_dimension_flag
3078                            ,p_member_id_method_code
3079                            ,p_member_col
3080                            ,p_member_dc_col
3081                            ,p_member_name_col
3082                            ,x_insert_member_stmt);
3083 
3084    FEM_ENGINES_PKG.TECH_MESSAGE
3085    (c_log_level_1,c_block||'.'||c_proc_name||'.insert member stmt'
3086    ,x_insert_member_stmt);
3087 
3088    build_status_update_stmt (p_source_b_table
3089                             ,x_update_mbr_status_stmt);
3090 
3091    build_status_update_stmt (p_source_tl_table
3092                             ,x_update_tl_status_stmt);
3093 
3094    build_delete_stmt (p_source_b_table
3095                      ,x_delete_mbr_stmt);
3096 
3097    build_delete_stmt (p_source_tl_table
3098                      ,x_delete_tl_stmt);
3099 
3100 
3101    build_tl_dupname_stmt (p_dimension_varchar_label
3102                          ,p_dimension_id
3103                          ,p_load_type
3104                          ,p_target_b_table
3105                          ,p_target_tl_table
3106                          ,p_member_col
3107                          ,p_member_dc_col
3108                          ,p_member_name_col
3109                          ,p_value_set_required_flag
3110                          ,'NEW_MEMBERS'
3111                          ,x_dupname_count_stmt);
3112      FEM_ENGINES_PKG.TECH_MESSAGE
3113      (c_log_level_1,c_block||'.'||c_proc_name||'.dupname select stmt'
3114      ,x_dupname_count_stmt);
3115 
3116 
3117    IF (p_simple_dimension_flag = 'N') THEN
3118       build_attr_select_stmt (p_dimension_varchar_label
3119                              ,p_dimension_id
3120                              ,p_source_b_table
3121                              ,p_source_attr_table
3122                              ,p_target_b_table
3123                              ,p_member_t_dc_col
3124                              ,p_member_dc_col
3125                              ,p_member_col
3126                              ,p_value_set_required_flag
3127                              ,p_shared_dimension_flag
3128                              ,p_hier_dimension_flag
3129                              ,'Y'
3130                              ,'Y'
3131                              ,p_exec_mode_clause
3132                              ,x_attr_select_stmt);
3133 
3134       IF p_data_slc IS NOT NULL THEN
3135          x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}',p_data_slc);
3136       ELSE
3137          x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}','1=1');
3138       END IF;
3139 
3140      FEM_ENGINES_PKG.TECH_MESSAGE
3141      (c_log_level_1,c_block||'.'||c_proc_name||'.attribute select stmt'
3142      ,x_attr_select_stmt);
3143 
3144 
3145      build_status_update_stmt (p_source_attr_table
3146                               ,x_update_attr_status_stmt);
3147 
3148 /*  RCF 9-14-2004 Commented out since no longer needed
3149      build_dep_status_update_stmt (p_dimension_varchar_label
3150                                   ,p_source_attr_table
3151                                   ,p_member_t_dc_col
3152                                   ,p_value_set_required_flag
3153                                   ,x_update_dep_attr_status_stmt);  */
3154 
3155      build_insert_attr_stmt (p_target_attr_table
3156                             ,p_target_b_table
3157                             ,p_member_col
3158                             ,p_member_dc_col
3159                             ,p_value_set_required_flag
3160                             ,x_insert_attr_stmt);
3161 
3162      FEM_ENGINES_PKG.TECH_MESSAGE
3163      (c_log_level_1,c_block||'.'||c_proc_name||'.insert attr stmt'
3164      ,x_insert_attr_stmt);
3165 
3166 
3167       build_delete_stmt (p_source_attr_table
3168                         ,x_delete_attr_stmt);
3169 
3170       -- special insert stmts for the INTERIM tables for CAL_PERIOD loads
3171       IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
3172 
3173          build_calp_interim_insert_stmt(x_calp_interim_stmt
3174                                        ,x_calp_attr_interim_stmt);
3175       END IF;
3176 
3177    END IF;  --v_simple_dimension_flag = 'N'
3178 
3179    v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
3180                         -- the data slice loop
3181    LOOP
3182 
3183       IF p_load_type <> ('DIMENSION_GROUP') THEN
3184 
3185          FEM_Multi_Proc_Pkg.Get_Data_Slice(
3186            x_slc_id => v_slc_id,
3187            x_slc_val1 => v_slc_val,
3188            x_slc_val2 => v_slc_val2,
3189            x_slc_val3 => v_slc_val3,
3190            x_slc_val4 => v_slc_val4,
3191            x_num_vals  => v_num_vals,
3192            x_part_name => v_part_name,
3193            p_req_id => p_master_request_id,
3194            p_proc_num => p_proc_num);
3195 
3196          FEM_ENGINES_PKG.TECH_MESSAGE
3197           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
3198           ,v_slc_val);
3199          FEM_ENGINES_PKG.TECH_MESSAGE
3200           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
3201           ,v_slc_val2);
3202          FEM_ENGINES_PKG.TECH_MESSAGE
3203           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
3204           ,v_slc_val3);
3205          FEM_ENGINES_PKG.TECH_MESSAGE
3206           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
3207           ,v_slc_val4);
3208 
3209          EXIT WHEN (v_slc_id IS NULL);
3210       ELSE
3211          EXIT WHEN (v_loop_counter > 0);
3212          v_loop_counter := v_loop_counter + 1;
3213       END IF;
3214 
3215 
3216    ------------------------------------------------------------------------------
3217    -- Loop through the new members
3218    -- to perform validations and eventually insert into the target dimension tables
3219    ------------------------------------------------------------------------------
3220       IF p_load_type <> ('DIMENSION_GROUP') THEN
3221          OPEN cv_get_rows FOR x_select_stmt USING v_slc_val, v_slc_val2;
3222       ELSE
3223          OPEN cv_get_rows FOR x_select_stmt;
3224       END IF;
3225 
3226 
3227       LOOP
3228 
3229       -------------------------------------------
3230       -- Bulk Collect Rows from the source _T tables
3231       -- Using Dynamic SELECT Statement
3232       -------------------------------------------
3233          FETCH cv_get_rows BULK COLLECT INTO
3234                 t_rowid
3235                ,t_tl_rowid
3236                ,t_member_dc
3237                ,t_calendar_dc
3238                ,t_calendar_id
3239                ,t_cal_period_end_date
3240                ,t_cal_period_number
3241                ,t_value_set_dc
3242                ,t_value_set_id
3243                ,t_dimension_group_dc
3244                ,t_dimension_group_id
3245                ,t_b_status
3246                ,t_member_name
3247                ,t_member_desc
3248                ,t_language
3249                ,t_tl_status
3250                ,t_cal_period_start_date
3251                ,t_dimension_group_seq
3252                ,t_time_group_type_code
3253          LIMIT v_fetch_limit;
3254          ----------------------------------------------
3255          -- EXIT Fetch LOOP If No Rows are Retrieved --
3256          ----------------------------------------------
3257 
3258          v_mbr_last_row := t_member_dc.LAST;
3259 
3260          IF (v_mbr_last_row IS NULL)
3261          THEN
3262             EXIT;
3263          END IF;
3264 
3265          FEM_ENGINES_PKG.TECH_MESSAGE
3266           (c_log_level_1,c_block||'.'||c_proc_name||'.Rows retrieved this fetch',v_mbr_last_row);
3267 
3268          v_rows_fetched := v_rows_fetched + v_mbr_last_row;
3269 
3270          ----------------------------------------------
3271          --  Begin Validations
3272          ----------------------------------------------
3273          FOR i IN 1..v_mbr_last_row
3274          LOOP
3275 
3276             FEM_ENGINES_PKG.TECH_MESSAGE
3277             (c_log_level_1,c_block||'.'||c_proc_name||'.member display code'
3278             ,t_member_dc(i));
3279             FEM_ENGINES_PKG.TECH_MESSAGE
3280             (c_log_level_1,c_block||'.'||c_proc_name||'.dimension_group_id'
3281             ,t_dimension_group_id(i));
3282 
3283             -- initializing the adj_period_flag
3284             -- this will get set appropriately if the period
3285             -- is not an adj period during the date_overlap check
3286             t_adj_period_flag(i) := 'Y';
3287 
3288          -------------------------------------------------------------------
3289          -- For CAL_PERIOD member load, need to retrieve the periods_in_year
3290          -- for the Time Group Type of the new member.
3291          /***************************************************
3292            RCF 11/24/2004 Removing this check per bug#4031308
3293          IF (p_dimension_varchar_label = 'CAL_PERIOD'
3294              AND p_load_type NOT IN ('DIMENSION_GROUP')) THEN
3295             BEGIN
3296                SELECT A.number_assign_value
3297                INTO t_periods_in_year(i)
3298                FROM fem_time_grp_types_attr A
3299                    ,fem_dim_attributes_b DA
3300                    ,fem_dim_attr_versions_B V
3301                    ,fem_dimension_grps_b DG
3302                WHERE A.time_group_type_code = DG.time_group_type_code
3303                AND DG.dimension_group_id = t_dimension_group_id(i)
3304                AND A.attribute_id = DA.attribute_id
3305                AND DA.dimension_id = 33
3306                AND DA.attribute_varchar_label = 'PERIODS_IN_YEAR'
3307                AND A.version_id = V.version_id
3308                AND V.default_version_flag = 'Y'
3309                AND V.aw_snapshot_flag = 'N'
3310                AND V.attribute_id = DA.attribute_id;
3311              EXCEPTION
3312                 WHEN no_data_found THEN
3313                    t_periods_in_year(i) := 0;
3314                   FEM_ENGINES_PKG.TECH_MESSAGE
3315                   (c_log_level_1,c_block||'.'||c_proc_name||'.periods_in_year'
3316                   ,t_periods_in_year(i));
3317 
3318              END;
3319          END IF; -- CAL_PERIOD
3320          *************************************************/
3321 
3322          ----------------------------------------------
3323          --  Begin Duplicate Name Validations (only if dim <> 'CUSTOMER')
3324          --  Check to see if the translatabe name that will be load
3325          --  already exists for ANY language in the target TL table
3326          --  Set STATUS = 'DUPLICATE_NAME' if the name already exists
3327          ----------------------------------------------
3328          IF p_dimension_varchar_label <> 'CUSTOMER' THEN
3329             IF p_dimension_varchar_label = 'CAL_PERIOD'
3330                AND p_load_type <> 'DIMENSION_GROUP' THEN
3331                   EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
3332                      USING t_member_name(i)
3333                           ,t_dimension_group_id(i)
3334                           ,t_calendar_id(i);
3335 
3336             ELSE
3337                IF p_value_set_required_flag = 'Y' THEN
3338                   EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
3339                      USING t_member_name(i)
3340                           ,t_value_set_dc(i);
3341                ELSE
3342                   EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
3343                      USING t_member_name(i);
3344                END IF;
3345             END IF;
3346 
3347             IF v_dupname_count > 0 THEN
3348                t_b_status(i) := 'INVALID_MEMBER';
3349                t_tl_status(i) := 'DUPLICATE_NAME';
3350             END IF;
3351          END IF; -- p_dim_label <> 'CUSTOMER'
3352 
3353          ----------------------------------------------
3354          --  Begin Dimension Group Validations
3355          ----------------------------------------------
3356             IF (p_load_type = 'DIMENSION_GROUP') AND t_b_status(i) = 'LOAD' THEN
3357                SELECT count(*)
3358                INTO t_seq_conflict_count(i)
3359                FROM fem_dimension_grps_b
3360                WHERE dimension_group_seq = t_dimension_group_seq(i)
3361                AND dimension_id = p_dimension_id;
3362 
3363                IF t_seq_conflict_count(i) > 0 THEN
3364                   t_b_status(i) := 'DIMENSION_GROUP_SEQ_NOT_UNIQUE';
3365                END IF; -- seq_conflict_count
3366                IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
3367                   SELECT count(*)
3368                   INTO v_count
3369                   FROM fem_time_group_types_b
3370                   WHERE time_group_type_code = t_time_group_type_code(i);
3371 
3372                   IF v_count =0 THEN
3373                      t_b_status(i) := 'INVALID_TIME_GROUP_TYPE';
3374                      t_tl_status(i) := 'INVALID_MEMBER';
3375                   END IF;
3376                END IF; -- CAL_PERIOD
3377             ELSE
3378                IF (p_value_set_required_flag = 'Y' AND t_value_set_id(i) IS NULL) THEN
3379                   t_b_status(i) := 'INVALID_VALUE_SET';
3380                   t_tl_status(i) := 'INVALID_MEMBER';
3381                END IF;
3382 
3383                IF (p_dimension_varchar_label = 'CAL_PERIOD' AND t_calendar_id(i) IS NULL) THEN
3384                   t_b_status(i) := 'INVALID_CALENDAR';
3385                   t_tl_status(i) := 'INVALID_MEMBER';
3386                END IF;
3387 
3388                IF (p_hier_dimension_flag = 'Y'
3389                    AND t_b_status(i) = 'LOAD'
3390                    AND t_dimension_group_dc(i) IS NOT NULL
3391                    AND t_dimension_group_id(i) IS NULL) THEN
3392                   t_b_status(i) := 'INVALID_DIMENSION_GROUP';
3393                   t_tl_status(i) := 'INVALID_MEMBER';
3394                END IF; -- Validate Dimension Group
3395             END IF; -- Load Type Dimension Group v.s. Dimension
3396 
3397             IF p_simple_dimension_flag = 'N' THEN
3398 
3399                -- Count the number of required attribute rows
3400                SELECT count(*)
3401                INTO v_req_attribute_count
3402                FROM fem_dim_attributes_b
3403                WHERE dimension_id = p_dimension_id
3404                AND attribute_required_flag = 'Y'
3405                AND nvl(user_assign_allowed_flag,'Y') NOT IN ('N');
3406 
3407    /*  This section commented out - because Required attributes can't be assigned
3408        to a level.  Only optional attributes
3409                AND (attribute_id NOT IN (SELECT attribute_id FROM fem_dim_attr_grps)
3410                OR attribute_id IN (SELECT attribute_id
3411             FROM fem_dim_attr_grps
3412             WHERE dimension_group_id = t_dimension_group_id(i)));  */
3413 
3414 
3415                FEM_ENGINES_PKG.TECH_MESSAGE
3416                (c_log_level_1,c_block||'.'||c_proc_name||'.member status'
3417                ,t_b_status(i));
3418 
3419                ------------------------------------------------------------
3420                -- Bulk Collect ATTR_T Rows
3421                -- Using Dynamic SELECT Statement
3422                -- 11/03/2004 For this section, we only want to enter
3423                -- the attribute loop for Cal Period dimension when
3424                -- the Dimension Group is valid. Otherwise, the loader
3425                -- would report MISSING_REQ_ATTRIBUTE status for that member
3426                -- which is not correct.  For other dimensions, we want to
3427                -- enter the loop even when the Dimension Group is incorrect,
3428                -- so that all required attr rows in the _ATTR_T table get
3429                -- updated with INVALID_MEMBER
3430                -- The special update in the Pre Validation Attr section
3431                -- will update any req attr rows for CAL_PERIOD dimension
3432                -- when the Dimension Group is wrong
3433                ------------------------------------------------------------
3434             IF ((p_dimension_varchar_label = 'CAL_PERIOD' AND
3435                  t_b_status(i) in ('LOAD')) OR
3436                 (p_dimension_varchar_label NOT IN ('CAL_PERIOD') AND
3437                  t_b_status(i) IN ('LOAD','INVALID_VALUE_SET',
3438                                    'INVALID_DIMENSION_GROUP')))
3439                THEN
3440                   IF (p_value_set_required_flag = 'Y') THEN
3441                      OPEN cv_get_attr_rows FOR x_attr_select_stmt
3442                         USING t_member_dc(i)
3443                              ,t_value_set_dc(i);
3444                   ELSE
3445                      OPEN cv_get_attr_rows FOR x_attr_select_stmt
3446                         USING t_member_dc(i);
3447                    END IF; -- v_value_set_required_flag
3448 
3449                   FETCH cv_get_attr_rows BULK COLLECT INTO
3450                      ta_rowid
3451                     ,ta_member_read_only_flag
3452                     ,ta_attribute_id
3453                     ,ta_attribute_varchar_label
3454                     ,ta_attribute_dimension_id
3455                     ,ta_attr_value_column_name
3456                     ,ta_attribute_data_type_code
3457                     ,ta_attribute_required_flag
3458                     ,ta_read_only_flag
3459                     ,ta_allow_mult_versions_flag
3460                     ,ta_allow_mult_assign_flag
3461                     ,ta_member_dc
3462                     ,ta_value_set_dc
3463                     ,ta_attribute_assign_value
3464                     ,ta_dim_attr_numeric_member
3465                     ,ta_dim_attr_varchar_member
3466                     ,ta_number_assign_value
3467                     ,ta_varchar_assign_value
3468                     ,ta_date_assign_value
3469                     ,ta_version_display_code
3470                     ,ta_version_id
3471                     ,ta_attr_assign_vs_dc
3472                     ,ta_attr_assign_vs_id
3473                     ,ta_status
3474                     ,ta_use_interim_table_flag
3475                     ,ta_calpattr_cal_dc
3476                     ,ta_calpattr_dimgrp_dc
3477                     ,ta_calpattr_end_date
3478                     ,ta_calpattr_period_num
3479                   LIMIT v_fetch_limit;
3480 
3481                   v_attr_last_row := NVL(ta_attribute_id.LAST,0);
3482                   FEM_ENGINES_PKG.TECH_MESSAGE
3483                   (c_log_level_1,c_block||'.'||c_proc_name||'.assignment rows',v_attr_last_row);
3484 
3485                   FEM_ENGINES_PKG.TECH_MESSAGE
3486                   (c_log_level_1,c_block||'.'||c_proc_name||'.req_attr_rows',v_req_attribute_count);
3487 
3488                   -- Not enough attribute rows were returned because of either:
3489                   -- 1) the join to the  Version table (bad version display_code in _ATTR_T)
3490                   -- or
3491                   -- 2)  a missing required attribute row
3492                   -- In either case, we mark
3493                   -- the member as MISSING_REQUIRED_ATTRIBUTE and the attribute rows with the
3494                   -- valid version_display_code will get 'INVALID_MEMBER'.  The
3495                   -- Bad version display_code records have already been marked as
3496                   -- INVALID_VERSION in the Pre_validation
3497                   -- Note:  It is also possible to return too many attr rows,
3498                   --        if the user has attempted to provide "many to many"
3499                   --        for a requried attribute (which is not allowed).
3500                   --        So the comparison is <> to check for this case
3501                   IF t_b_status(i) IN ('LOAD')
3502                     AND v_attr_last_row < v_req_attribute_count THEN
3503                      t_b_status(i) := 'MISSING_REQUIRED_ATTRIBUTE';
3504                      t_tl_status(i) := 'INVALID_MEMBER';
3505                   FEM_ENGINES_PKG.TECH_MESSAGE
3506                   (c_log_level_1,c_block||'.'||c_proc_name||'.missing_req - end_date=',t_cal_period_end_date(i));
3507                   ELSIF t_b_status(i) IN ('LOAD')
3508                     AND v_attr_last_row > v_req_attribute_count THEN
3509                      t_b_status(i) := 'DUPLICATE_REQUIRED_ATTRIBUTES';
3510                      t_tl_status(i) := 'INVALID_MEMBER';
3511                   ELSE
3512                   FOR j IN 1..v_attr_last_row
3513                   LOOP
3514 
3515                      FEM_ENGINES_PKG.TECH_MESSAGE
3516                      (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_label'
3517                      ,ta_attribute_varchar_label(j));
3518                      FEM_ENGINES_PKG.TECH_MESSAGE
3519                      (c_log_level_1,c_block||'.'||c_proc_name||'.attribute assign value'
3520                      ,ta_attribute_assign_value(j));
3521                      FEM_ENGINES_PKG.TECH_MESSAGE
3522                      (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_column_name'
3523                      ,ta_attr_value_column_name(j));
3524 
3525 /*
3526                   -- Checking for duplicate attribute assignments
3527                   -- Because the unique index on the ATTR_T table allows
3528                   -- for duplicate assignments, we need to identify if such
3529                   -- cases exist and update the status appropriately
3530                   -- If allow_mult_assign = 'N' and duplicate exists,
3531                   -- then status = MULT_ASSIGN_NOT_ALLOWED
3532                   -- If allow_mult_assign = 'Y', then we have to check if
3533                   -- the assignments are identical - if they are identical,
3534                   -- then status = DUPLICATE_ATTR_ASSIGNMENTS
3535                   -- Note:  Since this is in the NEW_MEMBERS procedure,
3536                   -- we are dealing with just the default version here
3537                   -- which means we don't have compare version by version
3538                   IF ta_allow_mult_assign_flag(j) = 'N' THEN
3539                      v_duplicate_attr_count := 0;
3540                      FOR k IN 1..v_attr_last_row LOOP
3541                         IF ta_attribute_varchar_label(j) = ta_attribute_varchar_label(k) THEN
3542                           v_duplicate_attr_count := v_duplicate_attr_count + 1;
3543                         END IF;
3544                      END LOOP;
3545                      IF v_duplicate_attr_count > 1 THEN
3546                            ta_status(j) := 'MULT_ASSIGN_NOT_ALLOWED';
3547                            t_b_status(i) := 'INVALID_MEMBER';
3548                            t_tl_status(i) := 'INVALID_MEMBER';
3549                         EXIT; -- member is no good so exit
3550                      END IF;
3551                    -- for the default version, can't have multiple records with same assignment
3552                    -- when attribute is not CAL_PERIOD
3553                   ELSIF ta_allow_mult_assign_flag(j) = 'Y'
3554                      AND ta_attribute_dimension_id(j) <> 1 THEN
3555                      v_duplicate_attr_count := 0;
3556                      FOR k IN 1..v_attr_last_row LOOP
3557                         IF ta_attribute_varchar_label(j) = ta_attribute_varchar_label(k)
3558                            AND ta_attribute_assign_value(j) = ta_attribute_assign_value(k)
3559                            THEN
3560                           v_duplicate_attr_count := v_duplicate_attr_count + 1;
3561                         END IF;
3562                      END LOOP;
3563                      IF v_duplicate_attr_count > 1 THEN
3564                            ta_status(j) := 'DUPLICATE_ATTR_ASSIGNMENTS';
3565                            t_b_status(i) := 'INVALID_MEMBER';
3566                            t_tl_status(i) := 'INVALID_MEMBER';
3567                         EXIT; -- member is no good so exit
3568                      END IF;
3569                    -- for the default version, can't have multiple records with the same
3570                    -- CAL_PERIOD attr assignment columns when the attribute
3571                    -- is of dimension = CAL_PERIOD
3572                   ELSIF ta_allow_mult_assign_flag(j) = 'Y'
3573                      AND ta_attribute_dimension_id(j) = 1 THEN
3574                      v_duplicate_attr_count := 0;
3575                      FOR k IN 1..v_attr_last_row LOOP
3576                         IF ta_attribute_varchar_label(j) = ta_attribute_varchar_label(k)
3577                            AND ta_calpattr_cal_dc(j) = ta_calpattr_cal_dc(j)
3578                            AND ta_calpattr_dimgrp_dc(j) = ta_calpattr_dimgrp_dc(j)
3579                            AND ta_calpattr_end_date(j) = ta_calpattr_end_date(j)
3580                            AND ta_calpattr_period_num(j) = ta_calpattr_period_num(j)
3581                            THEN
3582                           v_duplicate_attr_count := v_duplicate_attr_count + 1;
3583                         END IF;
3584                      END LOOP;
3585                      IF v_duplicate_attr_count > 1 THEN
3586                            ta_status(j) := 'DUPLICATE_ATTR_ASSIGNMENTS';
3587                            t_b_status(i) := 'INVALID_MEMBER';
3588                            t_tl_status(i) := 'INVALID_MEMBER';
3589                         EXIT; -- member is no good so exit
3590                      END IF;
3591                   END IF;
3592 */
3593                      -----------------------------------------
3594                      -- Bug#3822561 Support for attributes of CAL_PERIOD
3595                      -- if the attribute_dimension_id = 1 (CAL_PERIOD)
3596                      -- then we construct a CAL_PERIOD_ID from the
3597                      -- special CALP columns and move it into the
3598                      -- ta_attribute_assign_value(j)
3599                      -----------------------------------------
3600                      IF ta_attribute_dimension_id(j) = 1 THEN
3601                         get_attr_assign_calp(ta_attribute_assign_value(j)
3602                                             ,ta_status(j)
3603                                             ,ta_calpattr_cal_dc(j)
3604                                             ,ta_calpattr_dimgrp_dc(j)
3605                                             ,ta_calpattr_end_date(j)
3606                                             ,ta_calpattr_period_num(j));
3607 
3608                         IF ta_status(j) NOT IN ('LOAD') THEN
3609                            FEM_ENGINES_PKG.TECH_MESSAGE
3610                            (c_log_level_1,c_block||'.'||c_proc_name
3611                            ,'Invalid Member - exiting Attribute loop');
3612 
3613                               t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3614                            t_tl_status(i) := 'INVALID_MEMBER';
3615                            EXIT; -- member is no good so exit
3616                         END IF;
3617                      END IF;
3618                      -----------------------------------------
3619                         -- BEGIN ATTR VALIDATIONS
3620                      --    validate version_display_code
3621                      -----------------------------------------
3622                      get_attr_version (p_dimension_varchar_label
3623                                       ,ta_attribute_varchar_label(j)
3624                                       ,ta_version_display_code(j)
3625                                       ,ta_version_id(j));
3626 
3627                      -----------------------------------------
3628                      -- validate attribute_assign_value
3629                      -----------------------------------------
3630                      -- VARCHAR_ASSIGN_VALUE
3631                      IF (ta_attr_value_column_name(j) = 'VARCHAR_ASSIGN_VALUE'
3632                         AND ta_attribute_assign_value(j) IS NOT NULL
3633                         AND ta_version_id(j) IS NOT NULL) THEN
3634 
3635                         ta_varchar_assign_value(j)
3636                            := to_char(ta_attribute_assign_value(j));
3637                      -- NUMBER_ASSIGN_VALUE
3638                      ELSIF (ta_attr_value_column_name(j) = 'NUMBER_ASSIGN_VALUE'
3639                         AND ta_attribute_assign_value(j) IS NOT NULL
3640                         AND ta_version_id(j) IS NOT NULL) THEN
3641                         BEGIN
3642                            ta_number_assign_value(j)
3643                               := to_number(ta_attribute_assign_value(j));
3644 
3645                            -- Special validation for CAL_PERIOD_NUMBER
3646                            -- ensures that the GL_PERIOD_NUM attr is identical
3647                            -- to the value in the CAL_PERIOD_NUMBER column
3648                            -- in the interface table
3649                            -- and also must be <= periods_in_year for the
3650                            -- Time Group Type
3651                            IF p_dimension_varchar_label = 'CAL_PERIOD' AND
3652                               ta_attribute_varchar_label(j) = 'GL_PERIOD_NUM' AND
3653                               ((t_cal_period_number(i) <> ta_number_assign_value(j) OR
3654                               t_cal_period_number(i) < 1 )) THEN
3655 
3656                               FEM_ENGINES_PKG.TECH_MESSAGE
3657                               (c_log_level_1,c_block||'.'||c_proc_name||'.period_number'
3658                               ,ta_number_assign_value(j));
3659 
3660                               RAISE e_invalid_cal_period_number;
3661                            END IF;
3662 
3663                            -- Special validation for ACCOUNTING_YEAR
3664                            -- ensures that the ACCOUNTING_YEAR value
3665                            -- is within the year range supported
3666                            IF p_dimension_varchar_label = 'CAL_PERIOD' AND
3667                               ta_attribute_varchar_label(j) = 'ACCOUNTING_YEAR' AND
3668                               (ta_number_assign_value(j) < 1900 OR
3669                               ta_number_assign_value(j) >= 2599) THEN
3670                               RAISE e_invalid_acct_year;
3671                            END IF;
3672 
3673                         EXCEPTION
3674                            WHEN e_invalid_cal_period_number THEN
3675                               ta_status(j) := 'INVALID_GL_PERIOD_NUM';
3676                               t_b_status(i) := 'INVALID_GL_PERIOD_NUM';
3677                               t_tl_status(i) := 'INVALID_GL_PERIOD_NUM';
3678 
3679                            WHEN e_invalid_acct_year THEN
3680                               ta_status(j) := 'INVALID_ACCOUNTING_YEAR';
3681                               t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3682                               t_tl_status(i) := 'INVALID_MEMBER';
3683 
3684                            WHEN e_invalid_number THEN
3685                               ta_status(j) := 'INVALID_NUMBER';
3686                               t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3687                               t_tl_status(i) := 'INVALID_MEMBER';
3688 
3689                            WHEN e_invalid_number1722 THEN
3690                               ta_status(j) := 'INVALID_NUMBER';
3691                               t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3692                               t_tl_status(i) := 'INVALID_MEMBER';
3693 
3694                         END;  -- NUMBER_ASSIGN_VALUE
3695                      -- DATE_ASSIGN_VALUE
3696                      ELSIF (ta_attr_value_column_name(j) = 'DATE_ASSIGN_VALUE'
3697                         AND ta_attribute_assign_value(j) IS NOT NULL
3698                         AND ta_version_id(j) IS NOT NULL) THEN
3699                         BEGIN
3700                            FEM_ENGINES_PKG.TECH_MESSAGE
3701                            (c_log_level_1,c_block||'.'||c_proc_name||'.assigning date'
3702                            ,ta_attribute_assign_value(j));
3703                            ta_date_assign_value(j)
3704                               := to_date(ta_attribute_assign_value(j),p_date_format_mask);
3705 
3706                            FEM_ENGINES_PKG.TECH_MESSAGE
3707                            (c_log_level_1,c_block||'.'||c_proc_name||'.end assigning date'
3708                            ,ta_date_assign_value(j));
3709 
3710                            -- Special validations for CAL_PERIOD
3711                            IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
3712 
3713                               IF ta_attribute_varchar_label(j) = 'CAL_PERIOD_START_DATE' THEN
3714                                  -- Saving the start_date at the member level so we
3715                                  -- can compare it later for date overlaps
3716                                  t_cal_period_start_date(i) := ta_date_assign_value(j);
3717 
3718                                  IF t_cal_period_start_date(i) > t_cal_period_end_date(i) THEN
3719                                     RAISE e_invalid_calp_start_date;
3720                                  END IF;
3721 
3722                               END IF;
3723 
3724                               IF ta_attribute_varchar_label(j) = 'CAL_PERIOD_END_DATE' AND
3725                                  t_cal_period_end_date(i) <> ta_date_assign_value(j) THEN
3726                                  RAISE e_invalid_cal_period_end_date;
3727                               END IF;
3728                               -- Special validation for CAL_PERIOD_START_DATE
3729                               -- looking for overlap periods in the _ATTR_T table for
3730                               -- new Cal Periods that the user is trying to load
3731                               -- We are only checking within our data slice, since
3732                               -- if the overlap is in a separate data slice, the main
3733                               -- check on "existing" overlap records will catch it
3734                               IF ta_attribute_varchar_label(j) = 'CAL_PERIOD_START_DATE' THEN
3735                               -- query to see if any records exist for the same
3736                               -- calendar/dimgrp in the ATTR_T interface table
3737                               -- for the data slice
3738                               -- where start_date <= x and end_date >= x
3739                               -- (where x is the new start date)
3740 
3741                               -- First check to see if the new cal period with the new start
3742                               -- date is an adj. period or not
3743                               /*********************************************************
3744                               bug#5060746 - comment out so can convert literals to bind variables
3745                                  x_adj_period_stmt := 'select count(*)'||
3746                                  ' from fem_cal_periods_attr_t A1'||
3747                                  ' where A1.calendar_display_code = '''||t_calendar_dc(i)||''''||
3748                                  ' and A1.dimension_group_display_code = '''||t_dimension_group_dc(i)||''''||
3749                                  ' and A1.cal_period_number = '''||t_cal_period_number(i)||''''||
3750                                  ' and to_char(A1.cal_period_end_date,'''||p_date_format_mask||''')'||
3751                                  ' = '''||to_char(t_cal_period_end_date(i),p_date_format_mask)||''''||
3752                                  ' and A1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3753                                  ' and A1.attribute_assign_value = ''Y''';
3754                                 ********************************************************/
3755 
3756                                  x_adj_period_stmt := 'select count(*)'||
3757                                  ' from fem_cal_periods_attr_t A1'||
3758                                  ' where A1.calendar_display_code = :b_cal_dc'||
3759                                  ' and A1.dimension_group_display_code = :b_dimgrp_dc'||
3760                                  ' and A1.cal_period_number = :b_calp_nbr'||
3761                                  ' and A1.cal_period_end_date'||
3762                                  ' = :b_calp_end_date'||
3763                                  ' and A1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3764                                  ' and A1.attribute_assign_value = ''Y''';
3765 
3766                                   EXECUTE IMMEDIATE x_adj_period_stmt INTO v_adj_period_count
3767                                   USING t_calendar_dc(i)
3768                                        ,t_dimension_group_dc(i)
3769                                        ,t_cal_period_number(i)
3770                                        ,t_cal_period_end_date(i);
3771 
3772                                  -- If not an adjustment period, then we need to check for
3773                                  -- date overlap
3774                                  IF v_adj_period_count = 0 THEN
3775                                     t_adj_period_flag(i) := 'N';
3776                                     -- query to see if any records exist for the same
3777                                     -- calendar/dimgrp in the offical db
3778                                     -- (new) array_start_date <= table.end_date AND
3779                                     -- array_end_date >= table.start_date
3780                                     -- and the existing members are not adj periods
3781                                     -- and the existing members are enabled=Y
3782                                      x_overlap_sql_stmt :=
3783                                      'select count(*)'||
3784                                      ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
3785                                      ' fem_cal_periods_b C,'||
3786                                      ' fem_dim_attributes_b AE,'||
3787                                      ' fem_dim_attr_Versions_b VE,'||
3788                                      ' fem_cal_periods_attr CP,'||
3789                                      ' fem_dim_attributes_b AP,'||
3790                                      ' fem_dim_attr_versions_b VP'||
3791                                      ' where CS.cal_period_id = C.cal_period_id'||
3792                                      ' and C.cal_period_id = CP.cal_period_id'||
3793                                      ' and C.enabled_flag = ''Y'''||
3794                                      ' and CP.attribute_id = AP.attribute_id'||
3795                                      ' and CP.version_id = VP.version_id'||
3796                                      ' and CP.dim_attribute_varchar_member = ''N'''||
3797                                      ' and AP.dimension_id = 1'||
3798                                      ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3799                                      ' and VP.attribute_id = AP.attribute_id'||
3800                                      ' and VP.default_version_flag = ''Y'''||
3801                                      ' and VP.aw_snapshot_flag = ''N'''||
3802                                      ' and C.calendar_id = :b_cal_id'||
3803                                      ' and C.dimension_group_id = :b_dimgrp_id'||
3804                                      ' and CS.attribute_id = :b_attr_id'||
3805                                      ' and CS.version_id = :b_vers_id'||
3806                                      ' and CS.date_assign_value'||
3807                                      ' <= :b_new_end_date'||
3808                                      ' and CS.cal_period_id = CE.cal_period_id'||
3809                                      ' and CE.attribute_id = AE.attribute_id'||
3810                                      ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
3811                                      ' and CE.version_id = VE.version_id'||
3812                                      ' and VE.aw_snapshot_flag = ''N'''||
3813                                      ' and VE.default_version_flag = ''Y'''||
3814                                      ' and VE.attribute_id = AE.attribute_id'||
3815                                      ' and CE.date_assign_value'||
3816                                      ' >= :b_new_start_date';
3817 
3818                                      FEM_ENGINES_PKG.TECH_MESSAGE
3819                                      (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt3'
3820                                      ,x_overlap_sql_stmt);
3821 
3822                                      EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count
3823                                         USING t_calendar_id(i)
3824                                              ,t_dimension_group_id(i)
3825                                              ,ta_attribute_id(j)
3826                                              ,ta_version_id(j)
3827                                              ,t_cal_period_end_date(i)
3828                                              ,ta_date_assign_value(j);
3829 
3830 
3831                                      /********************************************************
3832                                      bug#5060746 - comment out so can convert literals to bind variables
3833                                      x_overlap_sql_stmt :=
3834                                      'select count(*)'||
3835                                      ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
3836                                      ' fem_cal_periods_b C,'||
3837                                      ' fem_dim_attributes_b AE,'||
3838                                      ' fem_dim_attr_Versions_b VE,'||
3839                                      ' fem_cal_periods_attr CP,'||
3840                                      ' fem_dim_attributes_b AP,'||
3841                                      ' fem_dim_attr_versions_b VP'||
3842                                      ' where CS.cal_period_id = C.cal_period_id'||
3843                                      ' and C.cal_period_id = CP.cal_period_id'||
3844                                      ' and C.enabled_flag = ''Y'''||
3845                                      ' and CP.attribute_id = AP.attribute_id'||
3846                                      ' and CP.version_id = VP.version_id'||
3847                                      ' and CP.dim_attribute_varchar_member = ''N'''||
3848                                      ' and AP.dimension_id = 1'||
3849                                      ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3850                                      ' and VP.attribute_id = AP.attribute_id'||
3851                                      ' and VP.default_version_flag = ''Y'''||
3852                                      ' and VP.aw_snapshot_flag = ''N'''||
3853                                      ' and C.calendar_id = '||t_calendar_id(i)||
3854                                      ' and C.dimension_group_id = '||t_dimension_group_id(i)||
3855                                      ' and CS.attribute_id = '||ta_attribute_id(j)||
3856                                      ' and CS.version_id = '||ta_version_id(j)||
3857                                      ' and CS.date_assign_value'||
3858                                      ' <= :b_new_end_date'||
3859                                      ' and CS.cal_period_id = CE.cal_period_id'||
3860                                      ' and CE.attribute_id = AE.attribute_id'||
3861                                      ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
3862                                      ' and CE.version_id = VE.version_id'||
3863                                      ' and VE.aw_snapshot_flag = ''N'''||
3864                                      ' and VE.default_version_flag = ''Y'''||
3865                                      ' and VE.attribute_id = AE.attribute_id'||
3866                                      ' and CE.date_assign_value'||
3867                                      ' >= :b_new_start_date';
3868                                      **********************************************************/
3869 
3870 
3871                                      IF v_overlap_count > 0 THEN
3872                                         ta_status(j) := 'OVERLAP_EXIST_START_DATE';
3873                                         t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3874                                         t_tl_status(i) := 'INVALID_MEMBER';
3875                                      END IF; -- overlap if
3876                                   /*******************************************************
3877                                   ELSE  -- query to see if any records exist for the same
3878                                         -- calendar/dimgrp in the offical db
3879                                         -- where start_date >= x and start_date <= y
3880                                         -- (where x is the new start date and
3881                                         --  y is the new end date)
3882                                         -- and the exist periods are not adj periods
3883                                      x_overlap_sql_stmt :=
3884                                      'select count(*)'||
3885                                      ' from fem_cal_periods_attr CS,'||
3886                                      ' fem_cal_periods_b C,'||
3887                                      ' fem_cal_periods_attr CP,'||
3888                                      ' fem_dim_attributes_b AP,'||
3889                                      ' fem_dim_attr_versions_b VP'||
3890                                      ' where CS.cal_period_id = C.cal_period_id'||
3891                                      ' and C.cal_period_id = CP.cal_period_id'||
3892                                      ' and C.enabled_flag = ''Y'''||
3893                                      ' and CP.attribute_id = AP.attribute_id'||
3894                                      ' and CP.version_id = VP.version_id'||
3895                                      ' and CP.dim_attribute_varchar_member = ''N'''||
3896                                      ' and AP.dimension_id = 1'||
3897                                      ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
3898                                      ' and VP.attribute_id = AP.attribute_id'||
3899                                      ' and VP.default_version_flag = ''Y'''||
3900                                      ' and VP.aw_snapshot_flag = ''N'''||
3901                                      ' and C.calendar_id = '||t_calendar_id(i)||
3902                                      ' and C.dimension_group_id = '||t_dimension_group_id(i)||
3903                                      ' and CS.attribute_id = '||ta_attribute_id(j)||
3904                                      ' and CS.version_id = '||ta_version_id(j)||
3905                                      ' and to_char(CS.date_assign_value,'''||p_date_format_mask||''')'||
3906                                      ' >= '''||to_char(ta_date_assign_value(j),p_date_format_mask)||''''||
3907                                      ' and to_char(CS.date_assign_value,'''||p_date_format_mask||''')'||
3908                                      ' <= '''||to_char(t_cal_period_end_date(i),p_date_format_mask)||'''';
3909 
3910                                      FEM_ENGINES_PKG.TECH_MESSAGE
3911                                       (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt4'
3912                                       ,x_overlap_sql_stmt);
3913                                      EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count;
3914 
3915                                      IF v_overlap_count > 0 THEN
3916                                         ta_status(j) := 'OVERLAP_EXIST_START_DATE';
3917                                         t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3918                                         t_tl_status(i) := 'INVALID_MEMBER';
3919                                      END IF;
3920                                      ***********************************************/
3921                                   ELSE
3922                                      t_adj_period_flag(i) := 'Y';
3923                                   END IF; -- adj_count >0
3924                                END IF; -- attribute is start_date
3925                             END IF;  -- special checks for 'CAL_PERIOD' dimension
3926                            --End Special Checks for CAL Period
3927                            ----------------------------------------------------------------
3928                         EXCEPTION
3929                            WHEN e_invalid_calp_start_date THEN
3930                               ta_status(j) := 'INVALID_CAL_PERIOD_START_DATE';
3931                               t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3932                               t_tl_status(i) := 'INVALID_MEMBER';
3933                            WHEN e_invalid_cal_period_end_date THEN
3934                               ta_status(j) := 'INVALID_CAL_PERIOD_END_DATE';
3935                               t_b_status(i) := 'INVALID_CAL_PERIOD_END_DATE';
3936                               t_tl_status(i) := 'INVALID_CAL_PERIOD_END_DATE';
3937                            WHEN e_date_string_too_long THEN
3938                                  ta_status(j) := 'INVALID_DATE';
3939                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3940                                  t_tl_status(i) := 'INVALID_MEMBER';
3941                            WHEN e_invalid_date_format THEN
3942                                  ta_status(j) := 'INVALID_DATE';
3943                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3944                                  t_tl_status(i) := 'INVALID_MEMBER';
3945                            WHEN e_invalid_date THEN
3946                                  ta_status(j) := 'INVALID_DATE';
3947                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3948                                  t_tl_status(i) := 'INVALID_MEMBER';
3949                            WHEN e_invalid_date_numeric THEN
3950                                  ta_status(j) := 'INVALID_DATE';
3951                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3952                                  t_tl_status(i) := 'INVALID_MEMBER';
3953                            WHEN e_invalid_date_between THEN
3954                                  ta_status(j) := 'INVALID_DATE';
3955                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3956                                  t_tl_status(i) := 'INVALID_MEMBER';
3957                            WHEN e_invalid_date_year THEN
3958                                  ta_status(j) := 'INVALID_DATE';
3959                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3960                                  t_tl_status(i) := 'INVALID_MEMBER';
3961                            WHEN e_invalid_date_day THEN
3962                                  ta_status(j) := 'INVALID_DATE';
3963                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3964                                  t_tl_status(i) := 'INVALID_MEMBER';
3965 
3966                         END; -- DATE_ASSIGN_VALUE
3967                      ELSIF (ta_attr_value_column_name(j) IN
3968                         ('DIM_ATTRIBUTE_VARCHAR_MEMBER', 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
3969                         AND ta_attribute_assign_value(j) IS NOT NULL
3970                         AND ta_version_id(j) IS NOT NULL) THEN
3971 
3972                      --------------------------------------------------
3973                      -- get the Value Set ID for the assigned attribute
3974                      -- 9/15/2004 RCF Modify this section so that if the
3975                      -- attr_assign_vs_dc doesn't exist for the specified dimension
3976                      -- the row fails
3977                      -- Note that the INVALID_ATTR_ASSIGN_VS status will never
3978                      -- appear, since the INVALID_DIM_ASSIGNMENT will overwrite it
3979                      -- in the case of a bad VS being specified for a member
3980                      --------------------------------------------------
3981                         IF (ta_attr_assign_vs_dc(j) IS NOT NULL) THEN
3982                            BEGIN
3983                               SELECT value_set_id
3984                               INTO ta_attr_assign_vs_id(j)
3985                               FROM fem_value_sets_b
3986                               WHERE value_set_display_code = ta_attr_assign_vs_dc(j)
3987                               AND dimension_id = ta_attribute_dimension_id(j);
3988                            EXCEPTION
3989                               WHEN no_data_found THEN
3990                                  ta_status(j) := 'INVALID_ATTR_ASSIGN_VALUE_SET';
3991                                  t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
3992                                  t_tl_status(i) := 'INVALID_MEMBER';
3993                            END;
3994                         END IF;
3995 
3996                         verify_attr_member (ta_attribute_varchar_label(j)
3997                                            ,p_dimension_varchar_label
3998      		                        ,ta_attribute_assign_value(j)
3999 	                                ,ta_attr_assign_vs_dc(j)
4000 	                                ,v_attr_success
4001 	                                ,v_temp_member);
4002                         FEM_ENGINES_PKG.TECH_MESSAGE
4003                         (c_log_level_1,c_block||'.'||c_proc_name||'.verify_attribute_success'
4004                         ,v_attr_success);
4005 
4006                         IF (v_attr_success = 'N') THEN
4007                            ta_status(j) := 'INVALID_DIM_ASSIGNMENT';
4008                            t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4009                            t_tl_status(i) := 'INVALID_MEMBER';
4010                         ELSIF (v_attr_success = 'MISSING_ATTR_ASSIGN_VS') THEN
4011                            ta_status(j) := 'MISSING_ATTR_ASSIGN_VS';
4012                            t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4013                            t_tl_status(i) := 'INVALID_MEMBER';
4014                         ELSE -- DIM Assignment is good
4015                            IF (ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_VARCHAR_MEMBER') THEN
4016                               ta_dim_attr_varchar_member(j) := to_char(v_temp_member);
4017                            ELSE
4018                               ta_dim_attr_numeric_member(j) := to_number(v_temp_member);
4019                            END IF; -- Choice between VARCHAR and NUMERIC Dim members
4020                         END IF;  -- attr_req=Y and success=N
4021                      ELSIF (ta_member_dc(j) IS NULL) THEN
4022                            ta_status(j) := 'INVALID_MEMBER';
4023                            t_b_status(i) := 'MISSING_REQUIRED_ATTRIBUTE';
4024                            t_tl_status(i) := 'INVALID_MEMBER';
4025                      ELSIF (ta_version_id(j) IS NULL) THEN-- Version is NULL
4026                            ta_status(j) := 'INVALID_VERSION';
4027                            t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4028                            t_tl_status(i) := 'INVALID_MEMBER';
4029                      ELSE -- Assignment is NULL or Assignment Column not valid
4030                            ta_status(j) := 'INVALID_ATTRIBUTE_ASSIGNMENT';
4031                            t_b_status(i) := 'INVALID_REQUIRED_ATTRIBUTE';
4032                            t_tl_status(i) := 'INVALID_MEMBER';
4033                      END IF; -- Main IF on validating the attributes
4034 
4035                      FEM_ENGINES_PKG.TECH_MESSAGE
4036                      (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_status'
4037                      ,ta_status(j));
4038                      FEM_ENGINES_PKG.TECH_MESSAGE
4039                      (c_log_level_1,c_block||'.'||c_proc_name||'.member_status'
4040                      ,t_b_status(i));
4041 
4042                      IF (t_b_status(i) NOT IN ('LOAD')) THEN
4043                         FEM_ENGINES_PKG.TECH_MESSAGE
4044                         (c_log_level_1,c_block||'.'||c_proc_name
4045                         ,'Invalid Member - exiting Attribute loop');
4046 
4047                         EXIT; -- member is no good so exit
4048                      END IF;
4049                   END LOOP; -- attribute validations
4050                   END IF;  -- If v_attr_last_row = v_req_attribute_count
4051                   --------------------------------------------------------------------
4052                   FEM_ENGINES_PKG.TECH_MESSAGE
4053                   (c_log_level_1,c_block||'.'||c_proc_name||'.member status'
4054                   ,t_b_status(i));
4055 
4056                   FEM_ENGINES_PKG.TECH_MESSAGE
4057                   (c_log_level_1,c_block||'.'||c_proc_name||'.tl_member status'
4058                   ,t_tl_status(i));
4059 
4060                   IF (t_b_status(i) NOT IN ('LOAD')) THEN
4061                      FEM_ENGINES_PKG.TECH_MESSAGE
4062                      (c_log_level_1,c_block||'.'||c_proc_name
4063                      ,'Invalid Member - Reset all attributes of the member to INVALID_MEMBER');
4064 
4065                      FOR k IN 1..v_attr_last_row
4066                      LOOP
4067                         IF (ta_status(k) = 'LOAD') THEN
4068                            ta_status(k) := 'INVALID_MEMBER';
4069                         END IF;
4070                      END LOOP;
4071                   END IF;
4072 
4073                   -----------------------------------------------------------------
4074                   -- Copy ATTR Collection for good members in prep for insert later
4075                   -----------------------------------------------------------------
4076                   IF (t_b_status(i) = 'LOAD') THEN
4077 
4078                      v_attr_count := 1;
4079                      WHILE v_attr_count <= v_attr_last_row
4080                      LOOP
4081                         IF (ta_status(v_attr_count) = 'LOAD') THEN
4082                            v_attr_final_count := v_attr_final_count + 1;
4083 
4084                            tfa_rowid(v_attr_final_count) := ta_rowid(v_attr_count);
4085                            tfa_attribute_id(v_attr_final_count) := ta_attribute_id(v_attr_count);
4086                            tfa_member_dc(v_attr_final_count) := ta_member_dc(v_attr_count);
4087                            tfa_value_set_dc(v_attr_final_count) := ta_value_set_dc(v_attr_count);
4088                            tfa_dim_attr_numeric_member(v_attr_final_count) := ta_dim_attr_numeric_member(v_attr_count);
4089                            tfa_dim_attr_varchar_member(v_attr_final_count) := ta_dim_attr_varchar_member(v_attr_count);
4090                            tfa_number_assign_value(v_attr_final_count) := ta_number_assign_value(v_attr_count);
4091                            tfa_varchar_assign_value(v_attr_final_count) := ta_varchar_assign_value(v_attr_count);
4092                            tfa_date_assign_value(v_attr_final_count) := ta_date_assign_value(v_attr_count);
4093                            tfa_version_id(v_attr_final_count) := ta_version_id(v_attr_count);
4094                            tfa_attr_assign_vs_id(v_attr_final_count) := ta_attr_assign_vs_id(v_attr_count);
4095                            tfa_status(v_attr_final_count) := ta_status(v_attr_count);
4096                            tfa_attribute_varchar_label(v_attr_final_count) := ta_attribute_varchar_label(v_attr_count);
4097 
4098 
4099                         END IF; -- Copy ATTR for good members
4100 
4101                         v_attr_count    := v_attr_count + 1;
4102                      END LOOP;
4103                   ELSE
4104                      ----------------------------------------------------------
4105                      -- Count the error rows
4106                      ----------------------------------------------------------
4107                      v_temp_rows_rejected := v_temp_rows_rejected + v_attr_last_row;
4108 
4109                   END IF; -- Copy good members and ATTR
4110 
4111                   ----------------------------------------------------------
4112                   -- Update Status of ATTR Collection for failed records
4113                   ----------------------------------------------------------
4114                   FORALL i IN 1..v_attr_last_row
4115                      EXECUTE IMMEDIATE x_update_attr_status_stmt
4116                      USING ta_status(i)
4117                           ,ta_rowid(i)
4118                           ,ta_status(i);
4119 
4120                   --------------------------------------------
4121                   -- Delete ATTR Collection for Next Bulk Fetch --
4122                   --------------------------------------------
4123                   ta_rowid.DELETE;
4124                   ta_member_read_only_flag.DELETE;
4125                   ta_attribute_id.DELETE;
4126                   ta_attribute_varchar_label.DELETE;
4127                   ta_attribute_dimension_id.DELETE;
4128                   ta_attr_value_column_name.DELETE;
4129                   ta_attribute_data_type_code.DELETE;
4130                   ta_attribute_required_flag.DELETE;
4131                   ta_read_only_flag.DELETE;
4132                   ta_allow_mult_versions_flag.DELETE;
4133                   ta_allow_mult_assign_flag.DELETE;
4134                   ta_member_dc.DELETE;
4135                   ta_value_set_dc.DELETE;
4136                   ta_attribute_assign_value.DELETE;
4137                   ta_dim_attr_numeric_member.DELETE;
4138                   ta_dim_attr_varchar_member.DELETE;
4139                   ta_number_assign_value.DELETE;
4140                   ta_varchar_assign_value.DELETE;
4141                   ta_date_assign_value.DELETE;
4142                   ta_version_display_code.DELETE;
4143                   ta_version_id.DELETE;
4144                   ta_language.DELETE;
4145                   ta_attr_assign_vs_dc.DELETE;
4146                   ta_attr_assign_vs_id.DELETE;
4147                   ta_status.DELETE;
4148                   ta_use_interim_table_flag.DELETE;
4149                   ta_calpattr_cal_dc.DELETE;
4150                   ta_calpattr_dimgrp_dc.DELETE;
4151                   ta_calpattr_end_date.DELETE;
4152                   ta_calpattr_period_num.DELETE;
4153 
4154 
4155                   CLOSE cv_get_attr_rows;
4156              END IF; -- t_b_status(i) = 'LOAD'
4157             END IF; -- Simple Dimension Flag = N
4158          END LOOP;  -- Begin Validations
4159 
4160 
4161          -----------------------------------------------------------------
4162          -- Copy Member Collection for good members in prep for insert later
4163          -----------------------------------------------------------------
4164          v_mbr_last_row := t_member_dc.LAST;
4165          v_mbr_count := 1;
4166 
4167          FEM_ENGINES_PKG.TECH_MESSAGE
4168          (c_log_level_1,c_block||'.'||c_proc_name||'.before copy good members',
4169          v_mbr_last_row);
4170 
4171 
4172          ----------------------------------------------------------
4173          -- Count the attribute error rows
4174          ----------------------------------------------------------
4175          v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
4176          v_temp_rows_rejected := 0;  -- initialize so we can use again
4177          FEM_ENGINES_PKG.TECH_MESSAGE
4178          (c_log_level_1,c_block||'.'||c_proc_name||'.attr error rows',
4179          v_rows_rejected);
4180 
4181          WHILE v_mbr_count <= v_mbr_last_row
4182             LOOP
4183                IF (t_b_status(v_mbr_count) = 'LOAD') THEN
4184             /************************************
4185             Commenting out Array Date Overlap checks per bug#4030717
4186             Date Overlap checks within the load are now handled in the
4187             FEM_CALP_INTERIM_T and FEM_CALP_ATTR_INTERIM_T tables
4188             so that we can use MP for CAL_PERIOD loads
4189             ______________________________________________________
4190 
4191             FEM_ENGINES_PKG.TECH_MESSAGE
4192              (c_log_level_1,c_block||'.'||c_proc_name
4193              ,'Start Overlap Check - t_b_status = '||t_b_status(v_mbr_count));
4194 
4195 
4196             -- perform date overlap checks
4197             -- cycle thru every member in the array to look for
4198             -- date overlaps
4199                v_mbr_subcount := v_mbr_count + 1;  -- we always start checking
4200                                                -- for date overlaps starting one
4201                                                -- member below our current position
4202             FEM_ENGINES_PKG.TECH_MESSAGE
4203              (c_log_level_1,c_block||'.'||c_proc_name
4204              ,'Overlap Check - v_mbr_count = '||v_mbr_count);
4205 
4206                IF p_dimension_varchar_label = 'CAL_PERIOD'
4207                 AND p_load_type NOT IN ('DIMENSION_GROUP')
4208                 AND t_b_status(v_mbr_count) = 'LOAD'
4209                 AND t_adj_period_flag(v_mbr_count) = 'N' THEN
4210 
4211                FEM_ENGINES_PKG.TECH_MESSAGE
4212                 (c_log_level_1,c_block||'.'||c_proc_name
4213                 ,'Overlap Check inside CAL_PERIOD = ');
4214 
4215                   WHILE v_mbr_subcount <= v_mbr_last_row AND t_b_status(v_mbr_count) = 'LOAD'
4216                   LOOP
4217 
4218                FEM_ENGINES_PKG.TECH_MESSAGE
4219                 (c_log_level_1,c_block||'.'||c_proc_name
4220                 ,'Overlap Check - sub start_date = '||t_cal_period_start_date(v_mbr_subcount));
4221 
4222                FEM_ENGINES_PKG.TECH_MESSAGE
4223                 (c_log_level_1,c_block||'.'||c_proc_name
4224                 ,'Overlap Check - start_date = '||t_cal_period_start_date(v_mbr_count));
4225 
4226                FEM_ENGINES_PKG.TECH_MESSAGE
4227                 (c_log_level_1,c_block||'.'||c_proc_name
4228                 ,'Overlap Check - sub end_date = '||t_cal_period_end_date(v_mbr_subcount));
4229 
4230                FEM_ENGINES_PKG.TECH_MESSAGE
4231                 (c_log_level_1,c_block||'.'||c_proc_name
4232                 ,'Overlap Check - end_date = '||t_cal_period_end_date(v_mbr_count));
4233 
4234                FEM_ENGINES_PKG.TECH_MESSAGE
4235                 (c_log_level_1,c_block||'.'||c_proc_name
4236                 ,'Overlap Check - sub adj_flag = '||t_adj_period_flag(v_mbr_subcount));
4237 
4238                     IF t_adj_period_flag(v_mbr_subcount) = 'N'
4239                        AND ((t_cal_period_start_date(v_mbr_subcount) <=
4240                         t_cal_period_start_date(v_mbr_count)
4241                        AND t_cal_period_end_date(v_mbr_subcount) >=
4242                            t_cal_period_start_date(v_mbr_count))
4243                        OR (t_cal_period_start_date(v_mbr_subcount) >=
4244                            t_cal_period_start_date(v_mbr_count)
4245                        AND t_cal_period_start_date(v_mbr_subcount) <=
4246                            t_cal_period_end_date(v_mbr_count)))
4247                     THEN
4248                        v_attr_last_row := NVL(tfa_attribute_id.LAST,0);
4249                        v_attr_count := 0;
4250                        FEM_ENGINES_PKG.TECH_MESSAGE
4251                         (c_log_level_1,c_block||'.'||c_proc_name
4252                         ,'Overlap Member - Reset all attributes of the member to INVALID_MEMBER');
4253 
4254                        FOR k IN 1..v_attr_last_row
4255                        LOOP
4256                           IF ((tfa_member_dc(k) = t_member_dc(v_mbr_count) OR
4257                                tfa_member_dc(k) = t_member_dc(v_mbr_subcount))) AND
4258                              (tfa_attribute_varchar_label(k) = 'CAL_PERIOD_START_DATE') AND
4259                               tfa_status(k) = 'LOAD' THEN
4260                              tfa_status(k) := 'OVERLAP_START_DATE_IN_LOAD';
4261                              v_rows_rejected := v_rows_rejected + 1;
4262                           ELSIF ((tfa_member_dc(k) = t_member_dc(v_mbr_count) OR
4263                                   tfa_member_dc(k) = t_member_dc(v_mbr_subcount))) AND
4264                              (tfa_attribute_varchar_label(k) NOT IN ('CAL_PERIOD_START_DATE')) AND
4265                              tfa_status(k) = 'LOAD' THEN
4266                              tfa_status(k) := 'INVALID_MEMBER';
4267                              v_rows_rejected := v_rows_rejected + 1;
4268                           END IF;
4269                        END LOOP;
4270                        t_tl_status(v_mbr_count) := 'INVALID_MEMBER';
4271                        t_b_status(v_mbr_count) := 'INVALID_REQUIRED_ATTRIBUTE';
4272                        t_tl_status(v_mbr_subcount) := 'INVALID_MEMBER';
4273                        t_b_status(v_mbr_subcount) := 'INVALID_REQUIRED_ATTRIBUTE';
4274                     END IF; -- overlap checking
4275                     v_mbr_subcount    := v_mbr_subcount + 1;
4276                     END LOOP;
4277                  END IF; -- CAL_PERIOD and not a dimension group load
4278 
4279                IF (t_b_status(v_mbr_count) = 'LOAD') THEN
4280                -- end commented out Array date overlap check
4281                */
4282                ------------------------------------------------------------
4283 
4284                   -- if the member is still in LOAD status, we copy it to the final array
4285                      v_mbr_final_count := v_mbr_final_count + 1;
4286 
4287                      IF (p_load_type = 'DIMENSION_GROUP') THEN
4288                         SELECT fem_dimension_grps_b_s.nextval
4289                         INTO tf_dimgrp_dimension_group_id(v_mbr_final_count)
4290                         FROM dual;
4291 
4292                         SELECT fem_time_dimension_group_key_s.nextval
4293                         INTO tf_time_dimension_group_key(v_mbr_final_count)
4294                         FROM dual;
4295 
4296                         tf_time_group_type_code(v_mbr_final_count) :=t_time_group_type_code(v_mbr_count);
4297                         tf_dimension_group_seq(v_mbr_final_count) :=t_dimension_group_seq(v_mbr_count);
4298 
4299                      END IF;
4300                        FEM_ENGINES_PKG.TECH_MESSAGE
4301                          (c_log_level_1,c_block||'.'||c_proc_name||'.In the copy',
4302                           null);
4303 
4304 
4305                      tf_rowid(v_mbr_final_count) := t_rowid(v_mbr_count);
4306                      tf_tl_rowid(v_mbr_final_count) := t_tl_rowid(v_mbr_count);
4307                      tf_member_dc(v_mbr_final_count) := t_member_dc(v_mbr_count);
4308                      tf_calendar_id(v_mbr_final_count) := t_calendar_id(v_mbr_count);
4309                      tf_cal_period_end_date(v_mbr_final_count) := t_cal_period_end_date(v_mbr_count);
4310                      tf_cal_period_number(v_mbr_final_count) := t_cal_period_number(v_mbr_count);
4311                      tf_value_set_id(v_mbr_final_count) := t_value_set_id(v_mbr_count);
4312                      tf_dimension_group_id(v_mbr_final_count) := t_dimension_group_id(v_mbr_count);
4313                      tf_member_name(v_mbr_final_count) := t_member_name(v_mbr_count);
4314                      tf_member_desc(v_mbr_final_count) := t_member_desc(v_mbr_count);
4315                      tf_language(v_mbr_final_count) := t_language(v_mbr_count);
4316                      tf_status(v_mbr_final_count) := t_b_status(v_mbr_count);
4317                      tf_dimension_id(v_mbr_final_count) := p_dimension_id;
4318                      tf_calendar_dc(v_mbr_final_count) := t_calendar_dc(v_mbr_count);
4319                      tf_dimension_group_dc(v_mbr_final_count) := t_dimension_group_dc(v_mbr_count);
4320                      tf_cal_period_start_date(v_mbr_final_count) := t_cal_period_start_date(v_mbr_count);
4321                      tf_adj_period_flag(v_mbr_final_count) := t_adj_period_flag(v_mbr_count);
4322 
4323 
4324                /*
4325                Commented out Array Date Overlap checks per bug#4030717
4326                ELSE
4327                   -- count the error members
4328                   -- we add 2 because every new member always has 1 B_T record
4329                   -- and a TL_T record
4330                   v_temp_rows_rejected := v_temp_rows_rejected + 2;
4331                   FEM_ENGINES_PKG.TECH_MESSAGE
4332                   (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected',
4333                    v_temp_rows_rejected);
4334 
4335                END IF; -- Copy good members
4336                ***************/
4337                ELSE
4338                   -- count the error members
4339                   -- we add 2 because every new member always has 1 B_T record
4340                   -- and a TL_T record
4341                   v_temp_rows_rejected := v_temp_rows_rejected + 2;
4342                   FEM_ENGINES_PKG.TECH_MESSAGE
4343                   (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected',
4344                    v_temp_rows_rejected);
4345 
4346                END IF;  -- status = LOAD
4347             v_mbr_count    := v_mbr_count + 1;
4348             END LOOP;
4349 
4350 ------------------------------------------------------------------------
4351 --  INSERTING
4352 ------------------------------------------------------------------------
4353             FEM_ENGINES_PKG.TECH_MESSAGE
4354             (c_log_level_3,c_block||'.'||c_proc_name||'.Member_Insert',
4355              null);
4356 
4357             ---------------------------------------------------------
4358             -- set the v_final_mbr_last_row in case a member was removed
4359             ---------------------------------------------------------
4360             v_final_mbr_last_row := tf_member_dc.LAST;
4361             FEM_ENGINES_PKG.TECH_MESSAGE
4362             (c_log_level_3,c_block||'.'||c_proc_name||'.v_attr_final_count',
4363             v_final_mbr_last_row);
4364 
4365 
4366             IF (v_final_mbr_last_row IS NULL) THEN
4367                v_final_mbr_last_row := 0;
4368             ELSIF v_final_mbr_last_row >0 THEN
4369                v_rows_loaded := v_rows_loaded + v_final_mbr_last_row;
4370             END IF;
4371             ---------------------------------------------------------
4372             -- Call table handler for the remaining good members
4373             ---------------------------------------------------------
4374             IF (p_load_type = 'DIMENSION_GROUP') THEN
4375                FORALL i IN 1..v_final_mbr_last_row
4376                   EXECUTE IMMEDIATE x_insert_member_stmt
4377                   USING tf_member_dc(i)
4378                        ,tf_member_name(i)
4379                        ,tf_member_desc(i)
4380                        ,gv_apps_user_id
4381                        ,gv_apps_user_id
4382                        ,tf_time_dimension_group_key(i)
4383                        ,tf_dimension_group_seq(i)
4384                        ,tf_time_group_type_code(i)
4385                        ,tf_dimgrp_dimension_group_id(i)
4386                        ,tf_dimension_id(i);
4387 
4388             END IF;
4389          FEM_ENGINES_PKG.TECH_MESSAGE
4390          (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.p_value_set_req_flag'
4391          ,p_value_set_required_flag);
4392 
4393          FEM_ENGINES_PKG.TECH_MESSAGE
4394          (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.p_hier_dim_flag'
4395          ,p_hier_dimension_flag);
4396 
4397 
4398          FEM_ENGINES_PKG.TECH_MESSAGE
4399          (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.gv_apps_user_id'
4400          ,gv_apps_user_id);
4401 
4402             IF (p_load_type = 'DIMENSION_MEMBER') THEN
4403                IF (p_value_set_required_flag = 'Y'
4404                    AND p_hier_dimension_flag = 'Y') THEN
4405 
4406          FEM_ENGINES_PKG.TECH_MESSAGE
4407          (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.in the forall'
4408          ,null);
4409 
4410                   FORALL i IN 1..v_final_mbr_last_row
4411                      EXECUTE IMMEDIATE x_insert_member_stmt
4412                      USING tf_value_set_id(i)
4413                           ,tf_dimension_group_id(i)
4414                           ,tf_member_dc(i)
4415                           ,tf_member_name(i)
4416                           ,tf_member_desc(i)
4417                           ,gv_apps_user_id
4418                           ,gv_apps_user_id;
4419                ELSIF (p_value_set_required_flag = 'Y'
4420                    AND p_hier_dimension_flag = 'N') THEN
4421                   FORALL i IN 1..v_final_mbr_last_row
4422                      EXECUTE IMMEDIATE x_insert_member_stmt
4423                      USING tf_value_set_id(i)
4424                           ,tf_member_dc(i)
4425                           ,tf_member_name(i)
4426                           ,tf_member_desc(i)
4427                           ,gv_apps_user_id
4428                           ,gv_apps_user_id;
4429                ELSIF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
4430                   -- Members for the CAL_PERIOD dimensions are inserted into an
4431                   -- Interim table for further processing
4432                   FORALL i IN 1 .. v_final_mbr_last_row
4433                      EXECUTE IMMEDIATE x_calp_interim_stmt
4434                      USING tf_cal_period_end_date(i)
4435                      ,tf_cal_period_number(i)
4436                      ,tf_calendar_dc(i)
4437                      ,tf_dimension_group_dc(i)
4438                      ,tf_cal_period_start_date(i)
4439                      ,tf_member_dc(i)
4440                      ,tf_dimension_group_id(i)
4441                      ,tf_calendar_id(i)
4442                      ,tf_member_name(i)
4443                      ,tf_member_desc(i)
4444                      ,tf_adj_period_flag(i)
4445                      ,'Y' -- use_interim_table_flag
4446                      ,'LOAD';
4447 
4448 
4449                /**********************************
4450                Commented out per bug#4030717
4451                This statement is replaced with an insert into the
4452                CAL_PERIOD INTERIM tables.
4453                FORALL i IN 1..v_final_mbr_last_row
4454                   EXECUTE IMMEDIATE x_insert_member_stmt
4455                   USING tf_cal_period_end_date(i)
4456                        ,tf_cal_period_number(i)
4457                        ,tf_calendar_id(i)
4458                        ,tf_dimension_group_id(i)
4459                        ,tf_member_name(i)
4460                        ,tf_member_desc(i);
4461                        ************************/
4462                ELSIF (p_value_set_required_flag = 'N'
4463                    AND p_hier_dimension_flag = 'Y') THEN
4464                   FORALL i IN 1..v_final_mbr_last_row
4465                      EXECUTE IMMEDIATE x_insert_member_stmt
4466                      USING tf_dimension_group_id(i)
4467                           ,tf_member_dc(i)
4468                           ,tf_member_name(i)
4469                           ,tf_member_desc(i)
4470                           ,gv_apps_user_id
4471                           ,gv_apps_user_id;
4472                ELSE
4473                   FORALL i IN 1..v_final_mbr_last_row
4474                      EXECUTE IMMEDIATE x_insert_member_stmt
4475                      USING tf_member_dc(i)
4476                           ,tf_member_name(i)
4477                           ,tf_member_desc(i)
4478                           ,gv_apps_user_id
4479                           ,gv_apps_user_id;
4480 
4481                END IF;  -- checking the p_dimenson_varchar_label
4482             END IF; -- Load_Type = Dimension Member
4483 
4484             ----------------------------------------------------------
4485             -- Count the member loaded and error rows
4486             ----------------------------------------------------------
4487             --x_rows_loaded   := x_rows_loaded + v_mbr_last_row;
4488             v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
4489             v_temp_rows_rejected := 0;
4490 
4491             ---------------------------------------------------------
4492             -- Insert attributes for the good dimension members
4493             ---------------------------------------------------------
4494             IF (p_value_set_required_flag = 'Y') THEN
4495                FORALL i IN 1..v_attr_final_count
4496                   EXECUTE IMMEDIATE x_insert_attr_stmt
4497                   USING tfa_attribute_id(i)
4498                        ,tfa_version_id(i)
4499                        ,tfa_dim_attr_numeric_member(i)
4500                        ,tfa_attr_assign_vs_id(i)
4501                        ,tfa_dim_attr_varchar_member(i)
4502                        ,tfa_number_assign_value(i)
4503                        ,tfa_varchar_assign_value(i)
4504                        ,tfa_date_assign_value(i)
4505                        ,gv_apps_user_id
4506                        ,gv_apps_user_id
4507                        ,tfa_member_dc(i)
4508                        ,tfa_value_set_dc(i)
4509                        ,tfa_status(i);
4510             ELSIF (p_value_set_required_flag = 'N') AND
4511                    (p_dimension_varchar_label NOT IN ('CAL_PERIOD')) THEN
4512                 FORALL i IN 1..v_attr_final_count
4513                   EXECUTE IMMEDIATE x_insert_attr_stmt
4514                   USING tfa_attribute_id(i)
4515                        ,tfa_version_id(i)
4516                        ,tfa_dim_attr_numeric_member(i)
4517                        ,tfa_attr_assign_vs_id(i)
4518                        ,tfa_dim_attr_varchar_member(i)
4519                        ,tfa_number_assign_value(i)
4520                        ,tfa_varchar_assign_value(i)
4521                        ,tfa_date_assign_value(i)
4522                        ,gv_apps_user_id
4523                        ,gv_apps_user_id
4524                        ,tfa_member_dc(i)
4525                        ,tfa_status(i);
4526             ELSIF p_dimension_varchar_label = 'CAL_PERIOD' THEN
4527                 FORALL i IN 1..v_attr_final_count
4528                   EXECUTE IMMEDIATE x_calp_attr_interim_stmt
4529                   USING tfa_member_dc(i)
4530                        ,tfa_attribute_id(i)
4531                        ,tfa_version_id(i)
4532                        ,tfa_dim_attr_numeric_member(i)
4533                        ,tfa_attr_assign_vs_id(i)
4534                        ,tfa_dim_attr_varchar_member(i)
4535                        ,tfa_number_assign_value(i)
4536                        ,tfa_varchar_assign_value(i)
4537                        ,tfa_date_assign_value(i)
4538                        ,'Y' -- use_interim_table_flag
4539                        ,'LOAD';
4540             END IF;
4541          ----------------------------------------------------------
4542          -- Count the attribute rows loaded
4543          ----------------------------------------------------------
4544          --x_rows_loaded := x_rows_loaded + v_attr_final_count;
4545 
4546 -----------------------------------------------------------------------------------------
4547 
4548          ----------------------------------------------------------
4549          -- Update Status of Member Collection for failed records
4550          ----------------------------------------------------------
4551          FORALL i IN 1..v_mbr_last_row
4552             EXECUTE IMMEDIATE x_update_mbr_status_stmt
4553             USING t_b_status(i)
4554                  ,t_rowid(i)
4555                  ,t_b_status(i);
4556          FEM_ENGINES_PKG.TECH_MESSAGE
4557          (c_log_level_1,c_block||'.'||c_proc_name||'.update member status.v_mbr_last_row'
4558          ,v_mbr_last_row);
4559 
4560          FORALL i IN 1..v_mbr_last_row
4561             EXECUTE IMMEDIATE x_update_tl_status_stmt
4562             USING t_tl_status(i)
4563                  ,t_tl_rowid(i)
4564                  ,t_tl_status(i);
4565 
4566          FEM_ENGINES_PKG.TECH_MESSAGE
4567          (c_log_level_1,c_block||'.'||c_proc_name||'.update tl status.v_mbr_last_row'
4568          ,v_mbr_last_row);
4569 
4570 
4571       /************************************
4572       Commenting out Array Date Overlap per bug#4030717
4573       --------------------------------------------------------------------
4574       -- Update Status of ATTR Final Collection for failed overlap records
4575       --------------------------------------------------------------------
4576       FORALL i IN 1..v_attr_final_count
4577          EXECUTE IMMEDIATE x_update_attr_status_stmt
4578          USING tfa_status(i)
4579               ,tfa_rowid(i)
4580               ,tfa_status(i);
4581       **********************************************************************/
4582 
4583          ----------------------------------------------------------
4584          -- Update Status of dependent ATTR records for bad members
4585          ----------------------------------------------------------
4586          IF (p_load_type NOT IN ('DIMENSION_GROUP') AND p_simple_dimension_flag = 'N') THEN
4587 
4588 /* 9/14/2004  RCF Commenting this out because this update is already handled
4589               in the attr_update step for bad_versions and bad_members
4590 
4591          IF (p_value_set_required_flag = 'Y') THEN
4592             FORALL i IN 1..v_mbr_last_row
4593                EXECUTE IMMEDIATE x_update_dep_attr_status_stmt
4594                USING t_member_dc(i)
4595                     ,t_value_set_dc(i)
4596                     ,t_b_status(i);
4597 
4598          ELSIF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
4599 
4600             FORALL i IN 1..v_mbr_last_row
4601                EXECUTE IMMEDIATE x_update_dep_attr_status_stmt
4602                USING t_calendar_dc(i)
4603                     ,t_dimension_group_dc(i)
4604                     ,t_cal_period_end_date(i)
4605                     ,t_cal_period_number(i)
4606                     ,t_b_status(i);
4607          END IF;  */
4608 
4609          ----------------------------------------------------------------
4610          -- Delete Loaded records and clear Collections for Next Bulk Fetch
4611          ----------------------------------------------------------------
4612             ---------------------------------------------------------
4613             -- Delete Loaded attribute records from the _ATTR_T table
4614             -- exception:  CAL_PERIOD loads
4615             -- Interface rows for CAL_PERIOD loads not deleted at this time since we
4616             -- have not yet completed the date overlap checks in the Interim table
4617             ---------------------------------------------------------
4618             IF p_dimension_varchar_label NOT IN ('CAL_PERIOD') THEN
4619                FORALL i IN 1..v_attr_final_count
4620                   EXECUTE IMMEDIATE x_delete_attr_stmt
4621                   USING tfa_rowid(i)
4622                        ,tfa_status(i)
4623                        ,'N'; -- use_interim_table_flag
4624             END IF;
4625 
4626             --------------------------------------------
4627             -- Delete ATTR Collection for Next Bulk Fetch
4628             --------------------------------------------
4629             tfa_rowid.DELETE;
4630             tfa_attribute_id.DELETE;
4631             tfa_attribute_varchar_label.DELETE;
4632             tfa_member_dc.DELETE;
4633             tfa_value_set_dc.DELETE;
4634             tfa_dim_attr_numeric_member.DELETE;
4635             tfa_dim_attr_varchar_member.DELETE;
4636             tfa_number_assign_value.DELETE;
4637             tfa_varchar_assign_value.DELETE;
4638             tfa_date_assign_value.DELETE;
4639             tfa_version_id.DELETE;
4640             tfa_attr_assign_vs_id.DELETE;
4641             tfa_status.DELETE;
4642          END IF; -- load_type not Dimension Group and Simple dimension_flag='N'
4643 
4644          ---------------------------------------------------------
4645          -- Delete Loaded member records from the _B_T and _TL_T tables
4646          -- exception:  CAL_PERIOD Member loads
4647          -- Interface rows for CAL_PERIOD loads not deleted at this time since we
4648          -- have not yet completed the date overlap checks in the Interim table
4649          ---------------------------------------------------------
4650          IF p_dimension_varchar_label NOT IN ('CAL_PERIOD') AND
4651             p_load_type NOT IN ('DIMENSION_GROUP') THEN
4652             FORALL i IN 1..v_mbr_final_count
4653                EXECUTE IMMEDIATE x_delete_mbr_stmt
4654                USING tf_rowid(i)
4655                     ,tf_status(i)
4656                     ,'N'; -- use_interim_table_flag
4657 
4658             FORALL i IN 1..v_mbr_final_count
4659                EXECUTE IMMEDIATE x_delete_tl_stmt
4660                USING tf_tl_rowid(i)
4661                     ,tf_status(i)
4662                     ,'N'; -- use_interim_table_flag
4663          END IF;
4664 
4665 
4666          tf_rowid.DELETE;
4667          tf_tl_rowid.DELETE;
4668          tf_member_dc.DELETE;
4669          tf_calendar_id.DELETE;
4670          tf_cal_period_end_date.DELETE;
4671          tf_cal_period_number.DELETE;
4672          tf_value_set_id.DELETE;
4673          tf_dimension_group_id.DELETE;
4674          tf_member_name.DELETE;
4675          tf_member_desc.DELETE;
4676          tf_language.DELETE;
4677          tf_status.DELETE;
4678          tf_dimension_group_seq.DELETE;
4679          tf_time_group_type_code.DELETE;
4680          tf_time_dimension_group_key.DELETE;
4681          tf_calendar_dc.DELETE;
4682          tf_dimension_group_dc.DELETE;
4683          tf_cal_period_start_date.DELETE;
4684          tf_adj_period_flag.DELETE;
4685 
4686          t_rowid.DELETE;
4687          t_tl_rowid.DELETE;
4688          t_member_dc.DELETE;
4689          t_calendar_dc.DELETE;
4690          t_calendar_id.DELETE;
4691          t_cal_period_end_date.DELETE;
4692          t_cal_period_start_date.DELETE;
4693          t_cal_period_number.DELETE;
4694          t_value_set_dc.DELETE;
4695          t_value_set_id.DELETE;
4696          t_dimension_group_dc.DELETE;
4697          t_dimension_group_id.DELETE;
4698          t_b_status.DELETE;
4699          t_member_name.DELETE;
4700          t_member_desc.DELETE;
4701          t_language.DELETE;
4702          t_tl_status.DELETE;
4703          t_dimension_group_seq.DELETE;
4704          t_time_group_type_code.DELETE;
4705    --      t_periods_in_year.DELETE;
4706          t_adj_period_flag.DELETE;
4707 
4708          v_attr_final_count := 0;
4709          v_attr_count       := 0;
4710          v_mbr_last_row     := 0;
4711          v_mbr_count        := 0;
4712          v_mbr_final_count  := 0;
4713 
4714 
4715                    COMMIT;
4716       END LOOP;  -- New Members
4717 
4718    IF p_load_type <> ('DIMENSION_GROUP') THEN
4719       FEM_Multi_Proc_Pkg.Post_Data_Slice(
4720         p_req_id => p_master_request_id,
4721         p_slc_id => v_slc_id,
4722         p_status => v_mp_status,
4723         p_message => v_mp_message,
4724         p_rows_processed => 0,
4725         p_rows_loaded => v_rows_loaded,
4726         p_rows_rejected => v_rows_rejected);
4727     END IF;
4728 
4729    END LOOP; -- get data slice
4730 
4731    IF p_load_type = ('DIMENSION_GROUP') THEN
4732       gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected;
4733    END IF;
4734 
4735    IF cv_get_rows%ISOPEN THEN CLOSE cv_get_rows;
4736    END IF;
4737    --x_rows_rejected := v_rows_rejected;
4738    --x_rows_loaded := v_rows_loaded;
4739 
4740    FEM_ENGINES_PKG.TECH_MESSAGE
4741     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
4742 
4743    EXCEPTION
4744       WHEN OTHERS THEN
4745          IF cv_get_rows%ISOPEN THEN
4746             CLOSE cv_get_rows;
4747          END IF;
4748          IF cv_get_attr_rows%ISOPEN THEN
4749             CLOSE cv_get_attr_rows;
4750          END IF;
4751 
4752          --x_status:= 2;
4753          --x_message := 'COMPLETE:ERROR';
4754 
4755          gv_prg_msg := sqlerrm;
4756          gv_callstack := dbms_utility.format_call_stack;
4757 
4758          FEM_ENGINES_PKG.TECH_MESSAGE
4759           (p_severity => c_log_level_6
4760           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
4761           ,p_msg_text => gv_prg_msg);
4762 
4763          FEM_ENGINES_PKG.TECH_MESSAGE
4764           (p_severity => c_log_level_6
4765           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
4766           ,p_msg_text => gv_callstack);
4767 
4768          FEM_ENGINES_PKG.USER_MESSAGE
4769           (p_app_name => c_fem
4770           ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
4771           ,P_TOKEN1 => 'ERR_MSG'
4772           ,P_VALUE1 => gv_prg_msg);
4773 
4774         -- FEM_ENGINES_PKG.USER_MESSAGE
4775          -- (p_app_name => c_fem
4776          -- ,p_msg_text => gv_prg_msg);
4777 
4778          RAISE e_main_terminate;
4779 
4780 END New_Members;
4781 
4782 /*===========================================================================+
4783  | PROCEDURE
4784  |              TL_Update
4785  |
4786  | DESCRIPTION
4787  |   This step updates the translatable names and descriptions for existing
4788  |   Dimension members.
4789  |
4790  | SCOPE - PRIVATE
4791  |
4792  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
4793  |
4794  | ARGUMENTS  : IN:
4795  |
4796  |
4797  |              OUT:
4798  |
4799  |              IN/ OUT:
4800  |
4801  | RETURNS    : NONE
4802  |
4803  | NOTES
4804  |
4805  |
4806  |   1.	Other language rows in FEM are updated for the member if they exist.
4807  |   2.	Delete any TL rows that are successfully updated.
4808  |
4809  |   Update Base (Dimension Group and Simple Dim = 'N' only)
4810  |   Note:  This module only performs error checks.  It does not perform any updates.
4811  |          Therefore, the Base status will remain unchanged, unless
4812  |          there is something invalid about one of the values in a base columns, in which
4813  |          case the Base Update module identifies the error and updates the status
4814  |   1.	Base columns for the member or Group are updated for any base records in
4815  |      the _B_T table.  This update only occurs if the member exists in FEM.
4816  |   2.	Delete any _B_T records that are successful.
4817  |
4818  | MODIFICATION HISTORY
4819  |    Rob Flippo   8-MAR-04  Created
4820  |    Rob Flippo  10-MAR-06  Bug#5068022 add error checking to identify
4821  |                           translatable names in the TL_T table that
4822  |                           already exist in the target TL table for
4823  |                           other members
4824  |    Rob Flippo 04-APR-06  Bug#5117594 Remove unique name check for Customer
4825  |                          dimension
4826  |  Rob Flippo  04-AUG-06  Bug 5060746 Change literals to bind variables wherever possible
4827  |  Rob Flippo 15-MAR-07  Bug#5905501 Modify execute immediate on tl_update
4828  |                        to pass in the source_lang = language
4829  +===========================================================================*/
4830 
4831 PROCEDURE TL_Update (p_eng_sql IN VARCHAR2
4832                     ,p_data_slc IN VARCHAR2
4833                     ,p_proc_num IN VARCHAR2
4834                     ,p_partition_code IN NUMBER
4835                     ,p_fetch_limit IN NUMBER
4836                     ,p_load_type IN VARCHAR2
4837                     ,p_dimension_varchar_label IN VARCHAR2
4838                     ,p_dimension_id IN VARCHAR2
4839                     ,p_target_b_table IN VARCHAR2
4840                     ,p_target_tl_table IN VARCHAR2
4841                     ,p_source_b_table IN VARCHAR2
4842                     ,p_source_tl_table IN VARCHAR2
4843                     ,p_member_col IN VARCHAR2
4844                     ,p_member_dc_col IN VARCHAR2
4845                     ,p_member_name_col IN VARCHAR2
4846                     ,p_member_t_dc_col IN VARCHAR2
4847                     ,p_member_t_name_col IN VARCHAR2
4848                     ,p_member_description_col IN VARCHAR2
4849                     ,p_value_set_required_flag IN VARCHAR2
4850                     ,p_simple_dimension_flag IN VARCHAR2
4851                     ,p_shared_dimension_flag IN VARCHAR2
4852                     ,p_hier_dimension_flag IN VARCHAR2
4853                     ,p_exec_mode_clause IN VARCHAR2
4854                     ,p_master_request_id IN NUMBER)
4855 
4856 IS
4857 -- Constants
4858    c_proc_name VARCHAR2(30) := 'TL_Update';
4859 
4860 -- Dynamic SQL statement variables
4861    x_bad_tl_select_stmt              VARCHAR2(4000);
4862    x_select_stmt                     VARCHAR2(4000);
4863    x_update_stmt                     VARCHAR2(4000);
4864    x_update_tl_stmt                  VARCHAR2(4000);
4865    x_update_tl_status_stmt           VARCHAR2(4000);
4866    x_delete_tl_stmt                  VARCHAR2(4000);
4867    x_bad_lang_upd_stmt               VARCHAR2(4000);
4868    x_ro_mbr_upd_stmt                 VARCHAR2(4000);
4869    x_dupname_count_stmt              VARCHAR2(4000);
4870 
4871 -- Count variables for manipulating the member and attribute arrays
4872    v_mbr_last_row                    NUMBER;
4873    v_temp_rows_rejected              NUMBER :=0;
4874    v_rows_rejected                   NUMBER :=0;
4875    v_rows_fetched                    NUMBER :=0;
4876    v_bulk_rows_rejected              NUMBER; -- rejected row count for any status bulk
4877                                              -- update statements
4878 
4879 
4880 -- Other variables
4881    v_fetch_limit                     NUMBER;
4882    v_dupname_count                   NUMBER :=0;
4883 
4884 -- MP variables
4885    v_loop_counter                    NUMBER;
4886    v_slc_id                          NUMBER;
4887    v_slc_val                         VARCHAR2(100);
4888    v_slc_val2                        VARCHAR2(100);
4889    v_slc_val3                        VARCHAR2(100);
4890    v_slc_val4                        VARCHAR2(100);
4891    v_mp_status                       VARCHAR2(30);
4892    v_mp_message                      VARCHAR2(4000);
4893    v_num_vals                        NUMBER;
4894    v_part_name                       VARCHAR2(4000);
4895 
4896 -------------------------------------
4897 -- Declare bulk collection columns --
4898 -------------------------------------
4899 
4900 -- Common abbreviations:
4901 --    t_ = array of raw interface table member rows
4902 --    tf = "final" array of interface table member rows that have been validated for insert
4903 --    ta = array of raw interface table attribute rows
4904 --    tfa = "final" array of interface table attribute rows that have been validated for insert
4905 
4906    t_rowid                           rowid_type;
4907    t_tl_rowid                        rowid_type;
4908    t_value_set_id                    number_type;
4909    t_dimension_group_id              number_type;
4910    t_calendar_id                     number_type;
4911    t_cal_period_number               number_type;
4912    t_cal_period_end_date             date_type;
4913    t_b_status                        varchar2_std_type;
4914    t_tl_status                       varchar2_std_type;
4915    t_member_dc                       varchar2_150_type;
4916    t_calendar_dc                     varchar2_150_type;
4917    t_value_set_dc                    varchar2_150_type;
4918    t_dimension_group_dc              varchar2_150_type;
4919    t_member_name                     varchar2_150_type;
4920    t_member_desc                     desc_type;
4921    t_language                        lang_type;
4922    t_dimension_group_seq             number_type;
4923    t_time_group_type_code            varchar2_std_type;
4924 
4925 ---------------------
4926 -- Declare cursors --
4927 ---------------------
4928    cv_get_rows           cv_curs;
4929 
4930 BEGIN
4931    FEM_ENGINES_PKG.TECH_MESSAGE
4932     (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
4933 
4934    --x_status := 0; -- initialize status of the TL_Update procedure
4935    --x_message := 'COMPLETE:NORMAL';
4936 
4937    -- Build Update for the _TL_T table where the LANGUAGE is not installed
4938    build_bad_lang_upd_stmt  (p_load_type
4939                             ,p_dimension_varchar_label
4940                             ,p_dimension_id
4941                             ,p_source_tl_table
4942                             ,p_exec_mode_clause
4943                             ,p_shared_dimension_flag
4944                             ,p_value_set_required_flag
4945                             ,x_bad_lang_upd_stmt);
4946    IF p_data_slc IS NOT NULL THEN
4947       x_bad_lang_upd_stmt := REPLACE(x_bad_lang_upd_stmt,'{{data_slice}}',p_data_slc);
4948    ELSE
4949       x_bad_lang_upd_stmt := REPLACE(x_bad_lang_upd_stmt,'{{data_slice}}','1=1');
4950    END IF;
4951 
4952    -- Build Update for the _TL_T table where
4953    -- the member is a read_only_member
4954    build_tl_ro_mbr_upd_stmt  (p_load_type
4955                             ,p_dimension_varchar_label
4956                             ,p_dimension_id
4957                             ,p_source_tl_table
4958                             ,p_target_b_table
4959                             ,p_member_dc_col
4960                             ,p_member_t_dc_col
4961                             ,p_exec_mode_clause
4962                             ,p_shared_dimension_flag
4963                             ,p_value_set_required_flag
4964                             ,x_ro_mbr_upd_stmt);
4965 
4966    IF p_data_slc IS NOT NULL THEN
4967       x_ro_mbr_upd_stmt := REPLACE(x_ro_mbr_upd_stmt,'{{data_slice}}',p_data_slc);
4968    ELSE
4969       x_ro_mbr_upd_stmt := REPLACE(x_ro_mbr_upd_stmt,'{{data_slice}}','1=1');
4970    END IF;
4971 
4972    FEM_ENGINES_PKG.TECH_MESSAGE
4973    (c_log_level_1,c_block||'.'||c_proc_name||'.ro_mbr_upd stmt'
4974    ,x_ro_mbr_upd_stmt);
4975 
4976 
4977    ------------------------------------------------------------------------------
4978    -- Build the select stmt for exising Dimension members using the information
4979    -- returned from get_dimension_info
4980    ------------------------------------------------------------------------------
4981    build_mbr_select_stmt  (p_load_type
4982                           ,p_dimension_varchar_label
4983                           ,p_dimension_id
4984                           ,p_target_b_table
4985                           ,p_target_tl_table
4986                           ,p_source_b_table
4987                           ,p_source_tl_table
4988                           ,p_member_dc_col
4989                           ,p_member_t_dc_col
4990                           ,p_member_t_name_col
4991                           ,p_member_description_col
4992                           ,p_value_set_required_flag
4993                           ,p_shared_dimension_flag
4994                           ,p_hier_dimension_flag
4995                           ,'Y'
4996                           ,p_exec_mode_clause
4997                           ,x_select_stmt);
4998 
4999    build_bad_tl_select_stmt  (p_load_type
5000                           ,p_dimension_varchar_label
5001                           ,p_dimension_id
5002                           ,p_target_b_table
5003                           ,p_target_tl_table
5004                           ,p_source_b_table
5005                           ,p_source_tl_table
5006                           ,p_member_dc_col
5007                           ,p_member_t_dc_col
5008                           ,p_value_set_required_flag
5009                           ,p_shared_dimension_flag
5010                           ,p_hier_dimension_flag
5011                           ,p_exec_mode_clause
5012                           ,x_bad_tl_select_stmt);
5013 
5014    IF p_data_slc IS NOT NULL THEN
5015       x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}',p_data_slc);
5016       x_bad_tl_select_stmt := REPLACE(x_bad_tl_select_stmt,'{{data_slice}}',p_data_slc);
5017    ELSE
5018       x_select_stmt := REPLACE(x_select_stmt,'{{data_slice}}','1=1');
5019       x_bad_tl_select_stmt := REPLACE(x_bad_tl_select_stmt,'{{data_slice}}','1=1');
5020    END IF;
5021 
5022    -- set the local fetch limit variable based on the parameter
5023    -- this will be null for Dimension Group loads
5024    v_fetch_limit := p_fetch_limit;
5025    IF v_fetch_limit IS NULL THEN
5026       v_fetch_limit := 10000;
5027    END IF;
5028 
5029 
5030    FEM_ENGINES_PKG.TECH_MESSAGE
5031    (c_log_level_1,c_block||'.'||c_proc_name||'.member select stmt'
5032    ,x_select_stmt);
5033 
5034    FEM_ENGINES_PKG.TECH_MESSAGE
5035    (c_log_level_1,c_block||'.'||c_proc_name||'.bad_tl_select_stmt'
5036    ,x_bad_tl_select_stmt);
5037 
5038 
5039    build_tl_update_stmt (p_dimension_varchar_label
5040                         ,p_dimension_id
5041                         ,p_load_type
5042                         ,p_target_b_table
5043                         ,p_target_tl_table
5044                         ,p_member_col
5045                         ,p_member_dc_col
5046                         ,p_member_name_col
5047                         ,p_member_description_col
5048                         ,p_value_set_required_flag
5049                         ,x_update_tl_stmt);
5050 
5051    FEM_ENGINES_PKG.TECH_MESSAGE
5052    (c_log_level_1,c_block||'.'||c_proc_name||'.tl table update stmt'
5053    ,x_update_tl_stmt);
5054 
5055    build_delete_stmt (p_source_tl_table
5056                      ,x_delete_tl_stmt);
5057 
5058 
5059    FEM_ENGINES_PKG.TECH_MESSAGE
5060    (c_log_level_1,c_block||'.'||c_proc_name||'.delete stmt'
5061    ,x_delete_tl_stmt);
5062 
5063    build_status_update_stmt (p_source_tl_table
5064                             ,x_update_tl_status_stmt);
5065 
5066    build_tl_dupname_stmt (p_dimension_varchar_label
5067                          ,p_dimension_id
5068                          ,p_load_type
5069                          ,p_target_b_table
5070                          ,p_target_tl_table
5071                          ,p_member_col
5072                          ,p_member_dc_col
5073                          ,p_member_name_col
5074                          ,p_value_set_required_flag
5075                          ,'TL_UPDATE'
5076                          ,x_dupname_count_stmt);
5077 
5078      FEM_ENGINES_PKG.TECH_MESSAGE
5079      (c_log_level_1,c_block||'.'||c_proc_name||'.dupname select stmt'
5080      ,x_dupname_count_stmt);
5081 
5082 
5083 
5084 
5085    v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
5086                         -- the data slice loop
5087 
5088    -- Begin the Data Slice Loop
5089    LOOP
5090 
5091       IF p_load_type <> ('DIMENSION_GROUP') THEN
5092 
5093       FEM_Multi_Proc_Pkg.Get_Data_Slice(
5094         x_slc_id => v_slc_id,
5095         x_slc_val1 => v_slc_val,
5096         x_slc_val2 => v_slc_val2,
5097         x_slc_val3 => v_slc_val3,
5098         x_slc_val4 => v_slc_val4,
5099         x_num_vals  => v_num_vals,
5100         x_part_name => v_part_name,
5101         p_req_id => p_master_request_id,
5102         p_proc_num => p_proc_num);
5103 
5104       FEM_ENGINES_PKG.TECH_MESSAGE
5105        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
5106        ,v_slc_val);
5107       FEM_ENGINES_PKG.TECH_MESSAGE
5108        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
5109        ,v_slc_val2);
5110       FEM_ENGINES_PKG.TECH_MESSAGE
5111        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
5112        ,v_slc_val3);
5113       FEM_ENGINES_PKG.TECH_MESSAGE
5114        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
5115        ,v_slc_val4);
5116 
5117 
5118       EXIT WHEN (v_slc_id IS NULL);
5119       ELSE
5120          EXIT WHEN (v_loop_counter > 0);
5121          v_loop_counter := v_loop_counter + 1;
5122       END IF;
5123 
5124 
5125    --------------------------------------------------------------------------
5126    -- Execute the Updates
5127    IF p_load_type <> ('DIMENSION_GROUP') THEN
5128       EXECUTE IMMEDIATE x_bad_lang_upd_stmt USING v_slc_val, v_slc_val2;
5129    ELSE
5130       EXECUTE IMMEDIATE x_bad_lang_upd_stmt;
5131    END IF;
5132    v_bulk_rows_rejected := SQL%ROWCOUNT;
5133 
5134    COMMIT;
5135    --------------------------------------------------------------------------
5136 
5137    IF p_load_type <> ('DIMENSION_GROUP') THEN
5138       EXECUTE IMMEDIATE x_ro_mbr_upd_stmt USING v_slc_val, v_slc_val2;
5139    ELSE
5140       EXECUTE IMMEDIATE x_ro_mbr_upd_stmt;
5141    END IF;
5142    v_bulk_rows_rejected := v_bulk_rows_rejected + SQL%ROWCOUNT;
5143 
5144    COMMIT;
5145    --------------------------------------------------------------------------
5146 
5147 
5148    ------------------------------------------------------------------------------
5149    -- Loop through the members that already exist
5150    -- to perform updates on name/description columns
5151    ------------------------------------------------------------------------------
5152       IF p_load_type <> ('DIMENSION_GROUP') THEN
5153          OPEN cv_get_rows FOR x_select_stmt USING v_slc_val, v_slc_val2;
5154       ELSE
5155          OPEN cv_get_rows FOR x_select_stmt;
5156       END IF;
5157 
5158       LOOP
5159          -------------------------------------------
5160          -- Bulk Collect Rows from the source _T tables
5161          -- Using Dynamic SELECT Statement
5162          -------------------------------------------
5163          FETCH cv_get_rows BULK COLLECT INTO
5164                 t_rowid
5165                ,t_tl_rowid
5166                ,t_member_dc
5167                ,t_calendar_dc
5168                ,t_calendar_id
5169                ,t_cal_period_end_date
5170                ,t_cal_period_number
5171                ,t_value_set_dc
5172                ,t_value_set_id
5173                ,t_dimension_group_dc
5174                ,t_dimension_group_id
5175                ,t_b_status
5176                ,t_member_name
5177                ,t_member_desc
5178                ,t_language
5179                ,t_tl_status
5180                ,t_dimension_group_seq
5181                ,t_time_group_type_code
5182          LIMIT v_fetch_limit;
5183 
5184          ----------------------------------------------
5185          -- EXIT Fetch LOOP If No Rows are Retrieved --
5186          ----------------------------------------------
5187          v_mbr_last_row := t_member_dc.LAST;
5188 
5189          IF (v_mbr_last_row IS NULL)
5190          THEN
5191             EXIT;
5192          END IF;
5193 
5194          FEM_ENGINES_PKG.TECH_MESSAGE
5195           (c_log_level_1,c_block||'.'||c_proc_name||'.Rows retrieved this fetch',v_mbr_last_row);
5196 
5197          --v_rows_fetched := v_rows_fetched + v_mbr_last_row;
5198 
5199          FOR i IN 1..v_mbr_last_row
5200          LOOP
5201 
5202             ----------------------------------------------
5203             --  Begin Duplicate Name Validations (only if dim <> 'CUSTOMER')
5204             --  Check to see if the translatabe name that will be load
5205             --  already exists for ANY language in the target TL table
5206             --  Set STATUS = 'DUPLICATE_NAME' if the name already exists
5207             ----------------------------------------------
5208             IF p_dimension_varchar_label <> 'CUSTOMER' THEN
5209                IF p_dimension_varchar_label = 'CAL_PERIOD' AND
5210                   p_load_type <> 'DIMENSION_GROUP' THEN
5211 
5212                   EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
5213                      USING t_member_name(i)
5214                           ,t_member_dc(i)
5215                           ,t_language(i)
5216                           ,t_dimension_group_id(i)
5217                           ,t_calendar_id(i);
5218 
5219                ELSE
5220                   IF p_value_set_required_flag = 'Y' THEN
5221                      EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
5222                         USING t_member_name(i)
5223                              ,t_member_dc(i)
5224                              ,t_language(i)
5225                              ,t_value_set_dc(i);
5226                   ELSE
5227                      EXECUTE IMMEDIATE x_dupname_count_stmt INTO v_dupname_count
5228                         USING t_member_name(i)
5229                              ,t_member_dc(i)
5230                              ,t_language(i);
5231                   END IF;
5232                END IF;
5233                IF v_dupname_count > 0 THEN
5234                   t_tl_status(i) := 'DUPLICATE_NAME';
5235                   ----------------------------------------------------------
5236                   -- Count the error rows
5237                   ----------------------------------------------------------
5238                   v_rows_rejected := v_rows_rejected + 1;
5239 
5240                END IF;
5241             END IF; -- p_dim_label <> 'CUSTOMER'
5242 
5243          END LOOP;
5244 
5245          --------------------------------------------------------------------------------------
5246          -- Perform the update on the TL table
5247          --------------------------------------------------------------------------------------
5248          IF (p_value_set_required_flag = 'Y') THEN
5249             FORALL i IN 1..v_mbr_last_row
5250                EXECUTE IMMEDIATE x_update_tl_stmt
5251                USING t_member_name(i)
5252                  ,t_member_desc(i)
5253                  ,t_language(i)
5254                  ,gv_apps_user_id
5255                  ,gv_login_id
5256                  ,t_member_dc(i)
5257                  ,t_value_set_dc(i)
5258                  ,t_value_set_dc(i)
5259                  ,t_language(i)
5260                  ,t_tl_status(i);
5261 
5262          ELSE
5263             FORALL i IN 1..v_mbr_last_row
5264                EXECUTE IMMEDIATE x_update_tl_stmt
5265                USING t_member_name(i)
5266                     ,t_member_desc(i)
5267                     ,t_language(i)
5268                     ,gv_apps_user_id
5269                     ,gv_login_id
5270                     ,t_member_dc(i)
5271                     ,t_language(i)
5272                     ,t_tl_status(i);
5273          END IF;
5274 
5275          ---------------------------------------------------------
5276          -- Delete Loaded member records from the _TL_T table
5277          ---------------------------------------------------------
5278          FEM_ENGINES_PKG.TECH_MESSAGE
5279           (c_log_level_1,c_block||'.'||c_proc_name||'.Deleting TL_T rows','start');
5280          FORALL i IN 1..v_mbr_last_row
5281             EXECUTE IMMEDIATE x_delete_tl_stmt
5282             USING t_tl_rowid(i)
5283                  ,t_tl_status(i)
5284                  ,'N';
5285 
5286          ----------------------------------------------------------
5287          -- Update Status of Error TL records
5288          ----------------------------------------------------------
5289          FORALL i IN 1..v_mbr_last_row
5290             EXECUTE IMMEDIATE x_update_tl_status_stmt
5291             USING t_tl_status(i)
5292                  ,t_tl_rowid(i)
5293                  ,t_tl_status(i);
5294 
5295             COMMIT;
5296 
5297 
5298          --------------------------------------------
5299          -- Delete Collections for Next Bulk Fetch --
5300          --------------------------------------------
5301          t_rowid.DELETE;
5302          t_tl_rowid.DELETE;
5303          t_member_dc.DELETE;
5304          t_calendar_dc.DELETE;
5305          t_calendar_id.DELETE;
5306          t_cal_period_end_date.DELETE;
5307          t_cal_period_number.DELETE;
5308          t_value_set_dc.DELETE;
5309          t_value_set_id.DELETE;
5310          t_dimension_group_dc.DELETE;
5311          t_dimension_group_id.DELETE;
5312          t_b_status.DELETE;
5313          t_member_name.DELETE;
5314          t_member_desc.DELETE;
5315          t_language.DELETE;
5316          t_tl_status.DELETE;
5317          t_dimension_group_seq.DELETE;
5318          t_time_group_type_code.DELETE;
5319 
5320       COMMIT;
5321       END LOOP;  -- Existing Members
5322       IF cv_get_rows%ISOPEN THEN
5323          CLOSE cv_get_rows;
5324       END IF;
5325 
5326       ---------------------------------------------------------------
5327       -- Identify records in TL_T table that do not exist in FEM
5328       -- and also do not have a "new" base record in the _B_T table
5329       ---------------------------------------------------------------
5330       IF p_load_type <> ('DIMENSION_GROUP') THEN
5331          OPEN cv_get_rows FOR x_bad_tl_select_stmt USING v_slc_val, v_slc_val2;
5332       ELSE
5333          OPEN cv_get_rows FOR x_bad_tl_select_stmt;
5334       END IF;
5335 
5336       LOOP
5337          -------------------------------------------
5338          -- Bulk Collect Rows from the source TL_T table
5339          -- Using Dynamic SELECT Statement
5340          -------------------------------------------
5341          FETCH cv_get_rows BULK COLLECT INTO
5342                 t_rowid
5343                ,t_member_dc
5344                ,t_calendar_dc
5345                ,t_calendar_id
5346                ,t_cal_period_end_date
5347                ,t_cal_period_number
5348                ,t_value_set_dc
5349                ,t_b_status
5350          LIMIT v_fetch_limit;
5351 
5352          ----------------------------------------------
5353          -- EXIT Fetch LOOP If No Rows are Retrieved --
5354          ----------------------------------------------
5355          v_mbr_last_row := t_member_dc.LAST;
5356 
5357          IF (v_mbr_last_row IS NULL)
5358          THEN
5359             EXIT;
5360          END IF;
5361 
5362          FEM_ENGINES_PKG.TECH_MESSAGE
5363           (c_log_level_1,c_block||'.'||c_proc_name||'.Rows retrieved this fetch',v_mbr_last_row);
5364 
5365          ----------------------------------------------------------
5366          -- Update Status of Bad TL Collection
5367          ----------------------------------------------------------
5368          FORALL i IN 1..v_mbr_last_row
5369             EXECUTE IMMEDIATE x_update_tl_status_stmt
5370             USING t_b_status(i)
5371                  ,t_rowid(i)
5372                  ,t_b_status(i);
5373 
5374             COMMIT;
5375 
5376          ----------------------------------------------------------
5377          -- Count the error rows
5378          ----------------------------------------------------------
5379          v_rows_rejected := v_rows_rejected + v_mbr_last_row;
5380 
5381          --------------------------------------------
5382          -- Delete Collections for Next Bulk Fetch --
5383          --------------------------------------------
5384          t_rowid.DELETE;
5385          t_tl_rowid.DELETE;
5386          t_member_dc.DELETE;
5387          t_calendar_dc.DELETE;
5388          t_calendar_id.DELETE;
5389          t_cal_period_end_date.DELETE;
5390          t_cal_period_number.DELETE;
5391          t_value_set_dc.DELETE;
5392          t_value_set_id.DELETE;
5393          t_dimension_group_dc.DELETE;
5394          t_dimension_group_id.DELETE;
5395          t_b_status.DELETE;
5396          t_member_name.DELETE;
5397          t_member_desc.DELETE;
5398          t_language.DELETE;
5399          t_tl_status.DELETE;
5400          t_dimension_group_seq.DELETE;
5401          t_time_group_type_code.DELETE;
5402 
5403          COMMIT;
5404       END LOOP;  -- Bad TL members
5405 
5406    IF p_load_type <> ('DIMENSION_GROUP') THEN
5407       FEM_Multi_Proc_Pkg.Post_Data_Slice(
5408         p_req_id => p_master_request_id,
5409         p_slc_id => v_slc_id,
5410         p_status => v_mp_status,
5411         p_message => v_mp_message,
5412         p_rows_processed => 0,
5413         p_rows_loaded => 0,
5414         p_rows_rejected => v_rows_rejected+v_bulk_rows_rejected);
5415    END IF;
5416 
5417    END LOOP; -- get_data_slice
5418 
5419    IF p_load_type = ('DIMENSION_GROUP') THEN
5420       gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected + v_bulk_rows_rejected;
5421    END IF;
5422 
5423    IF cv_get_rows%ISOPEN THEN
5424       CLOSE cv_get_rows;
5425    END IF;
5426 
5427    --x_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
5428 
5429    FEM_ENGINES_PKG.TECH_MESSAGE
5430     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
5431 
5432    EXCEPTION
5433       WHEN OTHERS THEN
5434          IF cv_get_rows%ISOPEN THEN
5435             CLOSE cv_get_rows;
5436          END IF;
5437 
5438          --x_status:= 2;
5439          --x_message := 'COMPLETE:ERROR';
5440 
5441          gv_prg_msg := sqlerrm;
5442          gv_callstack := dbms_utility.format_call_stack;
5443 
5444          FEM_ENGINES_PKG.TECH_MESSAGE
5445           (p_severity => c_log_level_6
5446           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5447           ,p_msg_text => gv_prg_msg);
5448 
5449          FEM_ENGINES_PKG.TECH_MESSAGE
5450           (p_severity => c_log_level_6
5451           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5452           ,p_msg_text => gv_callstack);
5453 
5454          FEM_ENGINES_PKG.USER_MESSAGE
5455           (p_app_name => c_fem
5456           ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
5457           ,P_TOKEN1 => 'ERR_MSG'
5458           ,P_VALUE1 => gv_prg_msg);
5459 
5460        --  FEM_ENGINES_PKG.USER_MESSAGE
5461        --   (p_app_name => c_fem
5462        --   ,p_msg_text => gv_prg_msg);
5463 
5464          RAISE e_main_terminate;
5465 END TL_Update;
5466 
5467 /*===========================================================================+
5468  | PROCEDURE
5469  |              Base_Update
5470  |
5471  | DESCRIPTION
5472  |  These are all of the records in the _B_T table that are existing
5473  |  dimension members in FEM.  For these we will update any
5474  |  "Base" table columns.
5475  |   Note:  Inserts of new attribute assignments for existing members, as well
5476  |   as updates of existing attribute assignments, are handled in the Update_Attr module
5477  |
5478  | SCOPE - PRIVATE
5479  |
5480  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
5481  |
5482  | ARGUMENTS  : IN:
5483  |
5484  |
5485  |              OUT:
5486  |
5487  |              IN/ OUT:
5488  |
5489  | RETURNS    : NONE
5490  |
5491  | NOTES
5492  |   This procedure does not perform any updates of the FEM tables at the moment
5493  |   since the rules for updating the Dimension Group are unclear
5494  |
5495  | MODIFICATION HISTORY
5496  |    Rob Flippo   8-MAR-04  Created
5497  |    Rob Flippo   28-SEP-04  Bug#3906218 Ability undelete members
5498  |    Rob Flippo   03-MAR-05  Modify so that for dim grp load we don't get a
5499  |                            unique dimgrp seq error unless the conflict is
5500  |                            caused by a dimension group other than the one
5501  |                            that is being loaded.
5502  |    Rob Flippo   16-MAR-05  Bug#4244082 Modify to update dimgrp as long as
5503  |                            member does not participate in a sequence enforced
5504  |                            hier
5505  |                            -- note - if the dimgrp doesn't change, the loader
5506  |                               won't mark the _b_t record as an error (for seq
5507  |                               enf hier situation)
5508  |    Rob Flippo   22-MAR-05  Add p_dimension_id as parm for build_remain_mbr_select
5509  +===========================================================================*/
5510 PROCEDURE Base_Update (p_eng_sql IN VARCHAR2
5511                       ,p_data_slc IN VARCHAR2
5512                       ,p_proc_num IN VARCHAR2
5513                       ,p_partition_code IN NUMBER
5514                       ,p_fetch_limit IN NUMBER
5515                       ,p_load_type IN VARCHAR2
5516                       ,p_dimension_varchar_label IN VARCHAR2
5517                       ,p_simple_dimension_flag IN VARCHAR2
5518                       ,p_shared_dimension_flag IN VARCHAR2
5519                       ,p_dimension_id IN NUMBER
5520                       ,p_value_set_required_flag IN VARCHAR2
5521                       ,p_hier_table_name IN VARCHAR2
5522                       ,p_hier_dimension_flag IN VARCHAR2
5523                       ,p_source_b_table IN VARCHAR2
5524                       ,p_target_b_table IN VARCHAR2
5525                       ,p_member_dc_col IN VARCHAR2
5526                       ,p_member_t_dc_col IN VARCHAR2
5527                       ,p_member_col IN VARCHAR2
5528                       ,p_exec_mode_clause IN VARCHAR2
5529                       ,p_master_request_id IN NUMBER)
5530 IS
5531 -- Consants
5532    c_proc_name VARCHAR2(30) := 'Base_Update';
5533 
5534 -- Dynamic SQL statement variables
5535    x_remain_mbr_select_stmt          VARCHAR2(4000);
5536    x_update_stmt                     VARCHAR2(4000);
5537    x_update_mbr_status_stmt          VARCHAR2(4000);
5538    x_update_dimgrp_stmt              VARCHAR2(4000);
5539    x_delete_mbr_stmt                 VARCHAR2(4000);
5540    x_enabled_flag_update_stmt        VARCHAR2(4000);
5541    x_seq_enf_hiercount_stmt          VARCHAR2(4000);
5542 
5543 -- Count variables
5544    v_mbr_last_row                    NUMBER;
5545    v_seq_conflict_count              NUMBER;
5546    v_count                           NUMBER;
5547    v_temp_rows_rejected              NUMBER :=0;
5548    v_rows_rejected                   NUMBER :=0;
5549    v_rows_loaded                     NUMBER :=0;
5550    v_seq_enf_hiercount               NUMBER;
5551    v_calp_dimgrp_count               NUMBER; -- used to identify is the dimgrp
5552                                              -- for an existing cal period member
5553                                              -- matches the dimgrp in the target_b
5554                                              -- for that member
5555 
5556 -- Other variables
5557    v_fetch_limit                     NUMBER;
5558 
5559 -- MP variables
5560    v_loop_counter                    NUMBER;
5561    v_slc_id                          NUMBER;
5562    v_slc_val                         VARCHAR2(100);
5563    v_slc_val2                        VARCHAR2(100);
5564    v_slc_val3                        VARCHAR2(100);
5565    v_slc_val4                        VARCHAR2(100);
5566    v_mp_status                       VARCHAR2(30);
5567    v_mp_message                      VARCHAR2(4000);
5568    v_num_vals                        NUMBER;
5569    v_part_name                       VARCHAR2(4000);
5570 
5571 -------------------------------------
5572 -- Declare bulk collection columns --
5573 -------------------------------------
5574 
5575 -- Common abbreviations:
5576 --    t_ = array of raw interface table member rows
5577 --    tf = "final" array of interface table member rows that have been validated for insert
5578 --    ta = array of raw interface table attribute rows
5579 --    tfa = "final" array of interface table attribute rows that have been validated for insert
5580 
5581    t_rowid                           rowid_type;
5582    t_member_id                       varchar2_150_type;
5583    t_value_set_id                    number_type;
5584    t_dimension_group_id              number_type;
5585    t_old_dimension_group_id          number_type; -- dimgrp of the member as it exists in
5586                                                   -- in the _B table
5587    t_b_status                        varchar2_std_type;
5588    t_member_dc                       varchar2_150_type;
5589    t_value_set_dc                    varchar2_150_type;
5590    t_dimension_group_dc              varchar2_150_type;
5591    t_dimension_group_seq             number_type;
5592    t_time_group_type_code            varchar2_std_type;
5593 
5594 ---------------------
5595 -- Declare cursors --
5596 ---------------------
5597    cv_get_remain_mbr     cv_curs;
5598 
5599 BEGIN
5600    FEM_ENGINES_PKG.TECH_MESSAGE
5601     (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
5602 
5603    --x_status := 0; -- initialize status of the Base_Update procedure
5604    --x_message := 'COMPLETE:NORMAL';
5605 
5606    -- set the local fetch limit variable based on the parameter
5607    -- this will be null for Dimension Group loads
5608    v_fetch_limit := p_fetch_limit;
5609    IF v_fetch_limit IS NULL THEN
5610       v_fetch_limit := 10000;
5611    END IF;
5612 
5613 
5614    build_remain_mbr_select_stmt  (p_load_type
5615                                  ,p_dimension_id
5616                                  ,p_dimension_varchar_label
5617                                  ,p_shared_dimension_flag
5618                                  ,p_value_set_required_flag
5619                                  ,p_hier_dimension_flag
5620                                  ,p_source_b_table
5621                                  ,p_target_b_table
5622                                  ,p_member_col
5623                                  ,p_member_dc_col
5624                                  ,p_member_t_dc_col
5625                                  ,p_exec_mode_clause
5626                                  ,x_remain_mbr_select_stmt);
5627 
5628    IF p_data_slc IS NOT NULL THEN
5629       x_remain_mbr_select_stmt := REPLACE(x_remain_mbr_select_stmt,'{{data_slice}}',p_data_slc);
5630    ELSE
5631       x_remain_mbr_select_stmt := REPLACE(x_remain_mbr_select_stmt,'{{data_slice}}','1=1');
5632    END IF;
5633 
5634    FEM_ENGINES_PKG.TECH_MESSAGE
5635    (c_log_level_1,c_block||'.'||c_proc_name||'.member select stmt'
5636    ,x_remain_mbr_select_stmt);
5637 
5638    build_status_update_stmt (p_source_b_table
5639                             ,x_update_mbr_status_stmt);
5640 
5641    FEM_ENGINES_PKG.TECH_MESSAGE
5642    (c_log_level_1,c_block||'.'||c_proc_name||'.status update stmt'
5643    ,x_update_mbr_status_stmt);
5644 
5645    build_delete_stmt (p_source_b_table
5646                      ,x_delete_mbr_stmt);
5647 
5648    FEM_ENGINES_PKG.TECH_MESSAGE
5649    (c_log_level_1,c_block||'.'||c_proc_name||'.delete stmt'
5650    ,x_delete_mbr_stmt);
5651 
5652    build_seq_enf_hiercount_stmt (p_value_set_required_flag
5653                                 ,p_hier_table_name
5654                                 ,x_seq_enf_hiercount_stmt);
5655 
5656    FEM_ENGINES_PKG.TECH_MESSAGE
5657    (c_log_level_1,c_block||'.'||c_proc_name||'.seq_enf_hiercount_stmt'
5658    ,x_seq_enf_hiercount_stmt);
5659 
5660    build_dimgrp_update_stmt (p_target_b_table
5661                             ,p_value_set_required_flag
5662                             ,p_member_dc_col
5663                             ,x_update_dimgrp_stmt);
5664 
5665    FEM_ENGINES_PKG.TECH_MESSAGE
5666    (c_log_level_1,c_block||'.'||c_proc_name||'.update member base table stmt'
5667    ,x_update_dimgrp_stmt);
5668 
5669    build_enable_update_stmt (p_dimension_varchar_label
5670                             ,p_dimension_id
5671                             ,p_load_type
5672                             ,p_target_b_table
5673                             ,p_member_col
5674                             ,p_member_dc_col
5675                             ,p_value_set_required_flag
5676                             ,x_enabled_flag_update_stmt);
5677    IF p_data_slc IS NOT NULL THEN
5678       x_enabled_flag_update_stmt := REPLACE(x_enabled_flag_update_stmt,'{{data_slice}}',p_data_slc);
5679    ELSE
5680       x_enabled_flag_update_stmt := REPLACE(x_enabled_flag_update_stmt,'{{data_slice}}','1=1');
5681    END IF;
5682 
5683    FEM_ENGINES_PKG.TECH_MESSAGE
5684    (c_log_level_1,c_block||'.'||c_proc_name||'.update member enabled_flag stmt'
5685    ,x_enabled_flag_update_stmt);
5686 
5687 
5688    v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
5689                         -- the data slice loop
5690 
5691    LOOP
5692 
5693       IF p_load_type <> ('DIMENSION_GROUP') THEN
5694 
5695       FEM_Multi_Proc_Pkg.Get_Data_Slice(
5696         x_slc_id => v_slc_id,
5697         x_slc_val1 => v_slc_val,
5698         x_slc_val2 => v_slc_val2,
5699         x_slc_val3 => v_slc_val3,
5700         x_slc_val4 => v_slc_val4,
5701         x_num_vals  => v_num_vals,
5702         x_part_name => v_part_name,
5703         p_req_id => p_master_request_id,
5704         p_proc_num => p_proc_num);
5705 
5706       FEM_ENGINES_PKG.TECH_MESSAGE
5707        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
5708        ,v_slc_val);
5709       FEM_ENGINES_PKG.TECH_MESSAGE
5710        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
5711        ,v_slc_val2);
5712       FEM_ENGINES_PKG.TECH_MESSAGE
5713        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
5714        ,v_slc_val3);
5715       FEM_ENGINES_PKG.TECH_MESSAGE
5716        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
5717        ,v_slc_val4);
5718 
5719 
5720       EXIT WHEN (v_slc_id IS NULL);
5721       ELSE
5722          EXIT WHEN (v_loop_counter > 0);
5723          v_loop_counter := v_loop_counter + 1;
5724       END IF;
5725 
5726    ------------------------------------------------------------------------------
5727    -- Loop through the remaining members that already exist in the _B_T table
5728    -- to perform update on the Dimension Group
5729    ------------------------------------------------------------------------------
5730       IF p_load_type <> ('DIMENSION_GROUP') THEN
5731          OPEN cv_get_remain_mbr FOR x_remain_mbr_select_stmt USING v_slc_val, v_slc_val2;
5732       ELSE
5733          OPEN cv_get_remain_mbr FOR x_remain_mbr_select_stmt;
5734       END IF;
5735 
5736       LOOP
5737          -------------------------------------------
5738          -- Bulk Collect Rows from the source _B table
5739          -- Using Dynamic SELECT Statement
5740          -------------------------------------------
5741          FETCH cv_get_remain_mbr BULK COLLECT INTO
5742                 t_rowid
5743                 ,t_member_id
5744                ,t_member_dc
5745                ,t_value_set_dc
5746                ,t_value_set_id
5747                ,t_dimension_group_dc
5748                ,t_dimension_group_id
5749                ,t_old_dimension_group_id
5750                ,t_dimension_group_seq
5751                ,t_time_group_type_code
5752                ,t_b_status
5753          LIMIT v_fetch_limit;
5754          ----------------------------------------------
5755          -- EXIT Fetch LOOP If No Rows are Retrieved --
5756          ----------------------------------------------
5757          v_mbr_last_row := t_member_dc.LAST;
5758 
5759          IF (v_mbr_last_row IS NULL)
5760          THEN
5761             EXIT;
5762          END IF;
5763 
5764          FOR i IN 1..v_mbr_last_row
5765          LOOP
5766          ----------------------------------------------
5767          --  Begin Load_Type = 'DIMENSION_GROUP' Validations
5768          ----------------------------------------------
5769             IF (p_load_type = 'DIMENSION_GROUP') THEN
5770                SELECT count(*)
5771                INTO v_seq_conflict_count
5772                FROM fem_dimension_grps_b
5773                WHERE dimension_group_seq = t_dimension_group_seq(i)
5774                AND dimension_id = p_dimension_id
5775                AND dimension_group_id <> t_dimension_group_id(i);
5776 
5777                IF v_seq_conflict_count > 0 THEN
5778                   t_b_status(i) := 'DIMENSION_GROUP_SEQ_NOT_UNIQUE';
5779                   ----------------------------------------------------------
5780                   -- Count the error rows
5781                   ----------------------------------------------------------
5782                   v_temp_rows_rejected := v_temp_rows_rejected + 1;
5783                     FEM_ENGINES_PKG.TECH_MESSAGE
5784                       (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected1',v_temp_rows_rejected);
5785                END IF; -- seq_conflict_count
5786 
5787                IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
5788                   SELECT count(*)
5789                   INTO v_count
5790                   FROM fem_time_group_types_b
5791                   WHERE time_group_type_code = t_time_group_type_code(i);
5792 
5793                   IF v_count =0 THEN
5794                      t_b_status(i) := 'INVALID_TIME_GROUP_TYPE';
5795                      ----------------------------------------------------------
5796                      -- Count the error rows
5797                      ----------------------------------------------------------
5798                      v_temp_rows_rejected := v_temp_rows_rejected + 1;
5799                   END IF;
5800                END IF; -- CAL_PERIOD
5801             ELSE
5802             ----------------------------------------------
5803             -- Load_Type = 'DIMENSION_MEMBER' validations
5804             ----------------------------------------------
5805                IF p_hier_dimension_flag = 'Y' THEN
5806                   -- Validate the Dimension Group for the member
5807 
5808                   IF (t_dimension_group_dc(i) IS NOT NULL
5809                       AND t_dimension_group_id(i) IS NULL
5810                       AND p_dimension_varchar_label NOT IN ('CAL_PERIOD')) THEN
5811                      t_b_status(i) := 'INVALID_DIMENSION_GROUP';
5812                      ----------------------------------------------------------
5813                      -- Count the error rows
5814                      ----------------------------------------------------------
5815                      v_temp_rows_rejected := v_temp_rows_rejected + 1;
5816                     FEM_ENGINES_PKG.TECH_MESSAGE
5817                       (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected2',v_temp_rows_rejected);
5818                   END IF; -- validation on dimgrp being not null
5819 
5820                  -- Get count of sequence enforced hiers in which the member participates
5821                  IF p_dimension_varchar_label NOT IN ('CAL_PERIOD') THEN
5822                     IF p_value_set_required_flag = 'Y' THEN
5823                        EXECUTE IMMEDIATE x_seq_enf_hiercount_stmt
5824                        INTO v_seq_enf_hiercount
5825                        USING t_member_id(i)
5826                             ,t_value_set_id(i);
5827                     ELSE
5828                        EXECUTE IMMEDIATE x_seq_enf_hiercount_stmt
5829                        INTO v_seq_enf_hiercount
5830                        USING t_member_id(i);
5831                     END IF; -- hiercount immediate
5832 
5833                     IF v_seq_enf_hiercount > 0
5834                        AND t_dimension_group_id(i) <> t_old_dimension_group_id(i) THEN
5835                        t_b_status(i) := 'INVALID_DIMGRP_MBR_IN_SEQ_HIER';
5836                        ----------------------------------------------------------
5837                        -- Count the error rows
5838                        ----------------------------------------------------------
5839                        v_temp_rows_rejected := v_temp_rows_rejected + 1;
5840                       FEM_ENGINES_PKG.TECH_MESSAGE
5841                         (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected3',v_temp_rows_rejected);
5842                     ELSE -- update the dimension_group
5843                        IF p_value_set_required_flag = 'Y' THEN
5844                           EXECUTE IMMEDIATE x_update_dimgrp_stmt
5845                           USING t_dimension_group_id(i)
5846                                ,gv_apps_user_id
5847                                ,gv_login_id
5848                                ,t_member_dc(i)
5849                                ,t_value_set_id(i)
5850                                ,t_b_status(i);
5851                        ELSE
5852                           EXECUTE IMMEDIATE x_update_dimgrp_stmt
5853                           USING t_dimension_group_id(i)
5854                                ,gv_apps_user_id
5855                                ,gv_login_id
5856                                ,t_member_dc(i)
5857                                ,t_b_status(i);
5858                        END IF; -- execute immediate x_update_dimgrp_stmt
5859                     END IF; -- v_seq_enf_hiercount
5860                   END IF; -- not CAL_PERIOD
5861                END IF; -- dimensions that use_groups
5862             END IF; -- Load_Type 'DIMENSION_GROUP' v.s. 'DIMENSION_MEMBER'
5863          END LOOP;
5864          FEM_ENGINES_PKG.TECH_MESSAGE
5865           (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected4',v_temp_rows_rejected);
5866 
5867          ---------------------------------------------------------
5868          -- Update member records in the _B table for Rejected records
5869          ---------------------------------------------------------
5870         FEM_ENGINES_PKG.TECH_MESSAGE
5871           (c_log_level_1,c_block||'.'||c_proc_name||'.updating mbr status','start');
5872          FORALL i IN 1..v_mbr_last_row
5873             EXECUTE IMMEDIATE x_update_mbr_status_stmt
5874                USING t_b_status(i)
5875                     ,t_rowid(i)
5876                     ,t_b_status(i);
5877 
5878          ---------------------------------------------------------
5879          -- Delete member records from the _B_T table
5880          ---------------------------------------------------------
5881          FORALL i IN 1..v_mbr_last_row
5882             EXECUTE IMMEDIATE x_delete_mbr_stmt
5883             USING t_rowid(i)
5884                  ,t_b_status(i)
5885                  ,'N';
5886 
5887          ---------------------------------------------------------
5888          --  Bug#3906218 NEED ABILITY TO UNDELETE DIMENSIONS
5889          --  Perform the Enabled Flag update on the B table
5890          ---------------------------------------------------------
5891         FEM_ENGINES_PKG.TECH_MESSAGE
5892           (c_log_level_1,c_block||'.'||c_proc_name||'.updating enabled flag','start');
5893 
5894          IF (p_value_set_required_flag = 'Y') THEN
5895             FORALL i IN 1..v_mbr_last_row
5896                EXECUTE IMMEDIATE x_enabled_flag_update_stmt
5897                USING t_member_dc(i)
5898                     ,t_value_set_dc(i)
5899                     ,t_value_set_dc(i)
5900                     ,t_b_status(i);
5901 
5902          ELSE
5903             FORALL i IN 1..v_mbr_last_row
5904                EXECUTE IMMEDIATE x_enabled_flag_update_stmt
5905                USING t_member_dc(i)
5906                     ,t_b_status(i);
5907          END IF;
5908 
5909 
5910          ----------------------------------------------------------
5911          -- Count the error and loaded rows
5912          ----------------------------------------------------------
5913          v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
5914          v_rows_loaded := v_rows_loaded + (v_mbr_last_row - v_temp_rows_rejected);
5915         FEM_ENGINES_PKG.TECH_MESSAGE
5916           (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected',v_rows_rejected);
5917 
5918          --x_rows_loaded   := x_rows_loaded + (v_mbr_last_row - v_temp_rows_rejected);
5919          v_temp_rows_rejected := 0;  -- initialize for next pass of the loop
5920          v_rows_loaded := 0;
5921 
5922          --------------------------------------------
5923          -- Delete Collections for Next Bulk Fetch --
5924          --------------------------------------------
5925          t_rowid.DELETE;
5926          t_member_id.DELETE;
5927          t_member_dc.DELETE;
5928          t_value_set_dc.DELETE;
5929          t_value_set_id.DELETE;
5930          t_dimension_group_dc.DELETE;
5931          t_dimension_group_id.DELETE;
5932          t_b_status.DELETE;
5933 
5934       COMMIT;
5935       END LOOP;  -- Remaining members BULK Collect
5936 
5937    IF p_load_type <> ('DIMENSION_GROUP') THEN
5938       FEM_Multi_Proc_Pkg.Post_Data_Slice(
5939         p_req_id => p_master_request_id,
5940         p_slc_id => v_slc_id,
5941         p_status => v_mp_status,
5942         p_message => v_mp_message,
5943         p_rows_processed => 0,
5944         p_rows_loaded => 0,
5945         p_rows_rejected => v_rows_rejected);
5946    END IF;
5947 
5948    END LOOP; -- get_data_slice
5949 
5950    IF p_load_type = ('DIMENSION_GROUP') THEN
5951       gv_dimgrp_rows_rejected := gv_dimgrp_rows_rejected + v_rows_rejected;
5952    END IF;
5953 
5954 
5955    IF cv_get_remain_mbr%ISOPEN THEN
5956       CLOSE cv_get_remain_mbr;
5957    END IF;
5958 
5959    --x_rows_rejected := v_rows_rejected;
5960    FEM_ENGINES_PKG.TECH_MESSAGE
5961     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
5962 
5963    EXCEPTION
5964       WHEN OTHERS THEN
5965          IF cv_get_remain_mbr%ISOPEN THEN
5966             CLOSE cv_get_remain_mbr;
5967          END IF;
5968 
5969          --x_status:= 2;
5970          --x_message := 'COMPLETE:ERROR';
5971 
5972          gv_prg_msg := sqlerrm;
5973          gv_callstack := dbms_utility.format_call_stack;
5974 
5975          FEM_ENGINES_PKG.TECH_MESSAGE
5976           (p_severity => c_log_level_6
5977           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5978           ,p_msg_text => gv_prg_msg);
5979 
5980          FEM_ENGINES_PKG.TECH_MESSAGE
5981           (p_severity => c_log_level_6
5982           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
5983           ,p_msg_text => gv_callstack);
5984 
5985          FEM_ENGINES_PKG.USER_MESSAGE
5986           (p_app_name => c_fem
5987           ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
5988           ,P_TOKEN1 => 'ERR_MSG'
5989           ,P_VALUE1 => gv_prg_msg);
5990 
5991        --  FEM_ENGINES_PKG.USER_MESSAGE
5992        --   (p_app_name => c_fem
5993        --   ,p_msg_text => gv_prg_msg);
5994 
5995          RAISE e_main_terminate;
5996 
5997 
5998 END Base_Update;
5999 
6000 /*===========================================================================+
6001  | PROCEDURE
6002  |              Attr_Assign_Update
6003  |
6004  | DESCRIPTION
6005  |   This step updates attribute rows for existing members.  It also inserts
6006  |   new attribute rows for existing members.  It is not necessary for users
6007  |   to populate the _B_T table in order for this step to run - it just queries
6008  |   attribute assignments from the _ATTR_T table
6009  |
6010  | SCOPE - PRIVATE
6011  |
6012  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
6013  |
6014  | ARGUMENTS  : IN:
6015  |
6016  |
6017  |              OUT:
6018  |
6019  |              IN/ OUT:
6020  |
6021  | RETURNS    : NONE
6022  |
6023  | NOTES
6024  |
6025   |   Update Attribute Assign (Simple Dim = 'N' only)
6026  |   1.	Attribute assignment rows for members that exist in FEM can be updated
6027  |      where the assignment already exists.  Also, assignment rows for
6028  |      additional versions can be loaded as long as the attribute supports multiple versions.
6029  |      	If a DIMENSION assignment, then assignment value must exist in the
6030  |          attribute dimension table.  Status = 'INVALID_DIM_ASSIGNMENT' for failure
6031  |      	If a DATE assignment, then assignment value must be a valid date.
6032  |          Status='INVALID_DATE' for failure
6033  |      	If a NUMBER assignment, then assignment value must be a valid number.
6034  |          Status = 'INVALID_NUMBER' for failure.
6035  |      	If an assignment exists for the VERSION_DISPLAY_CODE and the attribute
6036  |          is Read Only, then record is rejected and
6037  |          Status = 'READ_ONLY_ATTRIBUTE'
6038  |      	If an assignment does not exist for the VERSION_DISPLAY_CODE and
6039  |          and an assignment does exist for one or more versions and the attribute
6040  |          is a "Single Version Only", then record is rejected and
6041  |          Status = 'MULT_VERSION_NOT_ALLOWED'
6042  |
6043  |            -If the attribute assignment already exists for the provided version, it will be
6044  |             updated in FEM with the new value as long as it is not a "read only"
6045  |             version and as long as the attribute is not a "multiple assignment" attribute.
6046  |
6047  |            -If the assignment exists for the provided version and the attribute
6048  |             is a "multiple assignment" attribute, then a new attribute row will be
6049  |             inserted for that version.
6050  |
6051  |            -If the attribute assignment exists for the member but for a different version,
6052  |             then a new assignment row will be created only if the attribute "allows
6053  |             multiple versions".
6054  |
6055  |            -If the attribute assignment does not exist at all for the member (either for
6056  |             provided version or for any version), then a new assignment row will be
6057  |             inserted.
6058  |   2.	Delete any _ATTR_T rows that are successful.
6059  |
6060  | MODIFICATION HISTORY
6061  |    Rob Flippo   22-MAR-04  Created
6062  |    Rob Flippo   13-SEP-04  Bug#3835758  Validation on the attr_Assign_vs
6063  |                                         was modified to include dimension_id
6064  |                                         in the where condition
6065  |    Rob Flippo   15-SEP-04  Bug#3835758  Added exception handler so no failure
6066  |                                         if VS didn't exist.  Also moved the section
6067  |                                         that verifies the VS so that only called
6068  |                                         for DIMENSION attributes;
6069  |    Rob Flippo   30-SEP-04  Bug#3925655  For assignment_is_read_only='Y' attr,
6070  |                                         if the new value = the existing value,
6071  |                                         go ahead and do the update so that the
6072  |                                         interface row can be deleted and not
6073  |                                         show up as an error
6074  |    Logic for assignment_is_read_only is as follows:
6075  |     If assignment_is_read_only_flag = 'Y', and there is an existing
6076  |     assignment record for the same version (i.e., - using build_does_attr_exist
6077  |     with version_flag = 'Y'), then
6078  |        query the target ATTR table again for that member, attribute, version,
6079  |        and include the appropriate assignment columns to see if you get 1 row
6080  |        back.  If you do, then go ahead an update, since it is identical
6081  |        If no row comes back, then error as normal for when user tries to update
6082  |        assignment_is_read_only attribute
6083  |
6084  |     Rob Flippo   01-OCT-04 Added logic so that if member is read
6085  |                            only, the attribute update is not
6086  |
6087  |    Rob Flippo   22-NOV-04  Bug#4019066 Add validation on Accounting_Year
6088  |                            and GL_PERIOD_NUM for CAL_PERIOD;  ACCOUNTING_YEAR
6089  |                            must be >=1900 and <= 2599 while GL_PERIOD_NUM
6090  |                            must be <= periods_in_year for the Time Group Type
6091  |                            allowed
6092  |                            Bug#4019853 - Fix Data Overlap logic -
6093  |                            Added section that checks within the
6094  |                            attr array for date overlaps.  This logic
6095  |                            assumes num_of_processes = 1 for CAL_PEIOD
6096  |                            load
6097  |   Rob Flippo   05-MAR-05   Bug#4170444 Add check to see if READ_ONLY_FLAG='Y'
6098  |                            in the target ATTR table for existing rows.  If
6099  |                            it is, then set STATUS = 'PROTECTED_ATTR_ASSIGN'
6100  |   Rob Flippo   11-AUG-05   Bug#4547868 Performance issue - change ATTR
6101  |                            Select to get member_id and value_set_id
6102  |   Rob Flippo   07-OCT-05   Bug#4630742 10G issue - Attr_assign_update fails
6103  |                            on does_attr_exist checks:  Modified the fetch
6104  |                            so that both the "version" and "non-version" queries
6105  |                            are identical for output variables;
6106  | Rob Flippo     28-APR-06   Bug 5174039 Added validation that calp start_date
6107  |                            must be <= calp end date
6108  | Rob Flippo     18-JUL-06   Bug 5024575 Updates for Many-to-many attributes
6109  +===========================================================================*/
6110 PROCEDURE Attr_Assign_Update (p_eng_sql IN VARCHAR2
6111                              ,p_data_slc IN VARCHAR2
6112                              ,p_proc_num IN VARCHAR2
6113                              ,p_partition_code IN NUMBER
6114                              ,p_fetch_limit IN NUMBER
6115                              ,p_dimension_varchar_label IN VARCHAR2
6116                              ,p_date_format_mask IN VARCHAR2
6117                              ,p_dimension_id IN VARCHAR2
6118                              ,p_target_b_table IN VARCHAR2
6119                              ,p_target_attr_table IN VARCHAR2
6120                              ,p_source_b_table IN VARCHAR2
6121                              ,p_source_attr_table IN VARCHAR2
6122                              ,p_member_col IN VARCHAR2
6123                              ,p_member_dc_col IN VARCHAR2
6124                              ,p_member_t_dc_col IN VARCHAR2
6125                              ,p_value_set_required_flag IN VARCHAR2
6126                              ,p_hier_dimension_flag IN VARCHAR2
6127                              ,p_simple_dimension_flag IN VARCHAR2
6128                              ,p_shared_dimension_flag IN VARCHAR2
6129                              ,p_exec_mode_clause IN VARCHAR2
6130                              ,p_master_request_id IN NUMBER )
6131 IS
6132 -- Constants
6133    c_proc_name VARCHAR2(30) := 'Attr_Assign_Update';
6134 
6135 -- variables storing temporary state information
6136    v_attr_success                    VARCHAR2(30);
6137    v_temp_member                     VARCHAR2(100);
6138    v_temp_rows_rejected              NUMBER :=0;
6139    v_rows_rejected                   NUMBER :=0;
6140    v_rows_loaded                     NUMBER :=0;
6141 
6142 -- MP variables
6143    v_loop_counter                    NUMBER;
6144    v_slc_id                          NUMBER;
6145    v_slc_val                         VARCHAR2(100);
6146    v_slc_val2                        VARCHAR2(100);
6147    v_slc_val3                        VARCHAR2(100);
6148    v_slc_val4                        VARCHAR2(100);
6149    v_mp_status                       VARCHAR2(30);
6150    v_mp_message                      VARCHAR2(4000);
6151    v_num_vals                        NUMBER;
6152    v_part_name                       VARCHAR2(4000);
6153 
6154 -- Dynamic SQL statement variables
6155    x_select_stmt                     VARCHAR2(4000);
6156    x_attr_select_stmt                VARCHAR2(4000);
6157    x_remain_mbr_select_stmt          VARCHAR2(4000);
6158    x_insert_member_stmt              VARCHAR2(4000);
6159    x_insert_attr_stmt                VARCHAR2(4000);
6160    x_update_stmt                     VARCHAR2(4000);
6161    x_attr_update_stmt                VARCHAR2(4000);
6162    x_update_tl_stmt                  VARCHAR2(4000);
6163    x_update_attr_status_stmt         VARCHAR2(4000);
6164    x_update_mbr_status_stmt          VARCHAR2(4000);
6165    x_update_tl_status_stmt           VARCHAR2(4000);
6166    x_update_dimgrp_stmt              VARCHAR2(4000);
6167    x_delete_attr_stmt                VARCHAR2(4000);
6168    x_special_delete_attr_stmt        VARCHAR2(4000);
6169    x_delete_mbr_stmt                 VARCHAR2(4000);
6170    x_delete_tl_stmt                  VARCHAR2(4000);
6171    x_does_attr_exist_stmt            VARCHAR2(4000);
6172    x_does_multattr_exist_stmt        VARCHAR2(4000);
6173    x_does_attr_exist_novers_stmt     VARCHAR2(4000);
6174    x_identical_attr_select_stmt      VARCHAR2(4000);
6175    x_adj_period_stmt                 VARCHAR2(4000);
6176    x_overlap_sql_stmt                VARCHAR2(4000);
6177    x_calp_interim_stmt               VARCHAR2(4000);
6178    x_calp_attr_interim_stmt          VARCHAR2(4000);
6179 
6180 -- Count variables for manipulating the member and attribute arrays
6181    v_attr_final_count                NUMBER := 0;
6182    v_mbr_final_count                 NUMBER := 0;
6183    v_mbr_count                       NUMBER := 0;
6184    v_attr_count                      NUMBER := 0;
6185    v_attr_subcount                   NUMBER := 0;
6186    v_final_mbr_last_row              NUMBER;
6187    v_attr_last_row                   NUMBER;
6188    v_mbr_last_row                    NUMBER;
6189    v_nonadj_period_count             NUMBER :=0;
6190    v_overlap_count                   NUMBER :=0;
6191 
6192 -------------------------------------
6193 -- Declare bulk collection columns --
6194 -------------------------------------
6195 
6196 -- Common abbreviations:
6197 --    t_ = array of raw interface table member rows
6198 --    tf = "final" array of interface table member rows that have been validated for insert
6199 --    ta = array of raw interface table attribute rows
6200 --    tfa = "final" array of interface table attribute rows that have been validated for insert
6201 
6202    ta_rowid                          rowid_type;
6203    tfa_rowid                         rowid_type;
6204 
6205    ta_member_id                      number_type;
6206    ta_value_set_id                   number_type;
6207    ta_attribute_id                   number_type;
6208    ta_attribute_dimension_id         number_type;
6209    ta_dim_attr_numeric_member        number_type;
6210    ta_number_assign_value            number_type;
6211    ta_version_id                     number_type;
6212    ta_attr_assign_vs_id              number_type;
6213    ta_attr_exists_count              number_type;  -- count of existing attr assign with version_id
6214    ta_multattr_exists_count          number_type;  -- count of existing attr assign with version_id and same assignment key
6215    ta_attr_exists_novers_count       number_type;  -- count of existing attr assign without version_id
6216    ta_attr_identical_count           number_type; -- count where the assignment values in the
6217                                                   -- target attr table are identical to the assignment
6218                                                   -- from the interface table
6219 
6220    tfa_attribute_id                  number_type;
6221    tfa_dim_attr_numeric_member       number_type;
6222    tfa_number_assign_value           number_type;
6223    tfa_version_id                    number_type;
6224    tfa_attr_assign_vs_id             number_type;
6225 
6226    ta_date_assign_value              date_type;
6227    ta_temp_date_assign_value         date_type;
6228    tfa_date_assign_value             date_type;
6229    ta_cal_period_end_date            date_type;
6230 
6231    ta_attribute_varchar_label        varchar2_std_type;
6232    ta_attr_value_column_name         varchar2_std_type;
6233    ta_attribute_data_type_code       varchar2_std_type;
6234    ta_dim_attr_varchar_member        varchar2_std_type;
6235    ta_status                         varchar2_std_type;
6236    ta_adj_period_flag                flag_type;
6237    ta_protected_assign_flag          flag_type;
6238    ta_use_interim_table_flag         flag_type;  -- identifies assignment rows where
6239                                                  -- we need to insert into the interim
6240                                                  -- tables prior to moving into FEM
6241 
6242    tfa_dim_attr_varchar_member       varchar2_std_type;
6243    tfa_status                        varchar2_std_type;
6244 
6245    ta_member_dc                      varchar2_150_type;
6246    ta_value_set_dc                   varchar2_150_type;
6247    ta_version_display_code           varchar2_150_type;
6248    ta_attr_assign_vs_dc              varchar2_150_type;
6249 
6250    tfa_member_dc                     varchar2_150_type;
6251    tfa_value_set_dc                  varchar2_150_type;
6252 
6253    ta_attribute_required_flag        flag_type;
6254    ta_allow_mult_assign_flag          flag_type;
6255    ta_read_only_flag                 flag_type;
6256    ta_allow_mult_versions_flag       flag_type;
6257 
6258    ta_language                       lang_type;
6259 
6260    ta_varchar_assign_value           varchar2_1000_type;
6261    ta_attribute_assign_value         varchar2_1000_type;
6262    tfa_varchar_assign_value          varchar2_1000_type;
6263 
6264    ta_member_read_only_flag          flag_type; -- member read_only flag;  If
6265                                                 -- 'Y', no attributes can be
6266                                                 -- modified by the loader
6267 
6268    -- table variables used in Interim processing for Cal Periods
6269    ta_cal_period_number              number_type;
6270    ta_calendar_dc                    varchar2_std_type;
6271    ta_dimension_group_dc             varchar2_std_type;
6272    ta_dimension_group_id             number_type;
6273    ta_calendar_id                    number_type;
6274 
6275    -- variables for holding attributes of CAL_PERIOD
6276    ta_calpattr_cal_dc                varchar2_std_type;
6277    ta_calpattr_dimgrp_dc             varchar2_std_type;
6278    ta_calpattr_end_date              date_type;
6279    ta_calpattr_period_num            number_type;
6280 
6281 
6282 ---------------------
6283 -- Declare cursors --
6284 ---------------------
6285    cv_get_attr_rows      cv_curs;
6286 
6287    v_session_sql varchar2(1000);
6288 
6289 BEGIN
6290    FEM_ENGINES_PKG.TECH_MESSAGE
6291     (c_log_level_2,c_block||'.'||c_proc_name||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
6292 
6293       FEM_ENGINES_PKG.TECH_MESSAGE
6294       (c_log_level_1,c_block||'.'||c_proc_name||'.attr_final_count'
6295       ,v_attr_final_count);
6296 
6297    --x_status := 0; -- initialize status of the Attr_Assign_Update procedure
6298    --x_message := 'COMPLETE:NORMAL';
6299 
6300    v_temp_rows_rejected := 0;  -- reset this temp counter so we can count invalid
6301                                -- attr records as we go
6302 
6303    build_attr_select_stmt (p_dimension_varchar_label
6304                           ,p_dimension_id
6305                           ,p_source_b_table
6306                           ,p_source_attr_table
6307                           ,p_target_b_table
6308                           ,p_member_t_dc_col
6309                           ,p_member_dc_col
6310                           ,p_member_col
6311                           ,p_value_set_required_flag
6312                           ,p_shared_dimension_flag
6313                           ,p_hier_dimension_flag
6314                           ,'N'
6315                           ,'N'
6316                           ,p_exec_mode_clause
6317                           ,x_attr_select_stmt);
6318 
6319    IF p_data_slc IS NOT NULL THEN
6320       x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}',p_data_slc);
6321    ELSE
6322       x_attr_select_stmt := REPLACE(x_attr_select_stmt,'{{data_slice}}','1=1');
6323    END IF;
6324 
6325 
6326    FEM_ENGINES_PKG.TECH_MESSAGE
6327    (c_log_level_1,c_block||'.'||c_proc_name||'.attr select stmt'
6328    ,x_attr_select_stmt);
6329 
6330    build_does_attr_exist_stmt (p_target_attr_table
6331                               ,p_target_b_table
6332                               ,p_member_col
6333                               ,p_member_dc_col
6334                               ,p_value_set_required_flag
6335                               ,'Y'
6336                               ,x_does_attr_exist_stmt);
6337 
6338 
6339    FEM_ENGINES_PKG.TECH_MESSAGE
6340    (c_log_level_1,c_block||'.'||c_proc_name||'.does attr exist for version stmt'
6341    ,x_does_attr_exist_stmt);
6342 
6343 
6344    build_does_attr_exist_stmt (p_target_attr_table
6345                               ,p_target_b_table
6346                               ,p_member_col
6347                               ,p_member_dc_col
6348                               ,p_value_set_required_flag
6349                               ,'N'
6350                               ,x_does_attr_exist_novers_stmt);
6351 
6352    build_get_identical_assgn_stmt (p_target_attr_table
6353                                 ,p_target_b_table
6354                                 ,p_member_col
6355                                 ,p_member_dc_col
6356                                 ,p_value_set_required_flag
6357                                 ,p_date_format_mask
6358                                 ,x_identical_attr_select_stmt);
6359 
6360    build_attr_update_stmt (p_target_attr_table
6361                           ,p_target_b_table
6362                           ,p_member_dc_col
6363                           ,p_member_col
6364                           ,p_value_set_required_flag
6365                           ,x_attr_update_stmt);
6366 
6367    FEM_ENGINES_PKG.TECH_MESSAGE
6368    (c_log_level_1,c_block||'.'||c_proc_name||'.attr update stmt'
6369    ,x_attr_update_stmt);
6370 
6371    build_delete_stmt (p_source_attr_table
6372                      ,x_delete_attr_stmt);
6373 
6374    build_special_delete_stmt (p_source_attr_table
6375                              ,x_special_delete_attr_stmt);
6376 
6377 
6378    build_insert_attr_stmt (p_target_attr_table
6379                           ,p_target_b_table
6380                           ,p_member_col
6381                           ,p_member_dc_col
6382                           ,p_value_set_required_flag
6383                           ,x_insert_attr_stmt);
6384 
6385    FEM_ENGINES_PKG.TECH_MESSAGE
6386    (c_log_level_1,c_block||'.'||c_proc_name||'.insert attr stmt'
6387    ,x_insert_attr_stmt);
6388 
6389    build_status_update_stmt (p_source_attr_table
6390                             ,x_update_attr_status_stmt);
6391 
6392    -- special insert stmts for the INTERIM tables for CAL_PERIOD loads
6393    IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
6394       build_calp_interim_insert_stmt(x_calp_interim_stmt
6395                                     ,x_calp_attr_interim_stmt);
6396    END IF;
6397 
6398 
6399    v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
6400                         -- the data slice loop
6401    LOOP
6402 
6403          FEM_Multi_Proc_Pkg.Get_Data_Slice(
6404            x_slc_id => v_slc_id,
6405            x_slc_val1 => v_slc_val,
6406            x_slc_val2 => v_slc_val2,
6407            x_slc_val3 => v_slc_val3,
6408            x_slc_val4 => v_slc_val4,
6409            x_num_vals  => v_num_vals,
6410            x_part_name => v_part_name,
6411            p_req_id => p_master_request_id,
6412            p_proc_num => p_proc_num);
6413 
6414          FEM_ENGINES_PKG.TECH_MESSAGE
6415           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
6416           ,v_slc_val);
6417          FEM_ENGINES_PKG.TECH_MESSAGE
6418           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
6419           ,v_slc_val2);
6420          FEM_ENGINES_PKG.TECH_MESSAGE
6421           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
6422           ,v_slc_val3);
6423          FEM_ENGINES_PKG.TECH_MESSAGE
6424           (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
6425           ,v_slc_val4);
6426 
6427          EXIT WHEN (v_slc_id IS NULL);
6428 
6429       -----------------------------------------------------
6430       -- Bulk Collect ATTR_T Rows for non-simple dimensions
6431       -- Using Dynamic SELECT Statement
6432       -----------------------------------------------------
6433       OPEN cv_get_attr_rows FOR x_attr_select_stmt USING v_slc_val, v_slc_val2;
6434 
6435       LOOP  -- ATTR Collection Loop
6436          FETCH cv_get_attr_rows BULK COLLECT INTO
6437             ta_rowid
6438            ,ta_member_read_only_flag
6439            ,ta_attribute_id
6440            ,ta_attribute_varchar_label
6441            ,ta_attribute_dimension_id
6442            ,ta_attr_value_column_name
6443            ,ta_attribute_data_type_code
6444            ,ta_attribute_required_flag
6445            ,ta_read_only_flag
6446            ,ta_allow_mult_versions_flag
6447            ,ta_allow_mult_assign_flag
6448            ,ta_member_dc
6449            ,ta_value_set_dc
6450            ,ta_member_id
6451            ,ta_value_set_id
6452            ,ta_attribute_assign_value
6453            ,ta_dim_attr_numeric_member
6454            ,ta_dim_attr_varchar_member
6455            ,ta_number_assign_value
6456            ,ta_varchar_assign_value
6457            ,ta_date_assign_value
6458            ,ta_version_display_code
6459            ,ta_version_id
6460            ,ta_attr_assign_vs_dc
6461            ,ta_attr_assign_vs_id
6462            ,ta_cal_period_end_date
6463            ,ta_status
6464            ,ta_use_interim_table_flag
6465            ,ta_cal_period_number
6466            ,ta_calendar_dc
6467            ,ta_calendar_id
6468            ,ta_dimension_group_dc
6469            ,ta_dimension_group_id
6470            ,ta_calpattr_cal_dc
6471            ,ta_calpattr_dimgrp_dc
6472            ,ta_calpattr_end_date
6473            ,ta_calpattr_period_num
6474       LIMIT p_fetch_limit;
6475 
6476          v_attr_last_row := ta_attribute_id.LAST;
6477          IF (v_attr_last_row IS NULL) THEN
6478  	    EXIT;
6479          END IF;
6480 
6481          FEM_ENGINES_PKG.TECH_MESSAGE
6482          (c_log_level_1,c_block||'.'||c_proc_name||'.attr_last_row'
6483          ,v_attr_last_row);
6484 
6485          FOR j IN 1..v_attr_last_row
6486          LOOP
6487 
6488             FEM_ENGINES_PKG.TECH_MESSAGE
6489             (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_label'
6490             ,ta_attribute_varchar_label(j));
6491 
6492             FEM_ENGINES_PKG.TECH_MESSAGE
6493             (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_assign_value'
6494             ,ta_attribute_assign_value(j));
6495 
6496             FEM_ENGINES_PKG.TECH_MESSAGE
6497             (c_log_level_1,c_block||'.'||c_proc_name||'.attr_value_column_name'
6498             ,ta_attr_value_column_name(j));
6499 
6500             FEM_ENGINES_PKG.TECH_MESSAGE
6501             (c_log_level_1,c_block||'.'||c_proc_name||'.use_interim_table_flag'
6502             ,ta_use_interim_table_flag(j));
6503 
6504             -- Bug#4429725
6505             -- reset the attr_final_count variable
6506             v_attr_final_count := 0;
6507 
6508             -----------------------------------------
6509             -- BEGIN ATTR VALIDATIONS
6510 
6511             -----------------------------------------
6512             -- Bug#3822561 Support for attributes of CAL_PERIOD
6513             -- if the attribute_dimension_id = 1 (CAL_PERIOD)
6514             -- then we construct a CAL_PERIOD_ID from the
6515             -- special CALP columns and move it into the
6516             -- ta_attribute_assign_value(j)
6517             -----------------------------------------
6518             IF ta_attribute_dimension_id(j) = 1 THEN
6519                get_attr_assign_calp(ta_attribute_assign_value(j)
6520                                    ,ta_status(j)
6521                                    ,ta_calpattr_cal_dc(j)
6522                                    ,ta_calpattr_dimgrp_dc(j)
6523                                    ,ta_calpattr_end_date(j)
6524                                    ,ta_calpattr_period_num(j));
6525             END IF;
6526             FEM_ENGINES_PKG.TECH_MESSAGE
6527             (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_assign_value - post conv'
6528             ,ta_attribute_assign_value(j));
6529 
6530             FEM_ENGINES_PKG.TECH_MESSAGE
6531             (c_log_level_1,c_block||'.'||c_proc_name||'.status post conv'
6532             ,ta_status(j));
6533 
6534             -----------------------------------------
6535             --    validate version_display_code
6536             -----------------------------------------
6537             get_attr_version (p_dimension_varchar_label
6538                              ,ta_attribute_varchar_label(j)
6539                              ,ta_version_display_code(j)
6540                              ,ta_version_id(j));
6541 
6542             FEM_ENGINES_PKG.TECH_MESSAGE
6543             (c_log_level_1,c_block||'.'||c_proc_name||'.attribute version id'
6544             ,ta_version_id(j));
6545 
6546             ----------------------------------------------------------
6547             -- Initialize variables - in case status <> 'LOAD'
6548             -- we still need values for the variables so we don't
6549             -- array element error
6550             ----------------------------------------------------------
6551             -- assume adj_period_flag = 'Y' for all cal_period
6552             -- this will get updated to 'N' later if appropriate
6553             IF p_dimension_Varchar_label = 'CAL_PERIOD' THEN
6554                ta_adj_period_flag(j) := 'Y';
6555             END IF;
6556             -- Assume the attr assignment doesn't exist
6557             ta_attr_exists_count(j) := 0;
6558             ta_multattr_exists_count(j) := 0;
6559             -- initializing the date field
6560             -- this will get updated appropriately for CAL_PERIOD members
6561             -- during the overlap check
6562             -- we use the temp variable later on for comparisons
6563             -- where we would expect it to be null
6564             ta_temp_date_assign_value(j) := ta_date_assign_value(j);
6565             ta_date_assign_value(j) := to_date('12/31/2499','MM/DD/YYYY');
6566             ------------------------------------------------------------------
6567 
6568 
6569             ------------------------------------------
6570             --  Member Read Only Flag validation
6571             -- Main IF for attr validation
6572             ------------------------------------------
6573             IF ta_member_read_only_flag(j) = 'N' AND ta_status(j) = 'LOAD'THEN
6574 
6575                -----------------------------------------
6576                -- validate attribute_assign_value
6577                -----------------------------------------
6578                -- VARCHAR_ASSIGN_VALUE
6579                IF (ta_attr_value_column_name(j) = 'VARCHAR_ASSIGN_VALUE'
6580                   AND ta_attribute_assign_value(j) IS NOT NULL
6581                   AND ta_version_id(j) IS NOT NULL) THEN
6582 
6583                   ta_varchar_assign_value(j)
6584                      := to_char(ta_attribute_assign_value(j));
6585                -- NUMBER_ASSIGN_VALUE
6586                ELSIF (ta_attr_value_column_name(j) = 'NUMBER_ASSIGN_VALUE'
6587                   AND ta_attribute_assign_value(j) IS NOT NULL
6588                      AND ta_version_id(j) IS NOT NULL) THEN
6589                   BEGIN
6590                      ta_number_assign_value(j) := to_number(ta_attribute_assign_value(j));
6591 
6592                      -- Special validation for ACCOUNTING_YEAR
6593                      -- ensures that the ACCOUNTING_YEAR value
6594                      -- is within the year range supported
6595                      IF p_dimension_varchar_label = 'CAL_PERIOD' AND
6596                         ta_attribute_varchar_label(j) = 'ACCOUNTING_YEAR' AND
6597                         (ta_number_assign_value(j) < 1900 OR
6598                         ta_number_assign_value(j) >= 2599) THEN
6599                         RAISE e_invalid_acct_year;
6600                      END IF;
6601 
6602                   EXCEPTION
6603                      WHEN e_invalid_number THEN
6604                            ta_status(j) := 'INVALID_NUMBER';
6605                      WHEN e_invalid_number1722 THEN
6606                            ta_status(j) := 'INVALID_NUMBER';
6607                      WHEN e_invalid_acct_year THEN
6608                         ta_status(j) := 'INVALID_ACCOUNTING_YEAR';
6609 
6610                   END;  -- NUMBER_ASSIGN_VALUE
6611                -- DATE_ASSIGN_VALUE
6612                ELSIF (ta_attr_value_column_name(j) = 'DATE_ASSIGN_VALUE'
6613                   AND ta_attribute_assign_value(j) IS NOT NULL
6614                   AND ta_version_id(j) IS NOT NULL) THEN
6615                   BEGIN
6616                      ta_date_assign_value(j) := to_date(ta_attribute_assign_value(j),p_date_format_mask);
6617                      ta_temp_date_assign_value(j) := to_date(ta_attribute_assign_value(j),p_date_format_mask);
6618 
6619                      -- Special validation for CAL_PERIOD_START_DATE
6620                      -- looking for existing cal periods where adj_period_flag='N'
6621                      -- where there is a start_date entry in the ATTR_T table
6622                      -- that overlaps with the start_date that is being "updated"
6623                      -- We are only checking within our data slice, since
6624                      -- if the overlap is in a separate data slice, the main
6625                      -- check on "existing" overlap records will catch it
6626 
6627                      IF p_dimension_varchar_label = 'CAL_PERIOD' AND
6628                        ta_attribute_varchar_label(j) = 'CAL_PERIOD_START_DATE' THEN
6629 
6630                        IF ta_cal_period_end_date(j) < ta_date_assign_value(j) THEN
6631                           RAISE e_invalid_calp_start_date;
6632                        END IF;
6633 
6634                         -- First check to see if the cal period with the new start
6635                         -- date is not an adj. period and it does not have an identical
6636                         -- start_date to its existing record in the "real" db
6637                         -- we exlude situations where the start_date is identical for
6638                         -- the same cal_period_id because the load is not changing
6639                         -- anything
6640                         x_adj_period_stmt := 'select count(*)'||
6641                         ' from fem_cal_periods_attr A1, fem_dim_attributes_b DA1'||
6642                         ',fem_dim_attr_versions_b V1'||
6643                         ',fem_cal_periods_attr A2, fem_dim_attributes_b DA2'||
6644                         ',fem_dim_attr_Versions_b V2'||
6645                         ' where to_char(A1.cal_period_id) = :b_mbr_dc'||
6646                         ' and A1.attribute_id = DA1.attribute_id'||
6647                         ' and DA1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6648                         ' and DA1.dimension_id = 1'||
6649                         ' and A1.dim_attribute_varchar_member = ''N'''||
6650                         ' and A1.version_id = V1.version_id'||
6651                         ' and V1.attribute_id = DA1.attribute_id'||
6652                         ' and V1.aw_snapshot_flag = ''N'''||
6653                         ' and V1.default_version_flag =''Y'''||
6654                         ' and A1.cal_period_id = A2.cal_period_id'||
6655                         ' and A2.date_assign_value '||
6656                         ' <> :b_date_assign'||
6657                         ' and A2.attribute_id = DA2.attribute_id'||
6658                         ' and DA2.attribute_varchar_label = ''CAL_PERIOD_START_DATE'''||
6659                         ' and DA2.dimension_id=1'||
6660                         ' and A2.version_id = V2.version_id'||
6661                         ' and V2.attribute_id = DA2.attribute_id'||
6662                         ' and V2.aw_snapshot_flag = ''N'''||
6663                         ' and V2.default_version_flag = ''Y''';
6664 
6665                         /*************************************************
6666                         bug#5060746 comment out to use bind variables
6667                         x_adj_period_stmt := 'select count(*)'||
6668                         ' from fem_cal_periods_attr A1, fem_dim_attributes_b DA1'||
6669                         ',fem_dim_attr_versions_b V1'||
6670                         ',fem_cal_periods_attr A2, fem_dim_attributes_b DA2'||
6671                         ',fem_dim_attr_Versions_b V2'||
6672                         ' where to_char(A1.cal_period_id) = '''||ta_member_dc(j)||''''||
6673                         ' and A1.attribute_id = DA1.attribute_id'||
6674                         ' and DA1.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6675                         ' and DA1.dimension_id = 1'||
6676                         ' and A1.dim_attribute_varchar_member = ''N'''||
6677                         ' and A1.version_id = V1.version_id'||
6678                         ' and V1.attribute_id = DA1.attribute_id'||
6679                         ' and V1.aw_snapshot_flag = ''N'''||
6680                         ' and V1.default_version_flag =''Y'''||
6681                         ' and A1.cal_period_id = A2.cal_period_id'||
6682                         ' and A2.date_assign_value '||
6683                         ' <> to_date('''||to_char(ta_date_assign_value(j),p_date_format_mask)||''','''||p_date_format_mask||''')'||
6684                         ' and A2.attribute_id = DA2.attribute_id'||
6685                         ' and DA2.attribute_varchar_label = ''CAL_PERIOD_START_DATE'''||
6686                         ' and DA2.dimension_id=1'||
6687                         ' and A2.version_id = V2.version_id'||
6688                         ' and V2.attribute_id = DA2.attribute_id'||
6689                         ' and V2.aw_snapshot_flag = ''N'''||
6690                         ' and V2.default_version_flag = ''Y''';
6691                         *****************************************************************/
6692 
6693                          EXECUTE IMMEDIATE x_adj_period_stmt INTO v_nonadj_period_count
6694                          USING ta_member_dc(j),ta_date_assign_value(j);
6695 
6696                         -- If not an adjustment period, then we need to check for
6697                         -- date overlap
6698                         IF v_nonadj_period_count > 0 THEN
6699                            ta_adj_period_flag(j) := 'N';
6700                            -- query to see if any records exist for the same
6701                            -- calendar/dimgrp in the offical db
6702                            -- where:
6703                            -- (new) array_start_date <= table.end_date AND
6704                            -- array_end_date >= table.start_date
6705                            -- and the existing periods are not adj periods
6706                            -- and the offending records have a diff cal_period_id
6707                            -- than the one being loaded
6708                            -- and the offending cal_periods are enabled=Y
6709                            x_overlap_sql_stmt :=
6710                            'select count(*)'||
6711                            ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
6712                            ' fem_cal_periods_b C,'||
6713                            ' fem_dimension_grps_b D,'||
6714                            ' fem_dim_attributes_b AE,'||
6715                            ' fem_dim_attr_Versions_b VE,'||
6716                            ' fem_cal_periods_attr CP,'||
6717                            ' fem_dim_attributes_b AP,'||
6718                            ' fem_dim_attr_versions_b VP'||
6719                            ' where CS.cal_period_id = C.cal_period_id'||
6720                            ' and to_char(C.cal_period_id) <> :b_mbr_dc'||
6721                            ' and C.cal_period_id = CP.cal_period_id'||
6722                            ' and C.enabled_flag = ''Y'''||
6723                            ' and CP.attribute_id = AP.attribute_id'||
6724                            ' and CP.version_id = VP.version_id'||
6725                            ' and CP.dim_attribute_varchar_member = ''N'''||
6726                            ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6727                            ' and AP.dimension_id = 1'||
6728                            ' and AP.attribute_id = VP.attribute_id'||
6729                            ' and VP.default_version_flag = ''Y'''||
6730                            ' and VP.aw_snapshot_flag = ''N'''||
6731                            ' and C.calendar_id = :b_cal_id'||
6732                            ' and C.dimension_group_id = D.dimension_group_id'||
6733                            ' and D.time_dimension_group_key = :b_dimgrp_key'||
6734                            ' and D.dimension_id = 1'||
6735                            ' and CS.attribute_id = :b_attr_id'||
6736                            ' and CS.version_id = :b_vers_id'||
6737                            ' and CE.date_assign_value'||
6738                            ' >= :b_new_start_date'||
6739                            ' and CS.cal_period_id = CE.cal_period_id'||
6740                            ' and CE.attribute_id = AE.attribute_id'||
6741                            ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
6742                            ' and AE.dimension_id = 1'||
6743                            ' and CE.version_id = VE.version_id'||
6744                            ' and VE.aw_snapshot_flag = ''N'''||
6745                            ' and VE.default_version_flag = ''Y'''||
6746                            ' and VE.attribute_id = AE.attribute_id'||
6747                            ' and CS.date_assign_value'||
6748                            ' <= :b_new_end_date';
6749 
6750 
6751                            /*************************************************
6752                            bug#5060746 comment out to use bind variables
6753 
6754                            x_overlap_sql_stmt :=
6755                            'select count(*)'||
6756                            ' from fem_cal_periods_attr CS, fem_cal_periods_attr CE,'||
6757                            ' fem_cal_periods_b C,'||
6758                            ' fem_dimension_grps_b D,'||
6759                            ' fem_dim_attributes_b AE,'||
6760                            ' fem_dim_attr_Versions_b VE,'||
6761                            ' fem_cal_periods_attr CP,'||
6762                            ' fem_dim_attributes_b AP,'||
6763                            ' fem_dim_attr_versions_b VP'||
6764                            ' where CS.cal_period_id = C.cal_period_id'||
6765                            ' and to_char(C.cal_period_id) <>'''||ta_member_dc(j)||''''||
6766                            ' and C.cal_period_id = CP.cal_period_id'||
6767                            ' and C.enabled_flag = ''Y'''||
6768                            ' and CP.attribute_id = AP.attribute_id'||
6769                            ' and CP.version_id = VP.version_id'||
6770                            ' and CP.dim_attribute_varchar_member = ''N'''||
6771                            ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6772                            ' and AP.dimension_id = 1'||
6773                            ' and AP.attribute_id = VP.attribute_id'||
6774                            ' and VP.default_version_flag = ''Y'''||
6775                            ' and VP.aw_snapshot_flag = ''N'''||
6776                            ' and C.calendar_id = '||substr(ta_member_dc(j),23,5)||
6777                            ' and C.dimension_group_id = D.dimension_group_id'||
6778                            ' and D.time_dimension_group_key = '||substr(ta_member_dc(j),28,5)||
6779                            ' and D.dimension_id = 1'||
6780                            ' and CS.attribute_id = '||ta_attribute_id(j)||
6781                            ' and CS.version_id = '||ta_version_id(j)||
6782                            ' and CE.date_assign_value'||
6783                            ' >= :b_new_start_date'||
6784                            ' and CS.cal_period_id = CE.cal_period_id'||
6785                            ' and CE.attribute_id = AE.attribute_id'||
6786                            ' and AE.attribute_varchar_label = ''CAL_PERIOD_END_DATE'''||
6787                            ' and AE.dimension_id = 1'||
6788                            ' and CE.version_id = VE.version_id'||
6789                            ' and VE.aw_snapshot_flag = ''N'''||
6790                            ' and VE.default_version_flag = ''Y'''||
6791                            ' and VE.attribute_id = AE.attribute_id'||
6792                            ' and CS.date_assign_value'||
6793                            ' <= :b_new_end_date';
6794 
6795                            **************************************************/
6796 
6797                            FEM_ENGINES_PKG.TECH_MESSAGE
6798                            (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt3'
6799                            ,x_overlap_sql_stmt);
6800 
6801                            EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count
6802                               USING ta_member_dc(j)
6803                                    ,substr(ta_member_dc(j),23,5)
6804                                    ,substr(ta_member_dc(j),28,5)
6805                                    ,ta_attribute_id(j)
6806                                    ,ta_version_id(j)
6807                                    ,ta_date_assign_value(j)
6808                                    ,ta_cal_period_end_date(j);
6809 
6810                            IF v_overlap_count > 0 THEN
6811                               ta_status(j) := 'OVERLAP_EXIST_START_DATE';
6812                               FEM_ENGINES_PKG.TECH_MESSAGE
6813                               (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_count'
6814                               ,v_overlap_count);
6815 
6816                            END IF;
6817                         /************************************************8
6818                         ELSE  -- query to see if any records exist for the same
6819                               -- calendar/dimgrp in the offical db
6820                               -- where start_date >= x and start_date <= y
6821                               -- (where x is the new start date and
6822                               --  y is the new end date)
6823                               -- and the existing periods are not adj periods
6824                               -- and the offending records have a diff cal_period_id
6825                               -- than the one being loaded
6826                               -- and the offending cal_periods are enabled=Y
6827                            x_overlap_sql_stmt :=
6828                            'select count(*)'||
6829                            ' from fem_cal_periods_attr CS'||
6830                            ',fem_cal_periods_b C'||
6831                            ',fem_dimension_grps_b D'||
6832                            ',fem_cal_periods_attr CP'||
6833                            ',fem_dim_attributes_b AP'||
6834                            ',fem_dim_attr_versions_b VP'||
6835                            ' where CS.cal_period_id = C.cal_period_id'||
6836                            ' and to_char(C.cal_period_id) <>'''||ta_member_dc(j)||''''||
6837                            ' and C.cal_period_id = CP.cal_period_id'||
6838                            ' and C.enabled_flag = ''Y'''||
6839                            ' and CP.attribute_id = AP.attribute_id'||
6840                            ' and CP.version_id = VP.version_id'||
6841                            ' and CP.dim_attribute_varchar_member = ''N'''||
6842                            ' and AP.attribute_varchar_label = ''ADJ_PERIOD_FLAG'''||
6843                            ' and AP.dimension_id = 1'||
6844                            ' and AP.attribute_id = VP.attribute_id'||
6845                            ' and VP.default_version_flag = ''Y'''||
6846                            ' and VP.aw_snapshot_flag = ''N'''||
6847                            ' and C.calendar_id = '||substr(ta_member_dc(j),23,5)||
6848                            ' and C.dimension_group_id = D.dimension_group_id'||
6849                            ' and D.time_dimension_group_key = '||substr(ta_member_dc(j),28,5)||
6850                            ' and CS.attribute_id = '||ta_attribute_id(j)||
6851                            ' and CS.version_id = '||ta_version_id(j)||
6852                            ' and to_char(CS.date_assign_value,'''||p_date_format_mask||''')'||
6853                            ' >= '''||to_char(ta_date_assign_value(j),p_date_format_mask)||''''||
6854                            ' and to_char(CS.date_assign_value,''j'')'||
6855                            ' <= '||to_char(substr(ta_member_dc(j),1,7));
6856 
6857                            FEM_ENGINES_PKG.TECH_MESSAGE
6858                            (c_log_level_1,c_block||'.'||c_proc_name||'.overlap_sql_stmt4'
6859                            ,x_overlap_sql_stmt);
6860                            EXECUTE IMMEDIATE x_overlap_sql_stmt INTO v_overlap_count;
6861 
6862                            IF v_overlap_count > 0 THEN
6863                               ta_status(j) := 'OVERLAP_EXIST_START_DATE';
6864                            END IF;
6865                         END IF; -- overlap if  */
6866                         ELSE
6867                            ta_adj_period_flag(j) := 'Y';
6868                         END IF; -- adj_period_flag count if
6869                      END IF; -- attribute is start_date
6870                      --End Special Checks for CAL Period
6871                   ----------------------------------------------------------------
6872                   EXCEPTION
6873                      WHEN e_invalid_calp_start_date THEN
6874                         ta_status(j) := 'INVALID_CAL_PERIOD_START_DATE';
6875                      WHEN e_date_string_too_long THEN
6876                         ta_status(j) := 'INVALID_DATE';
6877                      WHEN e_invalid_date THEN
6878                         ta_status(j) := 'INVALID_DATE';
6879                      WHEN e_invalid_date_format THEN
6880                         ta_status(j) := 'INVALID_DATE';
6881                      WHEN e_invalid_date_numeric THEN
6882                         ta_status(j) := 'INVALID_DATE';
6883                      WHEN e_invalid_date_between THEN
6884                         ta_status(j) := 'INVALID_DATE';
6885                      WHEN e_invalid_date_year THEN
6886                         ta_status(j) := 'INVALID_DATE';
6887                      WHEN e_invalid_date_day THEN
6888                         ta_status(j) := 'INVALID_DATE';
6889                   END; -- DATE_ASSIGN_VALUE
6890                ELSIF (ta_attr_value_column_name(j) IN
6891                   ('DIM_ATTRIBUTE_VARCHAR_MEMBER', 'DIM_ATTRIBUTE_NUMERIC_MEMBER')
6892                   AND ta_attribute_assign_value(j) IS NOT NULL
6893                   AND ta_version_id(j) IS NOT NULL) THEN
6894 
6895                   --------------------------------------------------
6896                   -- get the Value Set ID for the assigned attribute
6897                   -- 9/15/2004 RCF Modify this section so that if the
6898                   -- attr_assign_vs_dc doesn't exist for the specified dimension
6899                   -- the row fails
6900                   -- Note that the INVALID_ATTR_ASSIGN_VS status will never
6901                   -- appear, since the INVALID_DIM_ASSIGNMENT will overwrite it
6902                   -- in the case of a bad VS being specified for a member
6903                   --------------------------------------------------
6904                   IF (ta_attr_assign_vs_dc(j) IS NOT NULL) THEN
6905                      BEGIN
6906                         SELECT value_set_id
6907                         INTO ta_attr_assign_vs_id(j)
6908                         FROM fem_value_sets_b
6909                         WHERE value_set_display_code = ta_attr_assign_vs_dc(j)
6910                         AND dimension_id = ta_attribute_dimension_id(j);
6911                      EXCEPTION
6912                         WHEN no_data_found THEN
6913                            ta_status(j) := 'INVALID_ATTR_ASSIGN_VALUE_SET';
6914                      END;
6915                   END IF;
6916 
6917                   verify_attr_member (ta_attribute_varchar_label(j)
6918                                      ,p_dimension_varchar_label
6919                                      ,ta_attribute_assign_value(j)
6920                                      ,ta_attr_assign_vs_dc(j)
6921                                      ,v_attr_success
6922                                      ,v_temp_member);
6923                   IF (v_attr_success = 'N') THEN
6924                      ta_status(j) := 'INVALID_DIM_ASSIGNMENT';
6925                   ELSIF (v_attr_success = 'MISSING_ATTR_ASSIGN_VS') THEN
6926                          ta_status(j) := 'MISSING_ATTR_ASSIGN_VS';
6927                   ELSE -- DIM Assignment is good
6928                      IF (ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_VARCHAR_MEMBER') THEN
6929                         ta_dim_attr_varchar_member(j) := to_char(v_temp_member);
6930                      ELSE
6931                         ta_dim_attr_numeric_member(j) := to_number(v_temp_member);
6932                      END IF; -- Choice between VARCHAR and NUMERIC Dim members
6933                   END IF;  -- attr_success=N
6934                ELSIF (ta_version_id(j) IS NULL) THEN-- Version is NULL
6935                   ta_status(j) := 'INVALID_VERSION';
6936 
6937                ELSE -- Assignment is NULL or Assignment Column not valid
6938                   ta_status(j) := 'INVALID_ATTRIBUTE_ASSIGNMENT';
6939 
6940                END IF; -- Main IF on validating the attributes
6941                FEM_ENGINES_PKG.TECH_MESSAGE
6942                (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_status'
6943                ,ta_status(j));
6944 
6945                -----------------------------------------------------------------
6946                -- Check to see if the attribute row already exists in the _ATTR table
6947                -----------------------------------------------------------------
6948                FEM_ENGINES_PKG.TECH_MESSAGE
6949                (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_id'
6950                ,ta_attribute_id(j));
6951 
6952                FEM_ENGINES_PKG.TECH_MESSAGE
6953                (c_log_level_1,c_block||'.'||c_proc_name||'.version_id'
6954                ,ta_version_id(j));
6955 
6956                FEM_ENGINES_PKG.TECH_MESSAGE
6957                (c_log_level_1,c_block||'.'||c_proc_name||'.member display code'
6958                ,ta_member_dc(j));
6959 
6960                FEM_ENGINES_PKG.TECH_MESSAGE
6961                (c_log_level_1,c_block||'.'||c_proc_name||'.value_set display code'
6962                ,ta_value_set_dc(j));
6963 
6964                FEM_ENGINES_PKG.TECH_MESSAGE
6965                (c_log_level_1,c_block||'.'||c_proc_name||'.value_set_id'
6966                ,ta_value_set_id(j));
6967 
6968                FEM_ENGINES_PKG.TECH_MESSAGE
6969                (c_log_level_1,c_block||'.'||c_proc_name||'.member_id'
6970                ,ta_member_id(j));
6971 
6972 
6973                -- Check if the attribute assignment exists for any version
6974                IF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'Y' ) THEN
6975                   EXECUTE IMMEDIATE x_does_attr_exist_novers_stmt
6976                   INTO ta_attr_exists_novers_count(j), ta_protected_assign_flag(j)
6977                   USING ta_attribute_id(j)
6978                        ,ta_member_id(j)
6979                        ,ta_value_set_id(j);
6980                ELSIF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'N' ) THEN
6981                   IF p_member_col = p_member_dc_col THEN
6982                      EXECUTE IMMEDIATE x_does_attr_exist_novers_stmt
6983                      INTO ta_attr_exists_novers_count(j), ta_protected_assign_flag(j)
6984                      USING ta_attribute_id(j)
6985                        ,ta_member_dc(j);
6986                   ELSE
6987                      EXECUTE IMMEDIATE x_does_attr_exist_novers_stmt
6988                      INTO ta_attr_exists_novers_count(j), ta_protected_assign_flag(j)
6989                      USING ta_attribute_id(j)
6990                        ,ta_member_id(j);
6991 
6992                   END IF;
6993                ELSE
6994                   ta_attr_exists_novers_count(j) := 0;
6995                END IF; -- value_set_required
6996 
6997                -- Check if the attr assignment exists for the specific version
6998                IF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'Y' )
6999                   AND (ta_allow_mult_assign_flag(j) = 'N') THEN
7000                   EXECUTE IMMEDIATE x_does_attr_exist_stmt
7001                   INTO ta_attr_exists_count(j), ta_protected_assign_flag(j)
7002                   USING ta_attribute_id(j)
7003                        ,ta_version_id(j)
7004                        ,ta_member_id(j)
7005                        ,ta_value_set_id(j);
7006 
7007                ELSIF (ta_status(j) = 'LOAD') AND (p_value_set_required_flag = 'N' )
7008                   AND (ta_allow_mult_assign_flag(j) = 'N') THEN
7009                   IF p_member_col = p_member_dc_col THEN
7010 
7011                      EXECUTE IMMEDIATE x_does_attr_exist_stmt
7012                      INTO ta_attr_exists_count(j), ta_protected_assign_flag(j)
7013                      USING ta_attribute_id(j)
7014                           ,ta_version_id(j)
7015                           ,ta_member_dc(j);
7016                   ELSE
7017                      EXECUTE IMMEDIATE x_does_attr_exist_stmt
7018                      INTO ta_attr_exists_count(j), ta_protected_assign_flag(j)
7019                      USING ta_attribute_id(j)
7020                           ,ta_version_id(j)
7021                           ,ta_member_id(j);
7022                   END IF;
7023                ELSIF (ta_status(j) = 'LOAD')
7024                   AND (p_value_set_required_flag = 'Y')
7025                   AND (ta_allow_mult_assign_flag(j) = 'Y') THEN
7026 
7027                   build_does_multattr_exist_stmt (p_target_attr_table
7028                                  ,p_target_b_table
7029                                  ,p_member_col
7030                                  ,p_member_dc_col
7031                                  ,p_value_set_required_flag
7032                                  ,ta_attr_value_column_name(j)
7033                                  ,ta_attr_assign_vs_id(j)
7034                                  ,x_does_multattr_exist_stmt);
7035 
7036                   FEM_ENGINES_PKG.TECH_MESSAGE
7037                   (c_log_level_1,c_block||'.'||c_proc_name||'.does multattr vs exist stmt'
7038                   ,x_does_multattr_exist_stmt);
7039 
7040                    IF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7041                       AND ta_attr_assign_vs_id(j) IS NOT NULL THEN
7042 
7043                        EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7044                        INTO ta_multattr_exists_count(j)
7045                        USING ta_attribute_id(j)
7046                             ,ta_version_id(j)
7047                             ,ta_member_id(j)
7048                             ,ta_value_set_id(j)
7049                             ,ta_dim_attr_numeric_member(j)
7050                             ,ta_attr_assign_vs_id(j);
7051 
7052                    ELSIF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7053                       AND ta_attr_assign_vs_id(j) IS NULL THEN
7054 
7055                        EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7056                        INTO ta_multattr_exists_count(j)
7057                        USING ta_attribute_id(j)
7058                             ,ta_version_id(j)
7059                             ,ta_member_id(j)
7060                             ,ta_value_set_id(j)
7061                             ,ta_dim_attr_numeric_member(j);
7062 
7063                    ELSE
7064                        EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7065                        INTO ta_multattr_exists_count(j)
7066                        USING ta_attribute_id(j)
7067                             ,ta_version_id(j)
7068                             ,ta_member_id(j)
7069                             ,ta_value_set_id(j)
7070                             ,ta_dim_attr_varchar_member(j);
7071                    END IF;
7072 
7073                ELSIF (ta_status(j) = 'LOAD')
7074                   AND (p_value_set_required_flag = 'N')
7075                   AND (ta_allow_mult_assign_flag(j) = 'Y') THEN
7076 
7077                   build_does_multattr_exist_stmt (p_target_attr_table
7078                                  ,p_target_b_table
7079                                  ,p_member_col
7080                                  ,p_member_dc_col
7081                                  ,p_value_set_required_flag
7082                                  ,ta_attr_value_column_name(j)
7083                                  ,ta_attr_assign_vs_id(j)
7084                                  ,x_does_multattr_exist_stmt);
7085 
7086                   FEM_ENGINES_PKG.TECH_MESSAGE
7087                   (c_log_level_1,c_block||'.'||c_proc_name||'.does multattr exist stmt'
7088                   ,x_does_multattr_exist_stmt);
7089 
7090                    IF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7091                       AND ta_attr_assign_vs_id(j) IS NOT NULL THEN
7092 
7093                        EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7094                        INTO ta_multattr_exists_count(j)
7095                        USING ta_attribute_id(j)
7096                             ,ta_version_id(j)
7097                             ,ta_member_id(j)
7098                             ,ta_dim_attr_numeric_member(j)
7099                             ,ta_attr_assign_vs_id(j);
7100 
7101                    ELSIF ta_attr_value_column_name(j) = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
7102                       AND ta_attr_assign_vs_id(j) IS NULL THEN
7103 
7104                        EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7105                        INTO ta_multattr_exists_count(j)
7106                        USING ta_attribute_id(j)
7107                             ,ta_version_id(j)
7108                             ,ta_member_id(j)
7109                             ,ta_dim_attr_numeric_member(j);
7110 
7111                    ELSE
7112                        EXECUTE IMMEDIATE x_does_multattr_exist_stmt
7113                        INTO ta_multattr_exists_count(j)
7114                        USING ta_attribute_id(j)
7115                             ,ta_version_id(j)
7116                             ,ta_member_id(j)
7117                             ,ta_dim_attr_varchar_member(j);
7118                    END IF;
7119 
7120 
7121                ELSE
7122                   ta_attr_exists_count(j) := 0;
7123                   ta_multattr_exists_count(j) := 0;
7124                END IF; -- value_set_required
7125                FEM_ENGINES_PKG.TECH_MESSAGE
7126                (c_log_level_1,c_block||'.'||c_proc_name||'.does_attr_exist'
7127                ,null);
7128 
7129               ---------------------------------------------------
7130               -- Bug#5024575
7131               -- 7/6/2006 For Multi-assignment attributes, we can't update,
7132               -- we can only insert.  Because of this, when we encounter
7133               -- an assignment that already exists for the specific
7134               -- dim_attribute_numeric_member/varchar_member/vs combination,
7135               -- we update the STATUS as an error.
7136               --
7137               -- In the future, if users decide they don't want this to be
7138               -- an error, we can make a special delete to remove the row
7139               -- from the interface table.  The important thing is that we
7140               -- cannot insert (since the key for that assignment already exists)
7141               ---------------------------------------------------
7142                IF ta_status(j) = 'LOAD' THEN
7143                   IF (ta_attr_exists_count(j) = 0 AND ta_attr_exists_novers_count(j) > 0
7144                       AND ta_allow_mult_assign_flag(j) = 'N') THEN
7145                      ta_status(j) := 'MULT_VERSION_NOT_ALLOWED';
7146                   ELSIF ta_allow_mult_assign_flag(j) = 'N'
7147                      AND ta_protected_assign_flag(j) = 'Y' THEN
7148                      ta_status(j) := 'PROTECTED_ATTR_ASSIGN';
7149                   ELSIF ta_allow_mult_assign_flag(j) = 'Y'
7150                      AND ta_multattr_exists_count(j) >0 THEN
7151                       ta_status(j) := 'DUPLICATE_MULTI_ASSIGN';
7152                   END IF;
7153                END IF;
7154 
7155               ----------------------------------------------------------------------
7156               --Bug#3925655  For assignment_is_read_only_flag='Y' attributes,
7157               -- we need to identify if the assignment coming from the interface
7158               -- table is identical to the existing assignment.  If it is, we want
7159               -- to go ahead and let it update.
7160               -- If it is not identical, we want to mark the row with an ERROR status
7161               ----------------------------------------------------------------------
7162                IF (ta_status(j) = 'LOAD') AND (ta_read_only_flag(j) = 'Y') THEN
7163                   FEM_ENGINES_PKG.TECH_MESSAGE
7164                   (c_log_level_1,c_block||'.'||c_proc_name||'.identical attr select stmt'
7165                   ,x_identical_attr_select_stmt);
7166 
7167                   FEM_ENGINES_PKG.TECH_MESSAGE
7168                   (c_log_level_1,c_block||'.'||c_proc_name||'.dim_attr_numeric'
7169                   ,ta_dim_attr_numeric_member(j));
7170                   FEM_ENGINES_PKG.TECH_MESSAGE
7171                   (c_log_level_1,c_block||'.'||c_proc_name||'.attr_assign_vs'
7172                   ,ta_attr_assign_vs_id(j));
7173                   FEM_ENGINES_PKG.TECH_MESSAGE
7174                   (c_log_level_1,c_block||'.'||c_proc_name||'.dim_attr_varchar'
7175                   ,ta_dim_attr_varchar_member(j));
7176                   FEM_ENGINES_PKG.TECH_MESSAGE
7177                   (c_log_level_1,c_block||'.'||c_proc_name||'.number_assign'
7178                   ,ta_number_assign_value(j));
7179                   FEM_ENGINES_PKG.TECH_MESSAGE
7180                   (c_log_level_1,c_block||'.'||c_proc_name||'.varchar_assign'
7181                   ,ta_varchar_assign_value(j));
7182                   FEM_ENGINES_PKG.TECH_MESSAGE
7183                   (c_log_level_1,c_block||'.'||c_proc_name||'.date_assign'
7184                   ,to_char(ta_temp_date_assign_value(j),'YYYY/MM/DD'));
7185 
7186                   -- we use a temp variable to handle the case where
7187                   -- we have set the date_assign_value to 2499/12/31
7188 
7189                   IF (p_value_set_required_flag = 'Y' ) THEN
7190                      EXECUTE IMMEDIATE x_identical_attr_select_stmt
7191                      INTO ta_attr_identical_count(j)
7192                         USING ta_attribute_id(j)
7193                        ,ta_version_id(j)
7194                        ,ta_value_set_dc(j)
7195                        ,ta_member_dc(j)
7196                        ,ta_dim_attr_numeric_member(j)
7197                        ,ta_dim_attr_numeric_member(j)
7198                        ,ta_dim_attr_numeric_member(j)
7199                        ,ta_attr_assign_vs_id(j)
7200                        ,ta_attr_assign_vs_id(j)
7201                        ,ta_attr_assign_vs_id(j)
7202                        ,ta_dim_attr_varchar_member(j)
7203                        ,ta_dim_attr_varchar_member(j)
7204                        ,ta_dim_attr_varchar_member(j)
7205                        ,ta_number_assign_value(j)
7206                        ,ta_number_assign_value(j)
7207                        ,ta_number_assign_value(j)
7208                        ,ta_varchar_assign_value(j)
7209                        ,ta_varchar_assign_value(j)
7210                        ,ta_varchar_assign_value(j)
7211                        ,ta_temp_date_assign_value(j)
7212                        ,ta_temp_date_assign_value(j)
7213                        ,ta_temp_date_assign_value(j);
7214 
7215                   ELSIF (p_value_set_required_flag = 'N' ) THEN
7216                      EXECUTE IMMEDIATE x_identical_attr_select_stmt
7217                      INTO ta_attr_identical_count(j)
7218                      USING ta_attribute_id(j)
7219                        ,ta_version_id(j)
7220                        ,ta_member_dc(j)
7221                        ,ta_dim_attr_numeric_member(j)
7222                        ,ta_dim_attr_numeric_member(j)
7223                        ,ta_dim_attr_numeric_member(j)
7224                        ,ta_attr_assign_vs_id(j)
7225                        ,ta_attr_assign_vs_id(j)
7226                        ,ta_attr_assign_vs_id(j)
7227                        ,ta_dim_attr_varchar_member(j)
7228                        ,ta_dim_attr_varchar_member(j)
7229                        ,ta_dim_attr_varchar_member(j)
7230                        ,ta_number_assign_value(j)
7231                        ,ta_number_assign_value(j)
7232                        ,ta_number_assign_value(j)
7233                        ,ta_varchar_assign_value(j)
7234                        ,ta_varchar_assign_value(j)
7235                        ,ta_varchar_assign_value(j)
7236                        ,ta_temp_date_assign_value(j)
7237                        ,ta_temp_date_assign_value(j)
7238                        ,ta_temp_date_assign_value(j);
7239                   END IF; -- value_set_required
7240 
7241                   FEM_ENGINES_PKG.TECH_MESSAGE
7242                   (c_log_level_1,c_block||'.'||c_proc_name||'.identical_count'
7243                   ,ta_attr_identical_count(j));
7244 
7245                   IF ta_attr_identical_count(j) = 0 THEN
7246                      ta_status(j) := 'READ_ONLY_ATTRIBUTE';
7247                   END IF;
7248                END IF;  -- read_only_flag validation
7249             ------------------------------------------------------------------
7250             ELSIF  ta_member_read_only_flag(j) = 'Y'
7251                     AND ta_status(j) = 'LOAD' THEN
7252                BEGIN
7253                   ta_status(j) := 'MEMBER_IS_READ_ONLY';
7254                   ta_attr_exists_count(j) := 1;
7255                END;
7256             END IF;  -- Member_read_only_flag = 'N'
7257 
7258 
7259             -- Count the error rows
7260             IF ta_status(j) <> 'LOAD' THEN
7261                v_temp_rows_rejected := v_temp_rows_rejected + 1;
7262             END IF;
7263 
7264             FEM_ENGINES_PKG.TECH_MESSAGE
7265             (c_log_level_1,c_block||'.'||c_proc_name||'.v_temp_rows_rejected'
7266             ,v_temp_rows_rejected);
7267 
7268          END LOOP; -- attr_validations
7269          FEM_ENGINES_PKG.TECH_MESSAGE
7270          (c_log_level_1,c_block||'.'||c_proc_name||'.attr_validation'
7271          ,'end');
7272 
7273       /*********************************************************
7274       Commented Out per bug#4030717
7275       ---------------------------------------------------------------------
7276       -- Overlap Date checks
7277       -- we loop over the entire attribute array one final time
7278       -- looking for start/end date ranges that conflict
7279       ---------------------------------------------------------------------
7280       IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
7281          v_attr_count := 1;
7282          WHILE v_attr_count <= v_attr_last_row
7283          LOOP
7284             FEM_ENGINES_PKG.TECH_MESSAGE
7285             (c_log_level_1,c_block||'.'||c_proc_name||'.attr_varchar_label'
7286             ,ta_attribute_varchar_label(v_attr_count));
7287 
7288             FEM_ENGINES_PKG.TECH_MESSAGE
7289             (c_log_level_1,c_block||'.'||c_proc_name||'.status'
7290             ,ta_status(v_attr_count));
7291 
7292             FEM_ENGINES_PKG.TECH_MESSAGE
7293             (c_log_level_1,c_block||'.'||c_proc_name||'.adj_period_flag'
7294             ,ta_adj_period_flag(v_attr_count));
7295 
7296             v_attr_subcount := v_attr_count + 1;  -- we always check 1 lower than
7297                                                   -- current position
7298             IF ta_attribute_varchar_label(v_attr_count) = 'CAL_PERIOD_START_DATE' AND
7299               ta_status(v_attr_count) = 'LOAD' AND
7300               ta_adj_period_flag(v_attr_count) = 'N' THEN
7301                WHILE v_attr_subcount <= v_attr_last_row AND
7302                   ta_status(v_attr_count) = 'LOAD' LOOP
7303                   IF ta_adj_period_flag(v_attr_subcount) = 'N'
7304                      AND ta_attribute_varchar_label(v_attr_subcount) = 'CAL_PERIOD_START_DATE'
7305                      AND ((ta_date_assign_value(v_attr_subcount) <=
7306                      ta_date_assign_value(v_attr_count)
7307                      AND ta_cal_period_end_date(v_attr_subcount) >=
7308                         ta_date_assign_value(v_attr_count))
7309                      OR (ta_date_assign_value(v_attr_subcount) >=
7310                         ta_date_assign_value(v_attr_count)
7311                      AND ta_date_assign_value(v_attr_subcount) <=
7312                         ta_cal_period_end_date(v_attr_count)))
7313                   THEN
7314                      ta_status(v_attr_count) := 'OVERLAP_START_DATE_IN_LOAD';
7315                      ta_status(v_attr_subcount) := 'OVERLAP_START_DATE_IN_LOAD';
7316                      v_temp_rows_rejected := v_temp_rows_rejected + 2;
7317                   END IF;
7318                   v_attr_subcount := v_attr_subcount + 1;
7319                END LOOP;
7320             END IF; -- label = 'CAL_PERIOD_START_DATE' and status = 'LOAD'
7321          v_attr_count := v_attr_count + 1;
7322          END LOOP;
7323       END IF;  -- overlap check for CAL_PERIOD
7324       ******************************************************************/
7325 
7326          -----------------------------------------------------------------
7327          -- Update existing ATTR rows
7328          -- Note:  Only attributes where "allow_multiple_assign_flag" = 'N'
7329          -- are updated.  For many to many attributes, only inserts are performed.
7330          -- Also - only attributes marked with "use_interim_table_flag = 'N' are
7331          -- updated in this step.
7332          -- Attributes with use_interim_table_flag = 'Y' are put into an interim
7333          -- table for further processing
7334          -----------------------------------------------------------------
7335          IF (p_value_set_required_flag = 'Y') THEN
7336 
7337             FORALL j IN 1..v_attr_last_row
7338                EXECUTE IMMEDIATE x_attr_update_stmt
7339                USING ta_dim_attr_numeric_member(j)
7340                     ,ta_attr_assign_vs_id(j)
7341                     ,ta_dim_attr_varchar_member(j)
7342                     ,ta_number_assign_value(j)
7343                     ,ta_varchar_assign_value(j)
7344                     ,ta_temp_date_assign_value(j)
7345                     ,gv_apps_user_id
7346                     ,gv_login_id
7347                     ,ta_member_id(j)
7348                     ,ta_value_set_id(j)
7349                     ,ta_attribute_id(j)
7350                     ,ta_version_id(j)
7351                     ,ta_allow_mult_assign_flag(j)
7352                     ,ta_attr_exists_count(j)
7353                     ,ta_status(j);
7354          ELSE
7355             IF p_member_col = p_member_dc_col THEN
7356                FORALL j IN 1..v_attr_last_row
7357                   EXECUTE IMMEDIATE x_attr_update_stmt
7358                   USING ta_dim_attr_numeric_member(j)
7359                        ,ta_attr_assign_vs_id(j)
7360                        ,ta_dim_attr_varchar_member(j)
7361                        ,ta_number_assign_value(j)
7362                        ,ta_varchar_assign_value(j)
7363                        ,ta_temp_date_assign_value(j)
7364                        ,gv_apps_user_id
7365                        ,gv_login_id
7366                        ,ta_member_dc(j)
7367                        ,ta_attribute_id(j)
7368                        ,ta_version_id(j)
7369                        ,ta_allow_mult_assign_flag(j)
7370                        ,ta_attr_exists_count(j)
7371                        ,ta_status(j)
7372                        ,ta_use_interim_table_flag(j);
7373             ELSE
7374                FORALL j IN 1..v_attr_last_row
7375                   EXECUTE IMMEDIATE x_attr_update_stmt
7376                   USING ta_dim_attr_numeric_member(j)
7377                        ,ta_attr_assign_vs_id(j)
7378                        ,ta_dim_attr_varchar_member(j)
7379                        ,ta_number_assign_value(j)
7380                        ,ta_varchar_assign_value(j)
7381                        ,ta_temp_date_assign_value(j)
7382                        ,gv_apps_user_id
7383                        ,gv_login_id
7384                        ,ta_member_id(j)
7385                        ,ta_attribute_id(j)
7386                        ,ta_version_id(j)
7387                        ,ta_allow_mult_assign_flag(j)
7388                        ,ta_attr_exists_count(j)
7389                        ,ta_status(j)
7390                        ,ta_use_interim_table_flag(j);
7391 
7392                END IF;
7393          END IF;
7394 
7395          -- insert rows into the INTERIM tables
7396          -- for CAL_PERIOD loads for date overlap
7397          -- checks
7398          IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
7399             -- Insert a row into the interim table for each
7400             -- Calendar Period member that has an assignment
7401             -- for the CALENDAR_PERIOD_START_DATE attribute
7402             -- in the array (such rows have been marked with
7403             -- use_interim_table_flag = 'Y'
7404             FORALL j IN 1 .. v_attr_last_row
7405                EXECUTE IMMEDIATE x_calp_interim_stmt
7406                USING ta_cal_period_end_date(j)
7407                ,ta_cal_period_number(j)
7408                ,ta_calendar_dc(j)
7409                ,ta_dimension_group_dc(j)
7410                ,ta_date_assign_value(j)
7411                ,ta_member_dc(j)
7412                ,ta_dimension_group_id(j)
7413                ,ta_calendar_id(j)
7414                ,'' -- this is cal period name
7415                ,'' -- this is cal period desc
7416                ,ta_adj_period_flag(j)
7417                ,ta_use_interim_table_flag(j)
7418                ,ta_status(j);
7419 
7420              -- insert a row into the CALP_ATTR Interim table for each
7421              -- assignment row where the attribute = CALENDAR_PERIOD_START_DATE
7422              -- (such rows have been marked with use_interim_table_flag = 'Y')
7423              FORALL j IN 1..v_attr_last_row
7424                EXECUTE IMMEDIATE x_calp_attr_interim_stmt
7425                USING ta_member_dc(j)
7426                     ,ta_attribute_id(j)
7427                     ,ta_version_id(j)
7428                     ,'' --dim_attr_numeric_member
7429                     ,'' --attr_assign_vs_id
7430                     ,'' --dim_attr_varchar_member(j)
7431                     ,'' --number_assign_value
7432                     ,'' -- varchar_assign_value
7433                     ,ta_date_assign_value(j)
7434                     ,ta_use_interim_table_flag(j)
7435                     ,ta_status(j);
7436 
7437          END IF;
7438 
7439          ----------------------------------------------------------------
7440          -- Delete records that successfully updated
7441          ----------------------------------------------------------------
7442          FEM_ENGINES_PKG.TECH_MESSAGE
7443          (c_log_level_1,c_block||'.'||c_proc_name||'.prior_to_special_delete'
7444          ,null);
7445 
7446          FORALL j IN 1..v_attr_last_row
7447              EXECUTE IMMEDIATE x_special_delete_attr_stmt
7448              USING ta_rowid(j)
7449                   ,ta_allow_mult_assign_flag(j)
7450                   ,ta_attr_exists_count(j)
7451                   ,ta_status(j)
7452                   ,ta_use_interim_table_flag(j);
7453 
7454          -----------------------------------------------------------------
7455          -- Copy ATTR Collection for good members in prep for insert later
7456          -- This final collection only includes multi-assign attributes
7457          -- (where it doesn't matter whether or not an assignment exists
7458          --  for any version or for the specific version being loaded)
7459          -- and non-multi-assign attributes where assignment rows do not
7460          -- exist for either the specific version being loaded, or any other
7461          -- version
7462          -- NOTE:  By definition, this insert collection does NOT include
7463          --        the CALENDAR_PERIOD_START_DATE attribute rows, since
7464          --        that attribute is non-multi assign.  This means that
7465          --        we don't have to worry about checking the use_interim_table_flag='Y'
7466          --        condition at this time.  In the future, if additional attributes
7467          --        appear that require an Interim table for processing, we can
7468          --        modify this insert to include recognition of that flag
7469          -----------------------------------------------------------------
7470          v_attr_last_row := ta_attribute_id.LAST;
7471          v_attr_count := 1;
7472 
7473          FEM_ENGINES_PKG.TECH_MESSAGE
7474          (c_log_level_1,c_block||'.'||c_proc_name||'.attr_final_count'
7475          ,v_attr_final_count);
7476          FEM_ENGINES_PKG.TECH_MESSAGE
7477          (c_log_level_1,c_block||'.'||c_proc_name||'.attr_count'
7478          ,v_attr_count);
7479          FEM_ENGINES_PKG.TECH_MESSAGE
7480          (c_log_level_1,c_block||'.'||c_proc_name||'.attr_last_row'
7481          ,v_attr_last_row);
7482 
7483 
7484          WHILE v_attr_count <= v_attr_last_row
7485          LOOP
7486             IF (  (ta_status(v_attr_count) = 'LOAD'
7487                    AND ta_attr_exists_count(v_attr_count) >= 0
7488                    AND ta_attr_exists_novers_count(v_attr_count) > 0
7489                    AND ta_allow_mult_assign_flag(v_attr_count) = 'Y') OR
7490                    (ta_status(v_attr_count) = 'LOAD'
7491                    AND ta_attr_exists_count(v_attr_count) = 0
7492                    AND ta_attr_exists_novers_count(v_attr_count) = 0)    ) THEN
7493 
7494                v_attr_final_count := v_attr_final_count + 1;
7495 
7496                tfa_rowid(v_attr_final_count) := ta_rowid(v_attr_count);
7497                tfa_attribute_id(v_attr_final_count) := ta_attribute_id(v_attr_count);
7498                tfa_member_dc(v_attr_final_count) := ta_member_dc(v_attr_count);
7499                tfa_value_set_dc(v_attr_final_count) := ta_value_set_dc(v_attr_count);
7500                tfa_dim_attr_numeric_member(v_attr_final_count) := ta_dim_attr_numeric_member(v_attr_count);
7501                tfa_dim_attr_varchar_member(v_attr_final_count) := ta_dim_attr_varchar_member(v_attr_count);
7502                tfa_number_assign_value(v_attr_final_count) := ta_number_assign_value(v_attr_count);
7503                tfa_varchar_assign_value(v_attr_final_count) := ta_varchar_assign_value(v_attr_count);
7504                tfa_date_assign_value(v_attr_final_count) := ta_temp_date_assign_value(v_attr_count);
7505                tfa_version_id(v_attr_final_count) := ta_version_id(v_attr_count);
7506                tfa_attr_assign_vs_id(v_attr_final_count) := ta_attr_assign_vs_id(v_attr_count);
7507                tfa_status(v_attr_final_count) := ta_status(v_attr_count);
7508 
7509             END IF; -- Copy ATTR for good members
7510             v_attr_count    := v_attr_count + 1;
7511          END LOOP; -- WHILE loop
7512 
7513          FEM_ENGINES_PKG.TECH_MESSAGE
7514          (c_log_level_1,c_block||'.'||c_proc_name||'.after_the_copy'
7515          ,null);
7516 
7517          FEM_ENGINES_PKG.TECH_MESSAGE
7518          (c_log_level_1,c_block||'.'||c_proc_name||'.attribute_final_count'
7519          ,v_attr_final_count);
7520 
7521          ----------------------------------------------------------
7522          -- Update Status of ATTR Collection for failed records
7523          ----------------------------------------------------------
7524          FORALL j IN 1..v_attr_last_row
7525             EXECUTE IMMEDIATE x_update_attr_status_stmt
7526             USING ta_status(j)
7527                  ,ta_rowid(j)
7528                  ,ta_status(j);
7529 
7530          FEM_ENGINES_PKG.TECH_MESSAGE
7531          (c_log_level_1,c_block||'.'||c_proc_name||'.after_status_update'
7532          ,null);
7533 
7534          ---------------------------------------------------------
7535          -- Insert attributes for the good dimension members
7536          ---------------------------------------------------------
7537          IF (p_value_set_required_flag = 'Y') THEN
7538              FORALL j IN 1..v_attr_final_count
7539                EXECUTE IMMEDIATE x_insert_attr_stmt
7540                USING tfa_attribute_id(j)
7541                     ,tfa_version_id(j)
7542                     ,tfa_dim_attr_numeric_member(j)
7543                     ,tfa_attr_assign_vs_id(j)
7544                     ,tfa_dim_attr_varchar_member(j)
7545                     ,tfa_number_assign_value(j)
7546                     ,tfa_varchar_assign_value(j)
7547                     ,tfa_date_assign_value(j)
7548                     ,gv_apps_user_id
7549                     ,gv_apps_user_id
7550                     ,tfa_member_dc(j)
7551                     ,tfa_value_set_dc(j)
7552                     ,tfa_status(j);
7553          ELSE
7554             FORALL j IN 1..v_attr_final_count
7555                EXECUTE IMMEDIATE x_insert_attr_stmt
7556                USING tfa_attribute_id(j)
7557                     ,tfa_version_id(j)
7558                     ,tfa_dim_attr_numeric_member(j)
7559                     ,tfa_attr_assign_vs_id(j)
7560                     ,tfa_dim_attr_varchar_member(j)
7561                     ,tfa_number_assign_value(j)
7562                     ,tfa_varchar_assign_value(j)
7563                     ,tfa_date_assign_value(j)
7564                     ,gv_apps_user_id
7565                     ,gv_apps_user_id
7566                     ,tfa_member_dc(j)
7567                     ,tfa_status(j);
7568          END IF; -- v_value_set_required = 'Y'
7569 
7570          ----------------------------------------------------------
7571          -- Count the loaded rows and error rows
7572          ----------------------------------------------------------
7573          v_rows_rejected := v_rows_rejected + v_temp_rows_rejected;
7574          --x_rows_loaded   := x_rows_loaded + (v_attr_last_row - v_temp_rows_rejected);
7575          v_temp_rows_rejected := 0;  -- initialize for next pass of the loop
7576 
7577          FEM_ENGINES_PKG.TECH_MESSAGE
7578          (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected'
7579          ,v_rows_rejected);
7580 
7581          ----------------------------------------------------------------
7582          -- Delete Loaded records and clear Collections for Next Bulk Fetch
7583          ----------------------------------------------------------------
7584          FORALL j IN 1..v_attr_final_count
7585              EXECUTE IMMEDIATE x_delete_attr_stmt
7586              USING tfa_rowid(j)
7587                   ,tfa_status(j)
7588                   ,ta_use_interim_table_flag(j);
7589 
7590          tfa_rowid.DELETE;
7591          tfa_attribute_id.DELETE;
7592          tfa_member_dc.DELETE;
7593          tfa_value_set_dc.DELETE;
7594          tfa_dim_attr_numeric_member.DELETE;
7595          tfa_dim_attr_varchar_member.DELETE;
7596          tfa_number_assign_value.DELETE;
7597          tfa_varchar_assign_value.DELETE;
7598          tfa_date_assign_value.DELETE;
7599          tfa_version_id.DELETE;
7600          tfa_attr_assign_vs_id.DELETE;
7601          tfa_status.DELETE;
7602 
7603          ta_rowid.DELETE;
7604          ta_member_read_only_flag.DELETE;
7605          ta_attribute_id.DELETE;
7606          ta_attribute_varchar_label.DELETE;
7607          ta_attribute_dimension_id.DELETE;
7608          ta_attr_value_column_name.DELETE;
7609          ta_attribute_data_type_code.DELETE;
7610          ta_attribute_required_flag.DELETE;
7611          ta_read_only_flag.DELETE;
7612          ta_allow_mult_assign_flag.DELETE;
7613          ta_member_dc.DELETE;
7614          ta_value_set_dc.DELETE;
7615          ta_attribute_assign_value.DELETE;
7616          ta_dim_attr_numeric_member.DELETE;
7617          ta_dim_attr_varchar_member.DELETE;
7618          ta_number_assign_value.DELETE;
7619          ta_varchar_assign_value.DELETE;
7620          ta_date_assign_value.DELETE;
7621          ta_temp_date_assign_value.DELETE;
7622          ta_version_display_code.DELETE;
7623          ta_version_id.DELETE;
7624          ta_language.DELETE;
7625          ta_attr_assign_vs_dc.DELETE;
7626          ta_attr_assign_vs_id.DELETE;
7627          ta_status.DELETE;
7628          ta_attr_exists_count.DELETE;
7629          ta_multattr_exists_count.DELETE;
7630          ta_attr_identical_count.DELETE;
7631          ta_cal_period_end_date.DELETE;
7632          ta_adj_period_flag.DELETE;
7633          ta_use_interim_table_flag.DELETE;
7634          ta_cal_period_number.DELETE;
7635          ta_calendar_dc.DELETE;
7636          ta_calendar_id.DELETE;
7637          ta_protected_assign_flag.DELETE;
7638          ta_dimension_group_dc.DELETE;
7639          ta_dimension_group_id.DELETE;
7640          ta_calpattr_cal_dc.DELETE;
7641          ta_calpattr_dimgrp_dc.DELETE;
7642          ta_calpattr_end_date.DELETE;
7643          ta_calpattr_period_num.DELETE;
7644          ta_member_id.DELETE;
7645          ta_value_set_id.DELETE;
7646 
7647 
7648 
7649       COMMIT;
7650       END LOOP; -- attribute loop
7651 
7652    FEM_Multi_Proc_Pkg.Post_Data_Slice(
7653      p_req_id => p_master_request_id,
7654      p_slc_id => v_slc_id,
7655      p_status => v_mp_status,
7656      p_message => v_mp_message,
7657      p_rows_processed => 0,
7658      p_rows_loaded => 0,
7659      p_rows_rejected => v_rows_rejected);
7660 
7661    END LOOP; -- get_data_slice
7662    IF cv_get_attr_rows%ISOPEN THEN
7663       CLOSE cv_get_attr_rows;
7664    END IF;
7665    --x_rows_rejected := v_rows_rejected;
7666 
7667    FEM_ENGINES_PKG.TECH_MESSAGE
7668     (c_log_level_2,c_block||'.'||c_proc_name||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
7669 
7670    EXCEPTION
7671       WHEN OTHERS THEN
7672          IF cv_get_attr_rows%ISOPEN THEN
7673             CLOSE cv_get_attr_rows;
7674          END IF;
7675 
7676          --x_status:= 2;
7677          --x_message := 'COMPLETE:ERROR';
7678 
7679          gv_prg_msg := sqlerrm;
7680          gv_callstack := dbms_utility.format_call_stack;
7681 
7682          FEM_ENGINES_PKG.TECH_MESSAGE
7683           (p_severity => c_log_level_6
7684           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
7685           ,p_msg_text => gv_prg_msg);
7686 
7687          FEM_ENGINES_PKG.TECH_MESSAGE
7688           (p_severity => c_log_level_6
7689           ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
7690           ,p_msg_text => gv_callstack);
7691 
7692          FEM_ENGINES_PKG.USER_MESSAGE
7693           (p_app_name => c_fem
7694           ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
7695           ,P_TOKEN1 => 'ERR_MSG'
7696           ,P_VALUE1 => gv_prg_msg);
7697 
7698 
7699        --  FEM_ENGINES_PKG.USER_MESSAGE
7700        --   (p_app_name => c_fem
7701        --   ,p_msg_text => gv_prg_msg);
7702 
7703          RAISE e_main_terminate;
7704 
7705 
7706 END Attr_Assign_Update;
7707 
7708 /*===========================================================================+
7709  | PROCEDURE
7710  |              Src_Sys_select_stmt
7711  |
7712  | DESCRIPTION
7713  |    Identifies the Source System Codes for the load
7714  |    specifically, for the purposes of updating FEM_DIM_LOAD_STATUS
7715  |    after the load is complete
7716  | SCOPE - PRIVATE
7717  |
7718  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7719  |
7720  | ARGUMENTS  : IN:
7721  |
7722  |
7723  |              OUT:
7724  |
7725  |              IN/ OUT:
7726  |
7727  | RETURNS    : NONE
7728  |
7729  | NOTES
7730  |
7731  |
7732  | MODIFICATION HISTORY
7733  |    Rob Flippo   8-MAR-04  Created
7734  |    Rob Flippo   31-JAN-05 Added where condition on dimension_varchar_label
7735  |                           for dimensions that use the shared ATTR_T table
7736  |
7737  +===========================================================================*/
7738 
7739    procedure build_src_sys_select_stmt (p_dimension_varchar_label IN VARCHAR2
7740                                        ,p_source_attr_table IN VARCHAR2
7741                                        ,p_shared_dimension_flag IN VARCHAR2
7742                                        ,x_src_sys_select_stmt OUT NOCOPY VARCHAR2)
7743    IS
7744 
7745       v_dim_label_where_cond  VARCHAR2(1000);
7746 
7747    BEGIN
7748       IF p_shared_dimension_flag = 'Y' THEN
7749          v_dim_label_where_cond  :=
7750             ' AND dimension_varchar_label = '''||p_dimension_varchar_label||'''';
7751       ELSE
7752          v_dim_label_where_cond := '';
7753       END IF;
7754 
7755 
7756       x_src_sys_select_stmt := 'SELECT DISTINCT(attribute_assign_value)'||
7757                                ' FROM '||p_source_attr_table||
7758                                ' WHERE attribute_varchar_label = ''SOURCE_SYSTEM_CODE'''||
7759                                v_dim_label_where_cond;
7760 
7761    END build_src_sys_select_stmt;
7762 
7763 
7764 /*===========================================================================+
7765  | PROCEDURE
7766  |              LOAD_DIM_GROUPS
7767  |
7768  | DESCRIPTION
7769  |                 Creates new and updates existing Dimension Groups from the
7770  |                 interface tables
7771  |
7772  | SCOPE - PUBLIC
7773  |
7774  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7775  |
7776  | ARGUMENTS  : IN:
7777  |
7778  |
7779  |              OUT:
7780  |
7781  |
7782  |
7783  |              IN/ OUT:
7784  |
7785  | RETURNS    : NONE
7786  |
7787  | NOTES
7788  |         The Dimension Group Loader has 5 main categories of records for loading.  These are:
7789  |         1)  Bad New Groups
7790  |         2)  New Groups
7791  |         3)  Existing Groups for name/desc update
7792  |         4)  Remaining Groups for base table update
7793  |         5)  Groups that exist but for a different Dimension_ID
7794  |
7795  |         The records that belong in each of the above categories are described
7796  |         in detail below in the Introduction to each section.
7797  |
7798  |         For each step, the following sub-steps are involved:
7799  |            a)  BULK Collect members for the category
7800  |            b)  Validate (if necessary)
7801  |            c)  Update _B_T or _TL_T table for invalid records
7802  |            d)  Update/insert FEM with the new record (or new name/description)
7803  |            e)  Delete records from _B_T or _TL_T tables where appropriate
7804  |
7805  |
7806  | MODIFICATION HISTORY
7807  |    Rob Flippo   10-NOV-03  Created
7808  |
7809  +===========================================================================*/
7810 
7811 
7812 
7813 
7814 /*===========================================================================+
7815  | PROCEDURE
7816  |              get_dimension_info
7817  |
7818  | DESCRIPTION
7819  |                 Validates the inputs and obtains object and column names
7820  |                 for the dimension
7821  |
7822  | SCOPE - PRIVATE
7823  |
7824  | NOTES
7825  |
7826  |
7827  |
7828  |
7829  | MODIFICATION HISTORY
7830  |    Rob Flippo   21-OCT-03  Created
7831  |    Rob Flippo   12-JAN-05  Bug#4030756 Retieve interface table names
7832  |                            from fem_xdim_dimensions metadata rather than
7833  |                            rely on naming convention
7834  |    Rob Flippo   16-MAR-05  Bug#4244082 properly identify dimensions that have
7835  |                            dimension_group_id on their tables
7836  |                            Previously, the hier_dimension_flag designated
7837  |                            if the dim had a HIER table or not.  Now it
7838  |                            designates that the dim uses dimension_groups.
7839  |                            -- p_simple_dimension_flag now means no attributes
7840  |                               (as opposed to no hierarchies and no attributes)
7841  |                               so it will not necessarily match what is in the table
7842  +===========================================================================*/
7843 
7844 procedure get_dimension_info (p_dimension_varchar_label IN VARCHAR2
7845                              ,x_dimension_id OUT NOCOPY NUMBER
7846                              ,x_target_b_table OUT NOCOPY VARCHAR2
7847                              ,x_target_tl_table OUT NOCOPY VARCHAR2
7848                              ,x_target_attr_table OUT NOCOPY VARCHAR2
7849                              ,x_source_b_table OUT NOCOPY VARCHAR2
7850                              ,x_source_tl_table OUT NOCOPY VARCHAR2
7851                              ,x_source_attr_table OUT NOCOPY VARCHAR2
7852                              ,x_member_col OUT NOCOPY VARCHAR2
7853                              ,x_member_dc_col OUT NOCOPY VARCHAR2
7854                              ,x_member_t_dc_col OUT NOCOPY VARCHAR2
7855                              ,x_member_name_col OUT NOCOPY VARCHAR2
7856                              ,x_member_t_name_col OUT NOCOPY VARCHAR2
7857                              ,x_member_description_col OUT NOCOPY VARCHAR2
7858                              ,x_value_set_required_flag OUT NOCOPY VARCHAR2
7859                              ,x_user_defined_flag OUT NOCOPY VARCHAR2
7860                              ,x_simple_dimension_flag OUT NOCOPY VARCHAR2
7861                              ,x_shared_dimension_flag OUT NOCOPY VARCHAR2
7862                              ,x_hier_table_name OUT NOCOPY VARCHAR2
7863                              ,x_hier_dimension_flag OUT NOCOPY VARCHAR2
7864                              ,x_member_id_method_code OUT NOCOPY VARCHAR2
7865                              ,x_table_handler_name OUT NOCOPY VARCHAR2
7866                              ,x_composite_dimension_flag   OUT NOCOPY VARCHAR2 --
7867                              ,x_structure_id OUT NOCOPY NUMBER) --
7868 IS
7869    v_hierarchy_table_name VARCHAR2(30);
7870    v_use_groups_flag VARCHAR2(1);
7871    v_hier_editor_managed_flag VARCHAR2(1);
7872    v_xdim_read_only_flag VARCHAR2(1);
7873 
7874 
7875 BEGIN
7876 
7877    FEM_ENGINES_PKG.TECH_MESSAGE
7878     (c_log_level_2,c_block||'.'||'get_dimension_info','Begin');
7879 
7880    SELECT dimension_id
7881          ,member_b_table_name
7882          ,member_tl_table_name
7883          ,attribute_table_name
7884          ,intf_member_b_table_name
7885          ,intf_member_tl_table_name
7886          ,intf_attribute_table_name
7887          ,member_col
7888          ,member_display_code_col
7889          ,member_name_col
7890          ,member_description_col
7891          ,value_set_required_flag
7892          ,user_defined_flag
7893          ,hierarchy_table_name
7894          ,decode(group_use_code,'OPTIONAL','Y','REQUIRED','Y','N')
7895          ,hier_editor_managed_flag
7896          ,read_only_flag
7897          ,member_id_method_code
7898          ,SUBSTR(member_b_table_name,1,length(member_b_table_name)-2)||'_PKG'
7899          ,composite_dimension_flag --
7900          ,id_flex_num --
7901    INTO   x_dimension_id
7902          ,x_target_b_table
7903          ,x_target_tl_table
7904          ,x_target_attr_table
7905          ,x_source_b_table
7906          ,x_source_tl_table
7907          ,x_source_attr_table
7908          ,x_member_col
7909          ,x_member_dc_col
7910          ,x_member_name_col
7911          ,x_member_description_col
7912          ,x_value_set_required_flag
7913          ,x_user_defined_flag
7914          ,x_hier_table_name
7915          ,v_use_groups_flag
7916          ,v_hier_editor_managed_flag
7917          ,v_xdim_read_only_flag
7918          ,x_member_id_method_code
7919          ,x_table_handler_name
7920          ,x_composite_dimension_flag --
7921          ,x_structure_id
7922    FROM fem_xdim_dimensions_vl
7923    WHERE dimension_varchar_label = p_dimension_varchar_label;
7924 
7925    IF x_source_b_table = 'FEM_SIMPLE_DIMS_B_T' THEN
7926       x_shared_dimension_flag := 'Y';
7927       x_member_t_dc_col       := 'MEMBER_CODE';
7928       x_member_t_name_col     := 'MEMBER_NAME';
7929 
7930    ELSE x_shared_dimension_flag := 'N';
7931         x_member_t_dc_col       := x_member_dc_col;
7932         x_member_t_name_col     := x_member_name_col;
7933 
7934    END IF;
7935 
7936    IF x_target_attr_table IS NULL THEN
7937       x_simple_dimension_flag := 'Y';
7938    ELSE x_simple_dimension_flag := 'N';
7939    END IF;
7940 
7941    x_hier_dimension_flag := v_use_groups_flag;  --bug#4244082 use_groups_flag
7942                                                 -- instead of hier_dim_flag
7943 
7944    /**********************************************************
7945    Obsolete because we have use_groups_flag logic instead
7946    due to bug#4244082
7947    IF v_hierarchy_table_name IS NOT NULL THEN
7948       x_hier_dimension_flag := 'Y';
7949    ELSE
7950       x_hier_dimension_flag := 'N';
7951    END IF;
7952    *******************/
7953 
7954    FEM_ENGINES_PKG.TECH_MESSAGE
7955     (c_log_level_2,c_block||'.'||'get_dimension_info','End');
7956 
7957    EXCEPTION
7958       WHEN no_data_found THEN
7959         RAISE e_dimension_not_found;
7960          --p_Err_Code := 2;
7961          --p_Err_Msg  := G_DIM_NOT_FOUND;
7962 
7963 
7964 END get_dimension_info;
7965 
7966 
7967 
7968 /*===========================================================================+
7969  | PROCEDURE
7970  |              build_mbr_select_stmt
7971  |
7972  | DESCRIPTION
7973  |                 Builds the dynamic SELECT statement for retrieving
7974  |                 the member data from the _T interface tables
7975  |
7976  | SCOPE - PRIVATE
7977  |
7978  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7979  |
7980  | NOTES
7981  |
7982  |
7983  |
7984  |
7985  | MODIFICATION HISTORY
7986  |    Rob Flippo   22-OCT-03  Created
7987  |    Rob Flippo   08-SEP-04  Added where condition exists = 'Y' query so that
7988  |                            when querying from the TL_T table, only rows of
7989  |                            installed languages are retrieved.  This is for
7990  |                            bug#3857097 where it was retrieving rows for all
7991  |                            languages, trying to update, and when no update row
7992  |                            found it would just delete the source row
7993  |
7994  |    Rob Flippo  08-Sep-04   Bug#3835758  Modified the vs_where_cond so that it
7995  |                            joins to fem_value_set_b where the dimension_id =
7996  |                            the dimension being loaded
7997  |    Rob Flippo   16-FEB-05  Bug#4189544 DIMENSION GROUP LOADER ISSUE
7998  |                            add dimension_id where condition when target
7999  |                            table is fem_dimension_grps_b
8000  |                            -- also fix so only load grps of the specific dim
8001  |    Rob Flippo   10-JUN-05  Bug#3928148 For TL update, only allow updates for
8002  |                            members that are not read_only_flag = Y
8003  +===========================================================================*/
8004    procedure build_mbr_select_stmt  (p_load_type IN VARCHAR2
8005                                 ,p_dimension_varchar_label IN VARCHAR2
8006                                 ,p_dimension_id IN NUMBER
8007                                 ,p_target_b_table IN VARCHAR2
8008                                 ,p_target_tl_table IN VARCHAR2
8009                                 ,p_source_b_table IN VARCHAR2
8010                                 ,p_source_tl_table IN VARCHAR2
8011                                 ,p_member_dc_col IN VARCHAR2
8012                                 ,p_member_t_dc_col IN VARCHAR2
8013                                 ,p_member_t_name_col IN VARCHAR2
8014                                 ,p_member_description_col IN VARCHAR2
8015                                 ,p_value_set_required_flag IN VARCHAR2
8016                                 ,p_shared_dimension_flag IN VARCHAR2
8017                                 ,p_hier_dimension_flag IN VARCHAR2
8018                                 ,p_exists_flag IN VARCHAR2
8019                                 ,p_exec_mode_clause IN VARCHAR2
8020                                 ,x_select_stmt OUT NOCOPY VARCHAR2)
8021 
8022 
8023    IS
8024       -- Value Set Where conditions
8025       v_vs_where_cond       VARCHAR2(1000);
8026       v_vs_t_where_cond     VARCHAR2(1000);
8027       v_vs_table           VARCHAR2(1000);
8028       v_vs_col           VARCHAR2(1000);
8029       v_vs_subq_where_cond          VARCHAR2(1000);
8030       v_vs_subq_table       VARCHAR2(1000);
8031       v_data_slice_pred     VARCHAR2(100);
8032 
8033       -- Dimension Label where condition (for Simple dimensions)
8034       v_dim_label_where_cond       VARCHAR2(1000);
8035       v_dim_label_join_cond        VARCHAR2(1000);
8036       v_dim_id_where_cond          VARCHAR2(1000);
8037 
8038       -- Dimension Group Where Conditions (for member loads)
8039       v_dimension_grp_col          VARCHAR2(1000);
8040       v_dimension_grp_table        VARCHAR2(1000);
8041       v_dimension_grp_where_cond   VARCHAR2(1000);
8042 
8043       -- Special conditions to handle CAL_PERIOD
8044       v_member_code                VARCHAR2(1000);
8045       v_cal_period_cols            VARCHAR2(1000);
8046       v_calendar_table             VARCHAR2(100);
8047       v_calendar_where_cond        VARCHAR2(1000);
8048       v_member_dc_where_cond       VARCHAR2(1000);
8049 
8050       -- Columns for loading Dimension Groups
8051       v_dimgrp_load_col            VARCHAR2(1000);
8052 
8053    BEGIN
8054 
8055    FEM_ENGINES_PKG.TECH_MESSAGE
8056     (c_log_level_2,c_block||'.'||'build_mbr_select_stmt','Begin Build member select statement');
8057 
8058       IF p_value_set_required_flag = 'Y' THEN
8059 
8060          v_vs_col          := ',B.value_set_display_code, V1.value_set_id ';
8061          v_vs_t_where_cond := ' AND B.value_set_display_code = T.value_set_display_code';
8062 
8063          v_vs_table        := ', FEM_VALUE_SETS_B V1';
8064          v_vs_where_cond   := ' AND B.value_set_display_code = V1.value_set_display_code (+)'||
8065                               ' AND V1.dimension_id (+) = '||p_dimension_id;
8066 
8067          v_vs_subq_table   := ', FEM_VALUE_SETS_B V2';
8068          v_vs_subq_where_cond   := ' AND G.value_set_id = V2.value_set_id AND '||
8069                                         'V2.value_set_display_code = B.value_set_display_code';
8070       ELSE
8071 
8072          v_vs_col           := ', null, null';
8073          v_vs_t_where_cond  := '';
8074 
8075          v_vs_table         := '';
8076          v_vs_where_cond    := '';
8077 
8078          v_vs_subq_table    := '';
8079          v_vs_subq_where_cond         := '';
8080       END IF;
8081 
8082       -- setting the Dim Label conditions
8083       IF ((p_value_set_required_flag = 'N'
8084           AND p_shared_dimension_flag = 'Y') OR
8085           (p_load_type = 'DIMENSION_GROUP'))
8086           AND (p_exists_flag = 'N') THEN
8087          v_dim_label_where_cond  :=
8088             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8089          v_dim_label_join_cond :=
8090             ' AND B.dimension_varchar_label = T.dimension_varchar_label';
8091       ELSIF ((p_value_set_required_flag = 'N'
8092              AND p_shared_dimension_flag = 'Y') OR
8093              (p_load_type = 'DIMENSION_GROUP'))
8094              AND (p_exists_flag = 'Y') THEN
8095          v_dim_label_where_cond  :=
8096             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8097          v_dim_label_join_cond   := '';
8098       ELSE
8099          v_dim_label_where_cond  := '';
8100          v_dim_label_join_cond   := '';
8101 
8102       END IF; -- setting the Dim Label conditions
8103 
8104          -- Use Dimension Groups only when query for New members from the _B_T table
8105          -- for Hierarchy dimensions
8106       IF (p_hier_dimension_flag = 'Y'
8107           AND p_exists_flag = 'N') OR (p_dimension_varchar_label = 'CAL_PERIOD')  THEN
8108          v_dimension_grp_col    := ',B.dimension_group_display_code, D.dimension_group_id';
8109          v_dimension_grp_table  := ', FEM_DIMENSION_GRPS_B D';
8110          v_dimension_grp_where_cond := ' AND B.dimension_group_display_code = '||
8111                                        'D.dimension_group_display_code (+) '||
8112                                       ' AND D.dimension_id (+) = '||p_dimension_id;
8113       ELSE
8114          v_dimension_grp_col          := ',null, null';
8115          v_dimension_grp_table        := '';
8116          v_dimension_grp_where_cond   := '';
8117       END IF;
8118 
8119       -- Setting the special conditions for CAL_PERIOD
8120       IF (p_dimension_varchar_label = 'CAL_PERIOD')
8121       AND (p_load_type NOT IN ('DIMENSION_GROUP')) THEN
8122          v_member_code :=
8123                'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
8124                'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
8125                'LPAD(to_char(C.calendar_id),5,''0'')||'||
8126                'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
8127          v_cal_period_cols    := ', C.calendar_display_code, C.calendar_id, B.cal_period_end_date,B.cal_period_number';
8128          v_calendar_table := ', FEM_CALENDARS_VL C';
8129          v_calendar_where_cond := ' AND B.calendar_display_code = C.calendar_display_code (+) ';
8130          v_member_dc_where_cond := ' AND B.calendar_display_code = T.calendar_display_code'||
8131                                    ' AND B.cal_period_number = T.cal_period_number'||
8132                                    ' AND B.cal_period_end_date = T.cal_period_end_date'||
8133                                    ' AND B.dimension_group_display_code = T.dimension_group_display_code';
8134 
8135       ELSE
8136          v_member_code := 'B.'||p_member_t_dc_col;
8137          v_cal_period_cols := ',null ,null, null, null';
8138          v_calendar_table := '';
8139          v_calendar_where_cond := '';
8140          v_member_dc_where_cond := ' AND B.'||p_member_t_dc_col||
8141                                    '=T.'||p_member_t_dc_col;
8142       END IF; -- p_dimension_varchar_label = 'CAL_PERIOD'
8143 
8144       -- Because we load both Dimension Groups and Members using the same
8145       -- dynamic query, we have to allow for the extra columns on FEM_DIMENSION_GRPS_B
8146       IF (p_load_type = 'DIMENSION_GROUP') THEN
8147          v_dimgrp_load_col := ',B.dimension_group_seq, B.time_group_type_code';
8148          v_data_slice_pred := '';
8149          v_dim_id_where_cond := ' AND G.dimension_id ='||p_dimension_id;
8150       ELSE
8151          v_dimgrp_load_col := ',null,null';
8152          v_data_slice_pred := 'AND   {{data_slice}} ';
8153          v_dim_id_where_cond := '';
8154       END IF;
8155 
8156 
8157       IF (p_exists_flag = 'N') THEN
8158       x_select_stmt :=
8159          'SELECT B.rowid'||
8160             ',T.rowid'||
8161             ','||v_member_code||
8162             v_cal_period_cols||
8163             v_vs_col||
8164             v_dimension_grp_col||
8165             ', ''LOAD'' '||
8166             ',T.'||p_member_t_name_col||
8167             ',T.'||p_member_description_col||
8168             ',T.language'||
8169             ', ''LOAD'' '||
8170             ', to_date(''12/31/2499'',''MM/DD/YYYY'')'||
8171             v_dimgrp_load_col||
8172          ' FROM '||p_source_b_table||' B,'||
8173                    p_source_tl_table||' T'||
8174                    v_dimension_grp_table||
8175                    v_vs_table||
8176                    v_calendar_table||
8177          ' WHERE B.status'||p_exec_mode_clause||
8178          v_data_slice_pred||
8179          ' AND T.status'||p_exec_mode_clause||
8180          v_member_dc_where_cond||
8181          v_vs_t_where_cond||
8182          v_dim_label_where_cond||
8183          v_dim_label_join_cond||
8184          ' AND NOT EXISTS (SELECT 0 FROM '||
8185          p_target_b_table||' G'||v_vs_subq_table||
8186          ' WHERE to_char(G.'||p_member_dc_col||') = '||v_member_code||
8187          v_dim_id_where_cond||
8188          v_vs_subq_where_cond||')'||
8189          v_dimension_grp_where_cond||
8190          v_calendar_where_cond||
8191          v_vs_where_cond||
8192          ' AND T.language = userenv(''LANG'')';
8193 
8194        ELSE
8195          -- "B" now refers to the TL table
8196       x_select_stmt :=
8197          'SELECT null'||
8198             ',B.rowid'||
8199             ','||v_member_code||
8200             v_cal_period_cols||
8201             v_vs_col||
8202             ',null,null'||
8203             ',null'||
8204             ',B.'||p_member_t_name_col||
8205             ',B.'||p_member_description_col||
8206             ',B.language'||
8207             ', ''LOAD'' '||
8208             ',null,null'||
8209          ' FROM '||p_source_tl_table||' B'||
8210                    v_dimension_grp_table||
8211                    v_vs_table||
8212                    v_calendar_table||
8213          ' WHERE B.status'||p_exec_mode_clause||
8214          v_data_slice_pred||
8215          v_dim_label_where_cond||
8216          ' AND EXISTS (SELECT 0 FROM '||
8217          p_target_b_table||' G'||v_vs_subq_table||
8218          ' WHERE to_char(G.'||p_member_dc_col||') = '||v_member_code||
8219          ' AND G.read_only_flag = ''N'''||
8220          v_dim_id_where_cond||
8221          v_vs_subq_where_cond||')'||
8222          ' AND B.language in (SELECT language_code from FND_LANGUAGES '||
8223          ' WHERE installed_flag in (''I'',''B'')) '||
8224          v_dimension_grp_where_cond||
8225          v_calendar_where_cond||
8226          v_vs_where_cond;
8227 
8228        END IF;
8229 
8230    FEM_ENGINES_PKG.TECH_MESSAGE
8231     (c_log_level_2,c_block||'.'||'build_mbr_select_stmt','End');
8232 
8233    END build_mbr_select_stmt;
8234 
8235 /*===========================================================================+
8236  | PROCEDURE
8237  |              build_bad_lang_upd_stmt
8238  |
8239  | DESCRIPTION
8240  |                 Builds the dynamic UPDATE statement for updating the TL_T
8241  |                 records where the LANGUAGE is not installed
8242  |
8243  | SCOPE - PRIVATE
8244  |
8245  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
8246  |
8247  | NOTES
8248  |
8249  |
8250  |
8251  |
8252  | MODIFICATION HISTORY
8253  |    Rob Flippo   17-Sep-04  Created
8254  +===========================================================================*/
8255 procedure build_bad_lang_upd_stmt  (p_load_type IN VARCHAR2
8256                                    ,p_dimension_varchar_label IN VARCHAR2
8257                                    ,p_dimension_id IN NUMBER
8258                                    ,p_source_tl_table IN VARCHAR2
8259                                    ,p_exec_mode_clause IN VARCHAR2
8260                                    ,p_shared_dimension_flag IN VARCHAR2
8261                                    ,p_value_set_required_flag IN VARCHAR2
8262                                    ,x_update_stmt OUT NOCOPY VARCHAR2)
8263 IS
8264    v_dim_label_where_cond   VARCHAR2(1000); -- where condition for when updating
8265                                             -- dimension grp TL table
8266 
8267 BEGIN
8268 
8269    FEM_ENGINES_PKG.TECH_MESSAGE
8270     (c_log_level_2,c_block||'.'||'build_bad_tl_lang_upd_stmt','Begin');
8271 
8272    IF (p_load_type = 'DIMENSION_GROUP')
8273       OR (p_shared_dimension_flag ='Y' AND p_value_set_required_flag = 'N') THEN
8274       v_dim_label_where_cond  :=
8275          ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8276    ELSE
8277       v_dim_label_where_cond  := '';
8278    END IF;
8279 
8280       x_update_stmt := 'UPDATE '||p_source_tl_table||' B'||
8281                        ' SET B.status = ''LANGUAGE_NOT_INSTALLED'' '||
8282                        ' WHERE B.language NOT IN '||
8283                        ' (SELECT language_code from FND_LANGUAGES '||
8284                        ' WHERE installed_flag in (''I'',''B'')) '||
8285                        v_dim_label_where_cond||
8286                        ' AND B.status'||p_exec_mode_clause||
8287                        ' AND   {{data_slice}} ';
8288 
8289 
8290    FEM_ENGINES_PKG.TECH_MESSAGE
8291     (c_log_level_2,c_block||'.'||'build_bad_tl_lang_upd_stmt','End');
8292 
8293 
8294 END build_bad_lang_upd_stmt;
8295 
8296 /*===========================================================================+
8297  | PROCEDURE
8298  |              build_tl_ro_mbr_upd_stmt
8299  |
8300  | DESCRIPTION
8301  |                 Builds the dynamic UPDATE statement for updating the TL_T
8302  |                 records where the member is read_only_flag='Y'
8303  |
8304  | SCOPE - PRIVATE
8305  |
8306  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
8307  |
8308  | NOTES
8309  |
8310  |
8311  |
8312  |
8313  | MODIFICATION HISTORY
8314  |    Rob Flippo   10-Jun-05  Created
8315  |    Rob Flippo   07-OCT-05  Modified Cal period update statement for performance
8316  |                            issue encountered during regression testing (no bug)
8317  +===========================================================================*/
8318 procedure build_tl_ro_mbr_upd_stmt  (p_load_type IN VARCHAR2
8319                                    ,p_dimension_varchar_label IN VARCHAR2
8320                                    ,p_dimension_id IN NUMBER
8321                                    ,p_source_tl_table IN VARCHAR2
8322                                    ,p_target_b_table IN VARCHAR2
8323                                    ,p_member_dc_col IN VARCHAR2
8324                                    ,p_member_t_dc_col IN VARCHAR2
8325                                    ,p_exec_mode_clause IN VARCHAR2
8326                                    ,p_shared_dimension_flag IN VARCHAR2
8327                                    ,p_value_set_required_flag IN VARCHAR2
8328                                    ,x_update_stmt OUT NOCOPY VARCHAR2)
8329 IS
8330    v_dim_label_where_cond   VARCHAR2(1000); -- where condition for when updating
8331                                             -- dimension grp TL table
8332    v_vs_where_cond          VARCHAR2(1000); -- for value set dimensions
8333    v_vs_from_cond           VARCHAR2(1000);
8334    v_calp_from_cond        VARCHAR2(1000);
8335 
8336 BEGIN
8337 
8338    FEM_ENGINES_PKG.TECH_MESSAGE
8339     (c_log_level_2,c_block||'.'||'build_tl_ro_mbr_upd_stmt','Begin');
8340 
8341    IF (p_load_type = 'DIMENSION_GROUP')
8342       OR (p_shared_dimension_flag ='Y' AND p_value_set_required_flag = 'N') THEN
8343       v_dim_label_where_cond  :=
8344          ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8345    ELSE
8346       v_dim_label_where_cond  := '';
8347    END IF;
8348 
8349    IF p_value_set_required_flag = 'Y' and p_load_type NOT IN ('DIMENSION_GROUP') THEN
8350       v_vs_from_cond := ',fem_value_sets_b V ';
8351       v_vs_where_cond := ' AND V.value_set_display_code = B.value_set_display_code'||
8352                          ' AND V.value_set_id = G.value_set_id'||
8353                          ' AND V.dimension_id = '||p_dimension_id;
8354    ELSE
8355       v_vs_from_cond := '';
8356       v_vs_where_cond := '';
8357    END IF;
8358 
8359    IF p_dimension_varchar_label = 'CAL_PERIOD' AND
8360          p_load_type NOT IN ('DIMENSION_GROUP') THEN
8361 
8362       v_calp_from_cond := ',fem_calendars_b C, fem_dimension_grps_b D';
8363 
8364       x_update_stmt := 'UPDATE '||p_source_tl_table||' B'||
8365                        ' SET B.status = ''READ_ONLY_MEMBER'' '||
8366                        ' WHERE B.language IN '||
8367                        ' (SELECT language_code from FND_LANGUAGES '||
8368                        ' WHERE installed_flag in (''I'',''B'')) '||
8369                        v_dim_label_where_cond||
8370                        ' AND B.status'||p_exec_mode_clause||
8371                        ' AND EXISTS (SELECT 0 FROM '||p_target_b_table||' G'||
8372                        v_calp_from_cond||
8373                        ' WHERE to_char(G.'||p_member_dc_col||') = '||
8374                        'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
8375                        'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
8376                        'LPAD(to_char(C.calendar_id),5,''0'')||'||
8377                        'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
8378                        ' AND G.read_only_flag = ''Y'''||
8379                        ' AND G.dimension_group_id = D.dimension_group_id '||
8380                        ' AND C.calendar_id = G.calendar_id '||
8381                        ')'||
8382                        ' AND   {{data_slice}} ';
8383 
8384     ELSE
8385 
8386       x_update_stmt := 'UPDATE '||p_source_tl_table||' B'||
8387                        ' SET B.status = ''READ_ONLY_MEMBER'' '||
8388                        ' WHERE B.language IN '||
8389                        ' (SELECT language_code from FND_LANGUAGES '||
8390                        ' WHERE installed_flag in (''I'',''B'')) '||
8391                        v_dim_label_where_cond||
8392                        ' AND B.status'||p_exec_mode_clause||
8393                        ' AND EXISTS (SELECT 0 FROM '||p_target_b_table||' G'||
8394                        v_vs_from_cond||
8395                        ' WHERE G.'||p_member_dc_col||'=B.'||p_member_t_dc_col||
8396                        ' AND G.read_only_flag = ''Y'''||
8397                        v_vs_where_cond||
8398                        ')'||
8399                        ' AND   {{data_slice}} ';
8400 
8401     END IF;
8402 
8403    FEM_ENGINES_PKG.TECH_MESSAGE
8404     (c_log_level_2,c_block||'.'||'build_tl_ro_mbr_upd_stmt','End');
8405 
8406 
8407 END build_tl_ro_mbr_upd_stmt;
8408 
8409 
8410 
8411 /*===========================================================================+
8412  | PROCEDURE
8413  |              build_bad_tl_select_stmt
8414  |
8415  | DESCRIPTION
8416  |                 Builds the dynamic SELECT statement for retrieving
8417  |                 the TL records that are not for new members (i.e., no data
8418  |                 in _B_T table) and are not for existing members (i.e., member
8419  |                 doesn't exist in FEM)
8420  |
8421  | SCOPE - PRIVATE
8422  |
8423  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
8424  |
8425  | NOTES
8426  |
8427  |
8428  |
8429  |
8430  | MODIFICATION HISTORY
8431  |    Rob Flippo   04-May-04  Created
8432  |    Rob Flippo   07-Sep-04  Bug#3848996 - Simple Dim load failing because
8433  |                            Invalid column name.  The select was using the
8434  |                            wrong variable name - it should use p_member_t_dc_col
8435  |                            since that is the name of the member col on the
8436  |                            interface table
8437  |
8438  |    Rob Flippo   16-Sep-04  Added condition on the NOT EXISTS subquery for the B2
8439  |                            table to check the dimension_Varchar_label when the
8440  |                            load is for a Simple Dimension
8441  |    Rob Flippo   16-FEB-05  Bug#4189544 DIMENSION GROUP LOADER ISSUE
8442  |                            add dimension_id where condition when target
8443  |                            table is fem_dimension_grps_b
8444  |                            -- also modified so only load grps of specific
8445  |                               dimension
8446  +===========================================================================*/
8447    procedure build_bad_tl_select_stmt  (p_load_type IN VARCHAR2
8448                                 ,p_dimension_varchar_label IN VARCHAR2
8449                                 ,p_dimension_id IN NUMBER
8450                                 ,p_target_b_table IN VARCHAR2
8451                                 ,p_target_tl_table IN VARCHAR2
8452                                 ,p_source_b_table IN VARCHAR2
8453                                 ,p_source_tl_table IN VARCHAR2
8454                                 ,p_member_dc_col IN VARCHAR2
8455                                 ,p_member_t_dc_col IN VARCHAR2
8456                                 ,p_value_set_required_flag IN VARCHAR2
8457                                 ,p_shared_dimension_flag IN VARCHAR2
8458                                 ,p_hier_dimension_flag IN VARCHAR2
8459                                 ,p_exec_mode_clause IN VARCHAR2
8460                                 ,x_select_stmt OUT NOCOPY VARCHAR2)
8461 
8462    IS
8463       -- Value Set Where conditions
8464       v_vs_where_cond       VARCHAR2(1000);
8465       v_vs_t_where_cond     VARCHAR2(1000);
8466       v_vs_table           VARCHAR2(1000);
8467       v_vs_col           VARCHAR2(1000);
8468       v_vs_subq_where_cond          VARCHAR2(1000);
8469       v_vs_subq_table       VARCHAR2(1000);
8470       v_vs_subq_where_condB2          VARCHAR2(1000);
8471       v_data_slice_pred     VARCHAR2(100);
8472 
8473       -- Dimension Label where condition (for Simple dimensions)
8474       v_dim_label_where_cond       VARCHAR2(1000);
8475       v_dim_label_subqwhere_cond       VARCHAR2(1000);
8476       v_dim_label_join_cond        VARCHAR2(1000);
8477       v_dim_id_where_cond          VARCHAR2(1000);
8478 
8479       -- Dimension Group Where Conditions (for member loads)
8480       v_dimension_grp_col          VARCHAR2(1000);
8481       v_dimension_grp_table        VARCHAR2(1000);
8482       v_dimension_grp_where_cond   VARCHAR2(1000);
8483 
8484 
8485       -- Special conditions to handle CAL_PERIOD
8486       v_member_code                VARCHAR2(1000);
8487       v_member_code_b_t              VARCHAR2(1000);
8488       v_cal_period_cols            VARCHAR2(1000);
8489       v_calendar_table             VARCHAR2(100);
8490       v_calendar_where_cond        VARCHAR2(1000);
8491       v_member_dc_where_cond       VARCHAR2(1000);
8492 
8493       -- Columns for loading Dimension Groups
8494       v_dimgrp_load_col            VARCHAR2(1000);
8495 
8496    BEGIN
8497 
8498    FEM_ENGINES_PKG.TECH_MESSAGE
8499     (c_log_level_2,c_block||'.'||'build_bad_tl_select_stmt','Begin');
8500 
8501       IF p_value_set_required_flag = 'Y' THEN
8502 
8503          v_vs_col          := ',B.value_set_display_code ';
8504          v_vs_t_where_cond := ' AND B.value_set_display_code = T.value_set_display_code';
8505 
8506          v_vs_table        := ', FEM_VALUE_SETS_B V1';
8507          v_vs_where_cond   := ' AND B.value_set_display_code = V1.value_set_display_code (+)';
8508 
8509          v_vs_subq_table   := ', FEM_VALUE_SETS_B V2';
8510          v_vs_subq_where_cond   := ' AND G.value_set_id = V2.value_set_id AND '||
8511                                         'V2.value_set_display_code = B.value_set_display_code';
8512          v_vs_subq_where_condB2   :=  ' AND B2.value_set_display_code = B.value_set_display_code';
8513 
8514 
8515       ELSE
8516 
8517          v_vs_col           := ', null';
8518          v_vs_t_where_cond  := '';
8519 
8520          v_vs_table         := '';
8521          v_vs_where_cond    := '';
8522 
8523          v_vs_subq_table    := '';
8524          v_vs_subq_where_cond         := '';
8525          v_vs_subq_where_condB2         := '';
8526 
8527       END IF;
8528 
8529       -- setting the Dim Label conditions
8530       IF (p_value_set_required_flag = 'N'
8531           AND p_shared_dimension_flag = 'Y') OR
8532           (p_load_type = 'DIMENSION_GROUP') THEN
8533          v_dim_label_where_cond  :=
8534             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8535          v_dim_label_subqwhere_cond :=
8536             ' AND B2.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
8537          v_dim_label_join_cond :=
8538             ' AND B.dimension_varchar_label = T.dimension_varchar_label';
8539       ELSE
8540          v_dim_label_where_cond  := '';
8541          v_dim_label_join_cond   := '';
8542          v_dim_label_subqwhere_cond := '';
8543 
8544       END IF; -- setting the Dim Label conditions
8545 
8546       -- Setting the special conditions for CAL_PERIOD
8547       IF (p_dimension_varchar_label = 'CAL_PERIOD')
8548       AND (p_load_type NOT IN ('DIMENSION_GROUP')) THEN
8549          v_member_code :=
8550                'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
8551                'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
8552                'LPAD(to_char(C.calendar_id),5,''0'')||'||
8553                'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
8554          v_member_code_b_t :=
8555                'LPAD(to_char(to_number(to_char(B2.cal_period_end_date,''j''))),7,''0'')||'||
8556                'LPAD(TO_CHAR(B2.cal_period_number),15,''0'')||'||
8557                'LPAD(to_char(C.calendar_id),5,''0'')||'||
8558                'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
8559 
8560          v_cal_period_cols    := ', C.calendar_display_code, C.calendar_id, B.cal_period_end_date, B.cal_period_number';
8561          v_calendar_table := ', FEM_CALENDARS_VL C';
8562          v_calendar_where_cond := ' AND B.calendar_display_code = C.calendar_display_code (+) ';
8563          v_member_dc_where_cond := ' AND B.calendar_display_code = T.calendar_display_code'||
8564                                    ' AND B.cal_period_number = T.cal_period_number'||
8565                                    ' AND B.cal_period_end_date = T.cal_period_end_date'||
8566                                    ' AND B.dimension_group_display_code = T.dimension_group_display_code';
8567          v_dimension_grp_table  := ', FEM_DIMENSION_GRPS_B D';
8568          v_dimension_grp_where_cond := ' AND B.dimension_group_display_code = '||
8569                                        'D.dimension_group_display_code (+) '||
8570                                       ' AND D.dimension_id (+) = '||p_dimension_id;
8571 
8572       ELSE
8573          v_member_code := 'B.'||p_member_t_dc_col;
8574          v_member_code_b_t := 'B2.'||p_member_t_dc_col;
8575          v_cal_period_cols := ',null ,null, null, null';
8576          v_calendar_table := '';
8577          v_calendar_where_cond := '';
8578          v_member_dc_where_cond := ' AND B.'||p_member_t_dc_col||
8579                                    '=T.'||p_member_t_dc_col;
8580          v_dimension_grp_table        := '';
8581          v_dimension_grp_where_cond   := '';
8582 
8583       END IF; -- p_dimension_varchar_label = 'CAL_PERIOD'
8584 
8585       -- Because we load both Dimension Groups and Members using the same
8586       -- dynamic query, we have to allow for the extra columns on FEM_DIMENSION_GRPS_B
8587       IF (p_load_type = 'DIMENSION_GROUP') THEN
8588          v_dimgrp_load_col := ',B.dimension_group_seq, B.time_group_type_code';
8589          v_data_slice_pred := '';
8590          v_dim_id_where_cond := ' AND G.dimension_id = '||p_dimension_id;
8591       ELSE
8592          v_dimgrp_load_col := ',null,null';
8593          v_data_slice_pred := 'AND   {{data_slice}} ';
8594          v_dim_id_where_cond := '';
8595       END IF;
8596 
8597       x_select_stmt :=
8598          'SELECT B.rowid'||
8599             ','||v_member_code||
8600             v_cal_period_cols||
8601             v_vs_col||
8602             ', ''INVALID_MEMBER'' '||
8603          ' FROM '||p_source_tl_table||' B'||
8604                    v_dimension_grp_table||
8605                    v_calendar_table||
8606          ' WHERE B.status'||p_exec_mode_clause||' '||
8607          v_data_slice_pred||
8608          v_dim_label_where_cond||
8609          ' AND NOT EXISTS (SELECT 0 FROM '||
8610          p_target_b_table||' G'||v_vs_subq_table||
8611          ' WHERE to_char(G.'||p_member_dc_col||') = '||v_member_code||
8612          v_dim_id_where_cond||
8613          v_vs_subq_where_cond||')'||
8614          ' AND NOT EXISTS (SELECT 0 FROM '||
8615          p_source_b_table||' B2'||
8616          ' WHERE to_char('||v_member_code_b_t||') = '||v_member_code||
8617          v_dim_label_subqwhere_cond||
8618          v_vs_subq_where_condB2||')'||
8619          v_dimension_grp_where_cond||
8620          v_calendar_where_cond;
8621 
8622    FEM_ENGINES_PKG.TECH_MESSAGE
8623     (c_log_level_2,c_block||'.'||'build_bad_TL_select_stmt','End');
8624 
8625    END build_bad_tl_select_stmt;
8626 
8627 
8628 /*===========================================================================+
8629  | PROCEDURE
8630  |              BUILD_CALP_INTERM_INSERT_STMT
8631  |
8632  | DESCRIPTION
8633  |                 Builds the update statement for the inserts into the
8634  |                 FEM_CALP_INTERIM_T and FEM_CALP_ATTR_INTERIM_T
8635  |
8636  | SCOPE - PRIVATE
8637  |
8638  | NOTES
8639  |
8640  |
8641  | MODIFICATION HISTORY
8642  |    Rob Flippo   04-JAN-05  Created
8643  |
8644  +===========================================================================*/
8645 
8646 procedure build_calp_interim_insert_stmt (x_insert_calp_stmt OUT NOCOPY VARCHAR2
8647                                          ,x_insert_calp_attr_stmt OUT NOCOPY VARCHAR2)
8648 
8649 IS
8650 
8651 BEGIN
8652 
8653         x_insert_calp_stmt := 'INSERT INTO FEM_CALP_INTERIM_T'||
8654                                '(CAL_PERIOD_END_DATE'||
8655                                ',CAL_PERIOD_NUMBER'||
8656                                ',CALENDAR_DISPLAY_CODE'||
8657                                ',DIMENSION_GROUP_DISPLAY_CODE'||
8658                                ',CAL_PERIOD_START_DATE'||
8659                                ',CAL_PERIOD_ID'||
8660                                ',DIMENSION_GROUP_ID'||
8661                                ',CALENDAR_ID'||
8662                                ',CAL_PERIOD_NAME'||
8663                                ',DESCRIPTION'||
8664                                ',OVERLAP_FLAG'||
8665                                ',ADJUSTMENT_PERIOD_FLAG)'||
8666                                ' SELECT'||
8667                                ':b_end_date'||
8668                                ',:b_period_number'||
8669                                ',:b_calendar_display_code'||
8670                                ',:b_dimgrp_display_code'||
8671                                ',:b_start_date'||
8672                                ',:b_cal_period_id'||
8673                                ',:b_dimgrp_id'||
8674                                ',:b_calendar_id'||
8675                                ',:b_cal_period_name'||
8676                                ',:b_description'||
8677                                ',''N'''||
8678                                ',:b_adj_period_flag'||
8679                                ' FROM dual'||
8680                                ' WHERE :b_use_interim_table_flag = ''Y'''||
8681                                ' AND :b_status = ''LOAD''';
8682          x_insert_calp_attr_stmt := 'INSERT INTO fem_calp_attr_interim_t'||
8683                                      '(CAL_PERIOD_ID'||
8684                                      ',ATTRIBUTE_ID'||
8685                                      ',VERSION_ID'||
8686                                      ',DIM_ATTRIBUTE_NUMERIC_MEMBER'||
8687                                      ',DIM_ATTRIBUTE_VALUE_SET_ID'||
8688                                      ',DIM_ATTRIBUTE_VARCHAR_MEMBER'||
8689                                      ',NUMBER_ASSIGN_VALUE'||
8690                                      ',VARCHAR_ASSIGN_VALUE'||
8691                                      ',DATE_ASSIGN_VALUE'||
8692                                      ',OVERLAP_FLAG)'||
8693                                      ' SELECT'||
8694                                      ':b_cal_period_id'||
8695                                      ',:b_attribute_id'||
8696                                      ',:b_version_id'||
8697                                      ',:b_dim_attr_numeric_member'||
8698                                      ',:b_dim_attr_value_set_id'||
8699                                      ',:b_dim_attr_varchar_member'||
8700                                      ',:b_number_assign_value'||
8701                                      ',:b_varchar_assign_value'||
8702                                      ',:b_date_assign_value'||
8703                                      ',''N'''||
8704                                      ' FROM dual'||
8705                                      ' WHERE :b_use_interim_table_flag = ''Y'''||
8706                                      ' AND :b_status = ''LOAD''';
8707 
8708 
8709 
8710 END build_calp_interim_insert_stmt;
8711 
8712 
8713 /*===========================================================================+
8714  | PROCEDURE
8715  |              TRUNCATE_CALP_INTERIM
8716  |
8717  | DESCRIPTION
8718  |                 Truncates the INTERIM tables used in CAL_PERIOD loads
8719  |
8720  | SCOPE - PRIVATE
8721  |
8722  | NOTES
8723  |
8724  |
8725  | MODIFICATION HISTORY
8726  |    Rob Flippo   11-JAN-05  Created
8727  |
8728  +===========================================================================*/
8729 PROCEDURE truncate_calp_interim
8730 
8731 IS
8732 
8733    v_truncate_stmt VARCHAR2(4000);
8734 
8735 BEGIN
8736 
8737    FEM_ENGINES_PKG.TECH_MESSAGE
8738     (c_log_level_2,c_block||'.'||'Truncate_calp_interim'||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
8739 
8740    v_truncate_stmt := 'delete from fem_calp_interim_t';
8741    EXECUTE IMMEDIATE v_truncate_stmt;
8742 
8743      commit;
8744    v_truncate_stmt := 'delete from fem_calp_attr_interim_t';
8745    EXECUTE IMMEDIATE v_truncate_stmt;
8746 
8747              commit;
8748 
8749    FEM_ENGINES_PKG.TECH_MESSAGE
8750     (c_log_level_2,c_block||'.'||'Truncate_calp_interim'||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
8751 
8752 
8753 END truncate_calp_interim;
8754 
8755 /*===========================================================================+
8756  | PROCEDURE
8757  |              GET_ATTR_ASSIGN_CALP
8758  |
8759  | DESCRIPTION
8760  |                 Identifies the CAL_PERIOD_ID for the attribute assignment
8761  |                 when the attribute LOV comes from the CAL_PERIOD dimension
8762  |
8763  | SCOPE - PRIVATE
8764  |
8765  | NOTES
8766  |
8767  |
8768  | MODIFICATION HISTORY
8769  |    Rob Flippo   11-JAN-05  Created
8770  |
8771  +===========================================================================*/
8772 procedure get_attr_assign_calp          (x_cal_period_id OUT NOCOPY VARCHAR2
8773                                         ,x_record_status OUT NOCOPY VARCHAR2
8774                                         ,p_calendar_dc IN VARCHAR2
8775                                         ,p_dimension_group_dc IN VARCHAR2
8776                                         ,p_end_date IN DATE
8777                                         ,p_cal_period_number IN NUMBER)
8778 IS
8779 
8780    v_calendar_id        NUMBER;
8781    v_dimension_group_id NUMBER;
8782    v_cal_period_id      NUMBER;
8783 
8784 BEGIN
8785 
8786    BEGIN
8787       SELECT calendar_id
8788       INTO v_calendar_id
8789       FROM fem_calendars_b
8790       WHERE calendar_display_code = p_calendar_dc;
8791    EXCEPTION
8792       WHEN no_data_found THEN x_record_status := 'INVALID_CALPATTR_CALENDAR';
8793    END;
8794 
8795    BEGIN
8796       SELECT dimension_group_id
8797       INTO v_dimension_group_id
8798       FROM fem_dimension_grps_b
8799       WHERE dimension_group_display_code = p_dimension_group_dc;
8800    EXCEPTION
8801       WHEN no_data_found THEN x_record_status := 'INVALID_CALPATTR_DIMGRP';
8802    END;
8803 
8804    v_cal_period_id := fem_dimension_util_pkg.generate_member_id(
8805       P_END_DATE => p_end_date
8806      ,P_PERIOD_NUM => p_cal_period_number
8807      ,P_CALENDAR_ID => v_calendar_id
8808      ,P_DIM_GRP_ID => v_dimension_group_id);
8809 
8810    IF x_record_status IS NULL
8811       AND (v_cal_period_id IS NULL
8812       OR v_cal_period_id <= 0) THEN
8813       x_record_status := 'INVALID_CALPATTR';
8814    ELSIF x_record_status IS NULL
8815       AND v_cal_period_id > 0 THEN
8816       x_record_status := 'LOAD';
8817    END IF;
8818 
8819    x_cal_period_id := to_char(v_cal_period_id);
8820 
8821 END get_attr_assign_calp;
8822 
8823 
8824 /*===========================================================================+
8825  | PROCEDURE
8826  |              POST_CAL_PERIODS
8827  |
8828  | DESCRIPTION
8829  |                 Moves Cal Periods from the Interim table into
8830  |                 FEM
8831  |
8832  | SCOPE - PRIVATE
8833  |
8834  | NOTES
8835  |
8836  |
8837  | MODIFICATION HISTORY
8838  |    Rob Flippo   06-JAN-05  Created
8839  |    Rob Flippo   22-APR-05  Bug#4305050 Calendar_ID and Dimension_Group_ID
8840  |                            were being swapped on insert member
8841  |    Rob Flippo   07-OCT-05  Bug#4628009 Fixed problem in Post_Cal_Periods where
8842  |                            the Cal Period Name and Description table variables
8843  |                            had a type of varchar2(30) instead of 150 and 255.
8844  |    Rob Flippo  04-AUG-06   Bug 5060746 Change literals to bind variables wherever possible
8845  |
8846  +===========================================================================*/
8847 PROCEDURE Post_Cal_Periods (p_eng_sql IN VARCHAR2
8848                            ,p_data_slc IN VARCHAR2
8849                            ,p_proc_num IN VARCHAR2
8850                            ,p_partition_code IN NUMBER
8851                            ,p_fetch_limit IN NUMBER
8852                            ,p_operation_mode IN VARCHAR2
8853                            ,p_master_request_id IN NUMBER)
8854 IS
8855 
8856    c_proc_name                       VARCHAR2(30) := 'Post_Cal_Periods';
8857 
8858    v_fetch_limit                     NUMBER;
8859    v_mbr_last_row                    NUMBER;
8860    v_attribute_id                    NUMBER;  -- of the CAL_PERIOD_START_DATE attribute
8861    v_version_id                      NUMBER;  -- Default version of CAL_PERIOD_START_DATE
8862 
8863    t_cal_period_id                number_type;
8864    t_calendar_id                  number_type;
8865    t_dimension_group_id           number_type;
8866    t_cal_period_name              varchar2_150_type;
8867    t_description                  desc_type;
8868    t_start_date                   date_type;
8869    t_cal_period_number            number_type;
8870    t_cal_period_end_date          date_type;
8871    t_calendar_display_code        varchar2_std_type;
8872    t_dimension_group_display_code varchar2_std_type;
8873 
8874    x_insert_mbr_stmt                 VARCHAR2(4000);
8875    x_insert_attr_stmt                VARCHAR2(4000);
8876    x_select_mbr_stmt                 VARCHAR2(4000);
8877    x_update_attr_stmt                VARCHAR2(4000);
8878    x_delete_b_stmt                   VARCHAR2(4000);
8879    x_delete_tl_stmt                  VARCHAR2(4000);
8880    x_delete_attr_stmt                VARCHAR2(4000);
8881 
8882 -- MP variables
8883    v_loop_counter                    NUMBER;
8884    v_slc_id                          NUMBER;
8885    v_slc_val                         VARCHAR2(100);
8886    v_slc_val2                        VARCHAR2(100);
8887    v_slc_val3                        VARCHAR2(100);
8888    v_slc_val4                        VARCHAR2(100);
8889    v_mp_status                       VARCHAR2(30);
8890    v_mp_message                      VARCHAR2(4000);
8891    v_num_vals                        NUMBER;
8892    v_part_name                       VARCHAR2(4000);
8893 
8894 
8895    ---------------------
8896    -- Declare cursors --
8897    ---------------------
8898    cv_get_rows           cv_curs;
8899 
8900 BEGIN
8901 
8902    FEM_ENGINES_PKG.TECH_MESSAGE
8903     (c_log_level_2,c_block||'.'||'Post_Cal_Periods'||'.Begin',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
8904 
8905    FEM_ENGINES_PKG.TECH_MESSAGE
8906     (c_log_level_1,c_block||'.'||'Post_Cal_Periods'||'.p_operation_mode',p_operation_mode);
8907 
8908    --x_status := 0; -- initialize status of the New_Members procedure
8909    --x_message := 'COMPLETE:NORMAL';
8910 
8911    -- set the local fetch limit variable based on the parameter
8912    v_fetch_limit := p_fetch_limit;
8913    IF v_fetch_limit IS NULL THEN
8914       v_fetch_limit := 10000;
8915    END IF;
8916 
8917    ----------------------------------------------
8918    -- build the statement to fetch the members for processing
8919    -- This statement is used by both modes (New Members and Attr Update)
8920    ----------------------------------------------
8921    x_select_mbr_stmt := 'SELECT '||
8922                         'B.cal_period_id'||
8923                         ', B.calendar_id'||
8924                         ', B.dimension_group_id'||
8925                         ', B.cal_period_name'||
8926                         ', B.description'||
8927                         ', B.cal_period_start_date'||
8928                         ', B.cal_period_end_date'||
8929                         ', B.cal_period_number'||
8930                         ', B.calendar_display_code'||
8931                         ', B.dimension_group_display_code'||
8932                         ' FROM fem_calp_interim_t B'||
8933                         ' WHERE B.overlap_flag = ''N'''||
8934                         ' AND   {{data_slice}} ';
8935    IF p_data_slc IS NOT NULL THEN
8936       x_select_mbr_stmt := REPLACE(x_select_mbr_stmt,'{{data_slice}}',p_data_slc);
8937    ELSE
8938       x_select_mbr_stmt := REPLACE(x_select_mbr_stmt,'{{data_slice}}','1=1');
8939    END IF;
8940    ----------------------------------------------------------------------
8941      FEM_ENGINES_PKG.TECH_MESSAGE
8942      (c_log_level_1,c_block||'.'||c_proc_name||'.select_mbr_stmt'
8943      ,x_select_mbr_stmt);
8944 
8945    IF p_operation_mode = 'NEW_MEMBERS' THEN
8946          x_insert_mbr_stmt :=
8947                    'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER;'||
8948                    'BEGIN FEM_CAL_PERIODS_PKG.INSERT_ROW '||
8949                    '(x_rowid => v_row_id '||
8950                   ',x_cal_period_id => :b_cal_period_id'||
8951                   ',x_dimension_group_id => :b_dimension_group_id '||
8952                   ',x_calendar_id => :b_calendar_id '||
8953                   ',x_enabled_flag => ''Y'' '||
8954                   ',x_personal_flag => ''N'' '||
8955                   ',x_read_only_flag => ''N'' '||
8956                   ',x_object_version_number => '||c_object_version_number||
8957                   ',x_cal_period_name => :b_member_name'||
8958                   ',x_description => :b_member_desc '||
8959                   ',x_creation_date => sysdate '||
8960                   ',x_created_by => :b_apps_user_id'||
8961                   ',x_last_update_date => sysdate '||
8962                   ',x_last_updated_by => :b_apps_user_id2'||
8963                   ',x_last_update_login => null ); END;';
8964 
8965      FEM_ENGINES_PKG.TECH_MESSAGE
8966      (c_log_level_1,c_block||'.'||c_proc_name||'.insert_mbr_stmt'
8967      ,x_insert_mbr_stmt);
8968 
8969       x_insert_attr_stmt := 'INSERT INTO FEM_CAL_PERIODS_ATTR '||
8970                             '(CAL_PERIOD_ID'||
8971                             ',ATTRIBUTE_ID'||
8972                             ',VERSION_ID'||
8973                             ',DIM_ATTRIBUTE_NUMERIC_MEMBER'||
8974                             ',DIM_ATTRIBUTE_VALUE_SET_ID'||
8975                             ',DIM_ATTRIBUTE_VARCHAR_MEMBER'||
8976                             ',NUMBER_ASSIGN_VALUE'||
8977                             ',VARCHAR_ASSIGN_VALUE'||
8978                             ',DATE_ASSIGN_VALUE'||
8979                             ',CREATION_DATE'||
8980                             ',CREATED_BY'||
8981                             ',LAST_UPDATED_BY'||
8982                             ',LAST_UPDATE_DATE'||
8983                             ',LAST_UPDATE_LOGIN'||
8984                             ',OBJECT_VERSION_NUMBER'||
8985                             ',AW_SNAPSHOT_FLAG) '||
8986                             'SELECT cal_period_id'||
8987                             ',attribute_id'||
8988                             ',version_id'||
8989                             ',dim_attribute_numeric_member'||
8990                             ',dim_attribute_value_set_id'||
8991                             ',dim_attribute_varchar_member'||
8992                             ',number_assign_value'||
8993                             ',varchar_assign_value'||
8994                             ',date_assign_value'||
8995                             ', sysdate'||
8996                             ',:b_apps_user_id'||
8997                             ',:b_apps_user_id2'||
8998                             ', sysdate'||
8999                             ', null'||
9000                             ', 1'||
9001                             ', ''N'''||
9002                             ' FROM fem_calp_attr_interim_t'||
9003                             ' WHERE cal_period_id = :b_cal_period_id';
9004      FEM_ENGINES_PKG.TECH_MESSAGE
9005      (c_log_level_1,c_block||'.'||c_proc_name||'.insert_attr_stmt'
9006      ,x_insert_attr_stmt);
9007 
9008      build_calp_delete_stmt ('FEM_CAL_PERIODS_B_T'
9009                             ,p_operation_mode
9010                             ,x_delete_b_stmt);
9011 
9012      build_calp_delete_stmt ('FEM_CAL_PERIODS_TL_T'
9013                             ,p_operation_mode
9014                             ,x_delete_tl_stmt);
9015 
9016      build_calp_delete_stmt ('FEM_CAL_PERIODS_ATTR_T'
9017                             ,p_operation_mode
9018                             ,x_delete_attr_stmt);
9019 
9020 
9021    ELSE
9022       x_update_attr_stmt := 'UPDATE fem_cal_periods_attr'||
9023                             ' SET date_assign_value = :b_start_date'||
9024                             ',creation_date = sysdate'||
9025                             ',last_update_date = sysdate'||
9026                             ',last_updated_by = :b_apps_user_id'||
9027                             ' WHERE cal_period_id = :b_cal_period_id'||
9028                             ' AND attribute_id = :b_attribute_id'||
9029                             ' AND version_id = :b_version_id';
9030 
9031      FEM_ENGINES_PKG.TECH_MESSAGE
9032      (c_log_level_1,c_block||'.'||c_proc_name||'.update_attr_stmt'
9033      ,x_update_attr_stmt);
9034 
9035      build_calp_delete_stmt ('FEM_CAL_PERIODS_ATTR_T'
9036                             ,p_operation_mode
9037                             ,x_delete_attr_stmt);
9038 
9039      FEM_ENGINES_PKG.TECH_MESSAGE
9040      (c_log_level_1,c_block||'.'||c_proc_name||'.delete_attr_stmt'
9041      ,x_delete_attr_stmt);
9042 
9043       -- identify the attribute_id and default version for the START_DATE attribute
9044       SELECT attribute_id
9045       INTO v_attribute_id
9046       FROM fem_dim_attributes_b
9047       WHERE attribute_varchar_label = 'CAL_PERIOD_START_DATE';
9048 
9049       SELECT version_id
9050       INTO v_version_id
9051       FROM fem_dim_attr_versions_b
9052       WHERE attribute_id = v_attribute_id
9053       AND default_version_flag = 'Y';
9054 
9055    END IF;
9056 
9057    v_loop_counter := 0; -- used for DIMENSION_GROUP loads to identify when to exit
9058                         -- the data slice loop
9059    LOOP
9060 
9061       FEM_Multi_Proc_Pkg.Get_Data_Slice(
9062         x_slc_id => v_slc_id,
9063         x_slc_val1 => v_slc_val,
9064         x_slc_val2 => v_slc_val2,
9065         x_slc_val3 => v_slc_val3,
9066         x_slc_val4 => v_slc_val4,
9067         x_num_vals  => v_num_vals,
9068         x_part_name => v_part_name,
9069         p_req_id => p_master_request_id,
9070         p_proc_num => p_proc_num);
9071 
9072       FEM_ENGINES_PKG.TECH_MESSAGE
9073        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val'
9074        ,v_slc_val);
9075       FEM_ENGINES_PKG.TECH_MESSAGE
9076        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val2'
9077        ,v_slc_val2);
9078       FEM_ENGINES_PKG.TECH_MESSAGE
9079        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val3'
9080        ,v_slc_val3);
9081       FEM_ENGINES_PKG.TECH_MESSAGE
9082        (c_log_level_1,c_block||'.'||c_proc_name||'.get_data_slice.slc_val4'
9083        ,v_slc_val4);
9084 
9085 
9086       EXIT WHEN (v_slc_id IS NULL);
9087 
9088    ----------------------------------------------
9089    -- Fetch the new members into the array
9090    ----------------------------------------------
9091    OPEN cv_get_rows FOR x_select_mbr_stmt USING v_slc_val, v_slc_val2;
9092 
9093    LOOP
9094 
9095       FETCH cv_get_rows BULK COLLECT INTO
9096             t_cal_period_id
9097             ,t_calendar_id
9098             ,t_dimension_group_id
9099             ,t_cal_period_name
9100             ,t_description
9101             ,t_start_date
9102             ,t_cal_period_end_date
9103             ,t_cal_period_number
9104             ,t_calendar_display_code
9105             ,t_dimension_group_display_code
9106       LIMIT v_fetch_limit;
9107       ----------------------------------------------
9108       -- EXIT Fetch LOOP If No Rows are Retrieved --
9109       ----------------------------------------------
9110       v_mbr_last_row := t_cal_period_id.LAST;
9111 
9112       IF (v_mbr_last_row IS NULL) THEN
9113          EXIT;
9114       END IF;
9115 
9116       -- If running in NEW_MEMBERS mode, we do the following:
9117       -- 1)  call table handler to create the new CAL_PERIOD members
9118       -- 2)  run an insert statement to move the attribute assignments from the
9119       --     INTERIM table into FEM_CAL_PERIODS_ATTR
9120       -- 3)  Remove the rows from the _B_T, TL_T and ATTR_T tables for the successful
9121       --     members
9122       IF p_operation_mode = 'NEW_MEMBERS' THEN
9123          ----------------------------------------------------------
9124          -- Call the table handler insert stmt for each new member
9125          ----------------------------------------------------------
9126          FORALL i IN 1..v_mbr_last_row
9127             EXECUTE IMMEDIATE x_insert_mbr_stmt
9128             USING t_cal_period_id(i)
9129                  ,t_dimension_group_id(i)
9130                  ,t_calendar_id(i)
9131                  ,t_cal_period_name(i)
9132                  ,t_description(i)
9133                  ,gv_apps_user_id
9134                  ,gv_apps_user_id;
9135 
9136          ----------------------------------------------------------
9137          -- Call the insert attr stmt for each new member
9138          ----------------------------------------------------------
9139          FORALL i IN 1..v_mbr_last_row
9140             EXECUTE IMMEDIATE x_insert_attr_stmt
9141             USING gv_apps_user_id
9142                  ,gv_apps_user_id
9143                  ,t_cal_period_id(i);
9144 
9145          ----------------------------------------------------------
9146          -- Delete the records from the _B_T table
9147          ----------------------------------------------------------
9148          FORALL i IN 1..v_mbr_last_row
9149             EXECUTE IMMEDIATE x_delete_b_stmt
9150             USING t_cal_period_number(i)
9151                  ,t_cal_period_end_date(i)
9152                  ,t_calendar_display_code(i)
9153                  ,t_dimension_group_display_code(i);
9154 
9155          ----------------------------------------------------------
9156          -- Delete the records from the _TL_T table
9157          ----------------------------------------------------------
9158          FORALL i IN 1..v_mbr_last_row
9159             EXECUTE IMMEDIATE x_delete_tl_stmt
9160             USING t_cal_period_number(i)
9161                  ,t_cal_period_end_date(i)
9162                  ,t_calendar_display_code(i)
9163                  ,t_dimension_group_display_code(i);
9164 
9165          ----------------------------------------------------------
9166          -- Delete the records from the _ATTR_T table
9167          ----------------------------------------------------------
9168          IF p_operation_mode = 'NEW_MEMBERS' THEN
9169             FORALL i IN 1..v_mbr_last_row
9170                EXECUTE IMMEDIATE x_delete_attr_stmt
9171                USING t_cal_period_number(i)
9172                     ,t_cal_period_end_date(i)
9173                     ,t_calendar_display_code(i)
9174                     ,t_dimension_group_display_code(i);
9175 
9176          ELSE
9177             FORALL i IN 1..v_mbr_last_row
9178                EXECUTE IMMEDIATE x_delete_attr_stmt
9179                USING t_cal_period_number(i)
9180                     ,t_cal_period_end_date(i)
9181                     ,t_calendar_display_code(i)
9182                     ,t_dimension_group_display_code(i)
9183                     ,t_cal_period_id(i);
9184          END IF;
9185 
9186       ELSE -- we only update an existing assignment
9187            -- since the START_DATE attribute is required and must
9188            -- therefore always already exist
9189          FORALL i IN 1..v_mbr_last_row
9190             EXECUTE IMMEDIATE x_update_attr_stmt
9191             USING t_start_date(i)
9192                  ,gv_apps_user_id
9193                  ,t_cal_period_id(i)
9194                  ,v_attribute_id
9195                  ,v_version_id;
9196 
9197          ----------------------------------------------------------
9198          -- Delete the records from the _ATTR_T table
9199          ----------------------------------------------------------
9200          IF p_operation_mode = 'NEW_MEMBERS' THEN
9201             FORALL i IN 1..v_mbr_last_row
9202                EXECUTE IMMEDIATE x_delete_attr_stmt
9203                USING t_cal_period_number(i)
9204                     ,t_cal_period_end_date(i)
9205                     ,t_calendar_display_code(i)
9206                     ,t_dimension_group_display_code(i);
9207 
9208          ELSE
9209             FORALL i IN 1..v_mbr_last_row
9210                EXECUTE IMMEDIATE x_delete_attr_stmt
9211                USING t_cal_period_number(i)
9212                     ,t_cal_period_end_date(i)
9213                     ,t_calendar_display_code(i)
9214                     ,t_dimension_group_display_code(i)
9215                     ,t_cal_period_id(i);
9216          END IF;
9217 
9218       END IF;
9219 
9220       t_cal_period_id.DELETE;
9221       t_calendar_id.DELETE;
9222       t_dimension_group_id.DELETE;
9223       t_cal_period_name.DELETE;
9224       t_description.DELETE;
9225       t_start_date.DELETE;
9226       t_cal_period_end_date.DELETE;
9227       t_cal_period_number.DELETE;
9228       t_calendar_display_code.DELETE;
9229       t_dimension_group_display_code.DELETE;
9230 
9231 
9232            COMMIT;
9233 
9234    END LOOP;
9235    END LOOP; --get_data_slice
9236    IF cv_get_rows%ISOPEN THEN
9237       CLOSE cv_get_rows;
9238    END IF;
9239 
9240    FEM_ENGINES_PKG.TECH_MESSAGE
9241     (c_log_level_2,c_block||'.'||'Post_Cal_Periods'||'.End',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
9242 
9243 END Post_Cal_Periods;
9244 
9245 
9246 
9247 /*===========================================================================+
9248  | PROCEDURE
9249  |              BUILD_ENABLE_UPDATE_STMT
9250  |
9251  | DESCRIPTION
9252  |                 Builds the dynamic UPDATE statement for updating
9253  |                 the enabled flag for dimension members.  This procedure
9254  |                 allows users to "undelete" a member by populating the
9255  |                 _B_T table with the member for a load.  The loader will
9256  |                 automatically undelete any existing members from the _B_T
9257  |                 table.
9258  |
9259  | SCOPE - PRIVATE
9260  |
9261  | NOTES
9262  |
9263  |
9264  |
9265  | MODIFICATION HISTORY
9266  |    Rob Flippo   27-SEP-04  Created
9267  |    Rob Flippo   03-MAR-05  Modified so that is updating a Dim Grp we use
9268  |                            where condition on dimension_id so that dim grps
9269  |                            with the same name for other dimensions don't get
9270  |                            mixed into the update
9271  |    Rob Flippo   15-MAR-05  Modify value set update so that use value_set
9272  |                            in the subquery (otherwise get too many rows if
9273  |                            2 members have same display_code)
9274  +===========================================================================*/
9275 
9276 
9277    procedure build_enable_update_stmt (p_dimension_varchar_label IN VARCHAR2
9278                                 ,p_dimension_id IN NUMBER
9279                                 ,p_load_type IN VARCHAR2
9280                                 ,p_target_b_table IN VARCHAR2
9281                                 ,p_member_col IN VARCHAR2
9282                                 ,p_member_dc_col IN VARCHAR2
9283                                 ,p_value_set_required_flag IN VARCHAR2
9284                                 ,x_update_stmt OUT NOCOPY VARCHAR2)
9285 
9286     IS
9287 
9288        v_dimlabel_cond VARCHAR2(1000);
9289 
9290      BEGIN
9291         FEM_ENGINES_PKG.TECH_MESSAGE
9292          (c_log_level_2,c_block||'.'||
9293           'build_enable_update_stmt','Begin Build Enabled flag update statement');
9294 
9295         IF p_load_type = 'DIMENSION_GROUP' THEN
9296            v_dimlabel_cond := ' AND dimension_id = '||p_dimension_id;
9297         ELSE
9298            v_dimlabel_cond := '';
9299         END IF;
9300 
9301 
9302         IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
9303 
9304         x_update_stmt :=
9305         'UPDATE '||p_target_b_table||
9306            ' SET enabled_flag = ''Y'''||
9307            ',last_update_date = sysdate '||
9308            ',last_updated_by = '||gv_apps_user_id||
9309            ',last_update_login = '||gv_login_id||
9310            ' WHERE to_char('||p_member_col||') = :b_member_code'||
9311            ' AND   :b_t_a_status = ''LOAD''';
9312 
9313         ELSIF (p_value_set_required_flag = 'Y') THEN
9314 
9315         x_update_stmt :=
9316         'UPDATE '||p_target_b_table||
9317            ' SET enabled_flag = ''Y'''||
9318            ',last_update_date = sysdate '||
9319            ',last_updated_by = '||gv_apps_user_id||
9320            ',last_update_login = '||gv_login_id||
9321            ' WHERE '||p_member_col||' = (SELECT '||p_member_col||
9322            ' FROM '||p_target_b_table||' T'||
9323            ', fem_value_sets_b V'||
9324            ' WHERE to_char(T.'||p_member_dc_col||') = :b_member_display_code'||
9325            ' AND T.value_set_id = V.value_set_id'||
9326            ' AND V.value_set_display_code = :b_value_set_display_code)'||
9327            ' AND value_set_id = (SELECT value_set_id FROM FEM_VALUE_SETS_B'||
9328            ' WHERE value_set_display_code = :b_value_set_display_code)'||
9329            ' AND   :b_t_a_status = ''LOAD''';
9330 
9331 
9332         ELSE
9333 
9334         x_update_stmt :=
9335         'UPDATE '||p_target_b_table||
9336            ' SET enabled_flag = ''Y'''||
9337            ',last_update_date = sysdate '||
9338            ',last_updated_by = '||gv_apps_user_id||
9339            ',last_update_login = '||gv_login_id||
9340            ' WHERE '||p_member_col||' = (SELECT '||p_member_col||
9341            ' FROM '||p_target_b_table||
9342            ' WHERE to_char('||p_member_dc_col||') = :b_member_display_code'||
9343            v_dimlabel_cond||
9344            ')'||
9345            ' AND   :b_t_a_status = ''LOAD''';
9346 
9347         END IF;
9348         FEM_ENGINES_PKG.TECH_MESSAGE
9349          (c_log_level_2,c_block||'.'||
9350           'build_enable_update_stmt','End');
9351 
9352      END build_enable_update_stmt;
9353 
9354 /*===========================================================================+
9355  | PROCEDURE
9356  |              BUILD_TL_DUPNAME_STMT
9357  |
9358  | DESCRIPTION
9359  |                 Builds the dynamic SELECT statement for verifying if
9360  |                 a translatable name already exists for another dimension
9361  |                 member
9362  |
9363  | SCOPE - PRIVATE
9364  |
9365  | NOTES
9366  |
9367  | MODIFICATION HISTORY
9368  |    Rob Flippo   13-MAR-06  Created
9369  |
9370  +===========================================================================*/
9371 
9372 procedure build_tl_dupname_stmt (p_dimension_varchar_label IN VARCHAR2
9373                                 ,p_dimension_id IN NUMBER
9374                                 ,p_load_type IN VARCHAR2
9375                                 ,p_target_b_table IN VARCHAR2
9376                                 ,p_target_tl_table IN VARCHAR2
9377                                 ,p_member_col IN VARCHAR2
9378                                 ,p_member_dc_col IN VARCHAR2
9379                                 ,p_member_name_col IN VARCHAR2
9380                                 ,p_value_set_required_flag IN VARCHAR2
9381                                 ,p_calling_mode IN VARCHAR2
9382                                 ,x_select_stmt OUT NOCOPY VARCHAR2)
9383 IS
9384 
9385    v_dim_id_where_cond VARCHAR2(1000);
9386    v_vs_where_cond VARCHAR2(1000);
9387 
9388    BEGIN
9389       FEM_ENGINES_PKG.TECH_MESSAGE
9390        (c_log_level_2,c_block||'.'||
9391         'build_tl_dupname_stmt','Begin Build select statement for dupname check');
9392 
9393       IF p_load_type IN ('DIMENSION_GROUP') THEN
9394          v_dim_id_where_cond := ' AND B.dimension_id = '||p_dimension_id;
9395       ELSE
9396          v_dim_id_where_cond := '';
9397       END IF;
9398 
9399 
9400       IF p_dimension_varchar_label = 'CAL_PERIOD'
9401          AND p_load_type NOT IN ('DIMENSION_GROUP') THEN
9402          IF p_calling_mode = 'NEW_MEMBERS' THEN
9403              x_select_stmt :=
9404                'SELECT count(*) FROM '||p_target_tl_table||
9405                ' WHERE '||p_member_name_col||' = :b_member_name'||
9406                ' AND dimension_group_id = :b_dimgrp_id'||
9407                ' AND calendar_id = :b_calendar_id';
9408          ELSE
9409              x_select_stmt :=
9410                'SELECT count(*) FROM '||
9411                p_target_tl_table||' T, '||p_target_b_table||' B'||
9412                ' WHERE T.'||p_member_name_col||' = :b_member_name'||
9413                ' AND T.'||p_member_col||' = B.'||p_member_col||
9414                ' AND to_char(B.'||p_member_dc_col||') <> :b_member_dc'||
9415                ' AND T.language = :b_lang'||
9416                ' AND T.dimension_group_id = :b_dimgrp_id'||
9417                ' AND T.calendar_id = :b_calendar_id';
9418          END IF;
9419 
9420 
9421       ELSE
9422          IF p_calling_mode = 'NEW_MEMBERS' THEN
9423             IF p_value_set_required_flag = 'Y'
9424                AND p_load_type NOT IN ('DIMENSION_GROUP') THEN
9425               v_vs_where_cond := ' AND value_set_id = (SELECT value_set_id'||
9426                                  ' FROM fem_value_sets_b '||
9427                                  ' WHERE value_set_display_code = :vs_dc)';
9428             ELSE v_vs_where_cond := '';
9429             END IF;
9430 
9431              x_select_stmt :=
9432                'SELECT count(*) FROM '||p_target_tl_table||
9433                ' WHERE '||p_member_name_col||' = :b_member_name'||
9434                v_vs_where_cond;
9435          ELSE
9436             IF p_value_set_required_flag = 'Y'
9437                AND p_load_type NOT IN ('DIMENSION_GROUP') THEN
9438               v_vs_where_cond := ' AND B.value_set_id = T.value_set_id'||
9439                                  ' AND B.value_set_id = (SELECT value_set_id'||
9440                                  ' FROM fem_value_sets_b '||
9441                                  ' WHERE value_set_display_code = :vs_dc)';
9442             ELSE v_vs_where_cond := '';
9443             END IF;
9444 
9445              x_select_stmt :=
9446                'SELECT count(*) FROM '||
9447                p_target_tl_table||' T, '||p_target_b_table||' B'||
9448                ' WHERE T.'||p_member_name_col||' = :b_member_name'||
9449                ' AND T.'||p_member_col||' = B.'||p_member_col||
9450                ' AND to_char(B.'||p_member_dc_col||') <> :b_member_dc'||
9451                ' AND T.language = :b_lang'||
9452                v_vs_where_cond||
9453                v_dim_id_where_cond;
9454          END IF;
9455 
9456       END IF; -- cal_period
9457 
9458       FEM_ENGINES_PKG.TECH_MESSAGE
9459        (c_log_level_2,c_block||'.'||
9460         'build_tl_dupname_stmt','End');
9461 
9462 
9463 END build_tl_dupname_stmt;
9464 
9465 
9466 
9467 /*===========================================================================+
9468  | PROCEDURE
9469  |              BUILD_TL_UPDATE_STMT
9470  |
9471  | DESCRIPTION
9472  |                 Builds the dynamic UPDATE statement for updating
9473  |                 the translatable names/descriptions for dimension members
9474  |
9475  | SCOPE - PRIVATE
9476  |
9477  | NOTES
9478  |    This procedure does not use the table handlers for performing the update,
9479  |    since we may be updating multiple languages.
9480  |
9481  |
9482  | MODIFICATION HISTORY
9483  |    Rob Flippo   22-OCT-03  Created
9484  |
9485  |    Rob Flippo   16-FEB-05  Bug#4189544 DIMENSION GROUP LOADER ISSUE
9486  |                            add dimension_id where condition when target
9487  |                            table is fem_dimension_grps_b
9488  |    Rob Flippo   22-MAR-05  Fix problem with same display_code in multiple
9489  |                            value sets (single row query returns multiple rows)
9490  |    Rob Flippo   10-MAR-06  Bug#5068022 modify update so that only
9491  |                            records where status in the array = 'LOAD' get
9492  |                            updated
9493  |    Rob Flippo  04-AUG-06   Bug 5060746 Change literals to bind variables wherever possible
9494  |    Rob Flippo  15-MAR-07  Bug#5905501 Need to update source_lang so that
9495  |                           translated rows get marked properly
9496  +===========================================================================*/
9497 
9498 
9499    procedure build_tl_update_stmt (p_dimension_varchar_label IN VARCHAR2
9500                                 ,p_dimension_id IN NUMBER
9501                                 ,p_load_type IN VARCHAR2
9502                                 ,p_target_b_table IN VARCHAR2
9503                                 ,p_target_tl_table IN VARCHAR2
9504                                 ,p_member_col IN VARCHAR2
9505                                 ,p_member_dc_col IN VARCHAR2
9506                                 ,p_member_name_col IN VARCHAR2
9507                                 ,p_member_description_col IN VARCHAR2
9508                                 ,p_value_set_required_flag IN VARCHAR2
9509                                 ,x_update_stmt OUT NOCOPY VARCHAR2)
9510 
9511     IS
9512 
9513        v_dim_id_where_cond VARCHAR2(1000);
9514 
9515      BEGIN
9516         FEM_ENGINES_PKG.TECH_MESSAGE
9517          (c_log_level_2,c_block||'.'||
9518           'build_tl_update_stmt','Begin Build update statement for TL table');
9519 
9520         IF p_load_type IN ('DIMENSION_GROUP') THEN
9521            v_dim_id_where_cond := ' AND dimension_id = '||p_dimension_id;
9522         ELSE
9523            v_dim_id_where_cond := '';
9524         END IF;
9525 
9526         IF (p_dimension_varchar_label = 'CAL_PERIOD') AND
9527          p_load_type NOT IN ('DIMENSION_GROUP') THEN
9528 
9529         x_update_stmt :=
9530         'UPDATE '||p_target_tl_table||
9531            ' SET '||p_member_name_col||' = :b_member_name,'||
9532            p_member_description_col||' = :b_member_desc'||
9533            ',source_lang = :b_source_lang'||
9534            ',last_update_date = sysdate '||
9535            ',last_updated_by = :b_apps_user_id'||
9536            ',last_update_login = :b_login_id'||
9537            ' WHERE to_char('||p_member_col||') = :b_member_code'||
9538            ' AND language = :b_language'||
9539            ' AND :b_status = ''LOAD''';
9540 
9541         ELSIF (p_value_set_required_flag = 'Y') AND
9542          p_load_type NOT IN ('DIMENSION_GROUP') THEN
9543 
9544         x_update_stmt :=
9545         'UPDATE '||p_target_tl_table||
9546            ' SET '||p_member_name_col||' = :b_member_name,'||
9547            p_member_description_col||' = :b_member_desc'||
9548            ',source_lang = :b_source_lang'||
9549            ',last_update_date = sysdate '||
9550            ',last_updated_by = :b_apps_user_id'||
9551            ',last_update_login = :b_login_id'||
9552            ' WHERE '||p_member_col||' = (SELECT T.'||p_member_col||
9553            ' FROM '||p_target_b_table||' T'||
9554            ',fem_value_sets_b V'||
9555            ' WHERE to_char(T.'||p_member_dc_col||') = :b_member_display_code'||
9556            ' AND T.value_set_id = V.value_set_id'||
9557            ' AND V.value_set_display_code = :b_value_set_display_code'||
9558            ')'||
9559            ' AND value_set_id = (SELECT value_set_id FROM FEM_VALUE_SETS_B'||
9560            ' WHERE value_set_display_code = :b_value_set_display_code)'||
9561            ' AND language = :b_language'||
9562            ' AND :b_status = ''LOAD''';
9563 
9564 
9565         ELSE
9566 
9567         x_update_stmt :=
9568         'UPDATE '||p_target_tl_table||
9569            ' SET '||p_member_name_col||' = :b_member_name,'||
9570            p_member_description_col||' = :b_member_desc'||
9571            ',source_lang = :b_source_lang'||
9572            ',last_update_date = sysdate '||
9573            ',last_updated_by = :b_apps_user_id'||
9574            ',last_update_login = :b_login_id'||
9575            ' WHERE '||p_member_col||' = (SELECT '||p_member_col||
9576            ' FROM '||p_target_b_table||
9577            ' WHERE to_char('||p_member_dc_col||') = :b_member_display_code'||
9578            v_dim_id_where_cond||
9579            ')'||
9580            ' AND language = :b_language'||
9581            ' AND :b_status = ''LOAD''';
9582 
9583         END IF;
9584         FEM_ENGINES_PKG.TECH_MESSAGE
9585          (c_log_level_2,c_block||'.'||
9586           'build_tl_update_stmt','End');
9587 
9588      END build_tl_update_stmt;
9589 
9590 
9591 /*===========================================================================+
9592  | PROCEDURE
9593  |              BUILD_ATTR_LVLSPEC_SELECT_STMT
9594  |
9595  | DESCRIPTION
9596  |                 Procedure for building the dynamic SELECT statement for
9597  |                 retrieving attribute rows from the ATTR_T table
9598  |                 where the attribute is level specific but the member
9599  |                 does not belong to the level.  This is so we can update
9600  |                 the row with status = 'INVALID_LVL_SPEC_ATTR_LABEL'.
9601  |
9602  | SCOPE - PRIVATE
9603  |
9604  | NOTES
9605  |
9606  |
9607  | MODIFICATION HISTORY
9608  |    Rob Flippo   09-JUN-05  Created
9609  |
9610  +===========================================================================*/
9611 
9612    procedure build_attr_lvlspec_select_stmt (p_dimension_varchar_label IN VARCHAR2
9613                                 ,p_dimension_id IN NUMBER
9614                                 ,p_source_b_table IN VARCHAR2
9615                                 ,p_source_attr_table IN VARCHAR2
9616                                 ,p_target_b_table IN VARCHAR2
9617                                 ,p_member_t_dc_col IN VARCHAR2
9618                                 ,p_member_dc_col IN VARCHAR2
9619                                 ,p_value_set_required_flag IN VARCHAR2
9620                                 ,p_shared_dimension_flag IN VARCHAR2
9621                                 ,p_hier_dimension_flag IN VARCHAR2
9622                                 ,p_outer_join_flag IN VARCHAR2
9623                                 ,p_exec_mode_clause IN VARCHAR2
9624                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
9625    IS
9626       -- Value Set where conditions
9627       v_value_set_where_cond       VARCHAR2(1000);
9628       v_value_set_select_T1         VARCHAR2(1000);
9629       v_value_set_select_T2         VARCHAR2(1000);
9630       v_vs_where_M2               VARCHAR2(1000);  -- where condition for Specific Member='No'
9631       v_vs_table                  VARCHAR2(1000);
9632 
9633       -- Special conditions to handle CAL_PERIOD
9634       v_member_code                VARCHAR2(1000);
9635       v_calendar_id                VARCHAR2(100);
9636       v_calendar_table             VARCHAR2(100);
9637       v_calendar_where_cond        VARCHAR2(1000);
9638       v_member_dc_where_cond       VARCHAR2(1000);
9639 
9640       -- additional conditions
9641       v_outer_join                 VARCHAR2(3);
9642       v_dim_label_where_cond       VARCHAR2(1000);
9643 
9644 
9645    BEGIN
9646         FEM_ENGINES_PKG.TECH_MESSAGE
9647          (c_log_level_2,c_block||'.'||
9648           'build_attr_lvlspec_select_stmt',
9649           'Begin Build select statement for level specific attribute assignments from source _ATTR_T table');
9650 
9651       IF p_outer_join_flag = 'Y' THEN
9652          v_outer_join := '(+)';
9653       ELSE
9654          v_outer_join := '';
9655       END IF; -- p_outer_join_flag
9656 
9657       IF p_shared_dimension_flag = 'Y' THEN
9658          v_dim_label_where_cond  :=
9659             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
9660       ELSE
9661          v_dim_label_where_cond := '';
9662       END IF;
9663 
9664 
9665       IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
9666 
9667          v_member_code :=
9668                'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
9669                'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
9670                'LPAD(to_char(C.calendar_id),5,''0'')||'||
9671                'LPAD(to_char(D.time_dimension_group_key),5,''0'') ';
9672 
9673            x_attr_select_stmt :=
9674            'SELECT T2.base_rowid'||
9675            ' ,''INVALID_LVL_SPEC_ATTR_LABEL'' '||
9676            ' FROM fem_dim_attributes_b A1'||
9677            ',fem_dim_attr_versions_b V1'||
9678            ',fem_dimensions_b B1'||
9679            ',(SELECT B.rowid base_rowid'||
9680            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
9681            ', B.cal_period_number CAL_PERIOD_NUMBER'||
9682            ', C.calendar_id CALENDAR_ID'||
9683            ', C.calendar_display_code CALENDAR_DC'||
9684            ', D.dimension_group_id DIMENSION_GROUP_ID'||
9685            ', D.dimension_group_display_code DIMENSION_GROUP_DC'||
9686            ', B.version_display_code'||
9687     	   ', B.attribute_assign_value'||
9688 	       ', B.attr_assign_vs_display_code'||
9689 	       ', B.cal_period_end_date'||
9690            ', B.CALPATTR_CAL_DISPLAY_CODE'||
9691            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
9692            ', B.CALPATTR_END_DATE'||
9693            ', B.CALPATTR_PERIOD_NUM'||
9694            ' FROM '||p_source_attr_table||' B'||
9695            ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D'||
9696            ' WHERE B.calendar_display_code = C.calendar_display_code '||
9697            ' AND B.status'||p_exec_mode_clause||
9698            ' AND   {{data_slice}} '||
9699            ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
9700            ' AND D.dimension_id = '||p_dimension_id||') T2'||
9701            ', '||p_target_b_table||' M2'||
9702            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
9703            ' AND B1.dimension_id = A1.dimension_id'||
9704            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
9705            ' AND T2.version_display_code = V1.version_display_code'||
9706            ' AND V1.attribute_id = A1.attribute_id'||
9707            ' AND V1.aw_snapshot_flag = ''N'''||
9708            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
9709            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
9710            ' AND ('||
9711            ' ((A1.attribute_required_flag =''N'') '||
9712            ' AND (A1.attribute_id IN (SELECT attribute_id'||
9713            ' FROM fem_dim_attr_grps AG2)))'||
9714            ' AND (A1.attribute_id NOT IN (SELECT attribute_id'||
9715            ' FROM fem_dim_attr_grps AG3'||
9716            ' WHERE AG3.dimension_group_id = T2.dimension_group_id)))';
9717 
9718       ELSE -- not a Cal Period
9719          v_member_code := p_member_t_dc_col;
9720 
9721          IF (p_hier_dimension_flag = 'Y')
9722             AND (p_value_set_required_flag = 'Y') THEN
9723 
9724            x_attr_select_stmt :=
9725            'SELECT T2.base_rowid'||
9726            ' ,''INVALID_LVL_SPEC_ATTR_LABEL'' '||
9727            ' FROM fem_dim_attributes_b A1'||
9728            ',fem_dim_attr_versions_b V1'||
9729            ',fem_dimensions_b B1'||
9730            ',(SELECT B.rowid base_rowid'||
9731            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
9732            ', B.value_set_display_code'||
9733            ', B.version_display_code'||
9734      	   ', B.attribute_assign_value'||
9735 	       ', B.attr_assign_vs_display_code'||
9736            ', B.CALPATTR_CAL_DISPLAY_CODE'||
9737            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
9738            ', B.CALPATTR_END_DATE'||
9739            ', B.CALPATTR_PERIOD_NUM'||
9740            ' FROM '||p_source_attr_table||' B'||
9741            ' WHERE B.status'||p_exec_mode_clause||
9742            ' AND   {{data_slice}} '||
9743            ') T2'||
9744            ', '||p_target_b_table||' M2'||
9745            ', fem_value_sets_b V2'||
9746            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
9747            ' AND B1.dimension_id = A1.dimension_id'||
9748            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
9749            ' AND T2.version_display_code = V1.version_display_code'||
9750            ' AND V1.attribute_id = A1.attribute_id'||
9751            ' AND V1.aw_snapshot_flag = ''N'''||
9752            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
9753            ' AND M2.value_set_id = V2.value_set_id '||
9754            ' AND V2.value_set_display_code = T2.value_set_display_code'||
9755            ' AND V2.dimension_id = '||p_dimension_id||
9756            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
9757            ' AND ('||
9758            ' ((A1.attribute_required_flag =''N'') '||
9759            ' AND (A1.attribute_id IN (SELECT attribute_id'||
9760            ' FROM fem_dim_attr_grps AG2)))'||
9761            ' AND (A1.attribute_id NOT IN (SELECT attribute_id'||
9762            ' FROM fem_dim_attr_grps AG3'||
9763            ' WHERE AG3.dimension_group_id = M2.dimension_group_id)))';
9764 
9765          ELSIF (p_hier_dimension_flag = 'Y')
9766             AND (p_value_set_required_flag = 'N') THEN
9767 
9768            x_attr_select_stmt :=
9769            'SELECT T2.base_rowid'||
9770            ' ,''INVALID_LVL_SPEC_ATTR_LABEL'' '||
9771            ' FROM fem_dim_attributes_b A1'||
9772            ',fem_dim_attr_versions_b V1'||
9773            ',fem_dimensions_b B1'||
9774            ',(SELECT B.rowid base_rowid'||
9775            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
9776            ', B.version_display_code'||
9777      	   ', B.attribute_assign_value'||
9778 	       ', B.attr_assign_vs_display_code'||
9779            ', B.CALPATTR_CAL_DISPLAY_CODE'||
9780            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
9781            ', B.CALPATTR_END_DATE'||
9782            ', B.CALPATTR_PERIOD_NUM'||
9783            ' FROM '||p_source_attr_table||' B'||
9784            ' WHERE B.status'||p_exec_mode_clause||
9785            v_dim_label_where_cond||
9786            ' AND   {{data_slice}} '||
9787            ') T2'||
9788            ', '||p_target_b_table||' M2'||
9789            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
9790            ' AND B1.dimension_id = A1.dimension_id'||
9791            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
9792            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
9793            ' AND T2.version_display_code = V1.version_display_code'||
9794            ' AND V1.attribute_id = A1.attribute_id'||
9795            ' AND V1.aw_snapshot_flag = ''N'''||
9796            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
9797            ' AND ('||
9798            ' ((A1.attribute_required_flag =''N'') '||
9799            ' AND (A1.attribute_id IN (SELECT attribute_id'||
9800            ' FROM fem_dim_attr_grps AG2)))'||
9801            ' AND (A1.attribute_id NOT IN (SELECT attribute_id'||
9802            ' FROM fem_dim_attr_grps AG3'||
9803            ' WHERE AG3.dimension_group_id = M2.dimension_group_id)))';
9804 
9805          END IF;
9806       END IF; -- IF Cal Period 'Y' or 'N'
9807 
9808 
9809         FEM_ENGINES_PKG.TECH_MESSAGE
9810          (c_log_level_2,c_block||'.'||
9811           'build_attr_lvlspec_select_stmt',
9812           'End');
9813 
9814 
9815    END build_attr_lvlspec_select_stmt;
9816 
9817 
9818 
9819 /*===========================================================================+
9820  | PROCEDURE
9821  |              BUILD_ATTR_SELECT_STMT
9822  |
9823  | DESCRIPTION
9824  |                 Procedure for building the dynamic SELECT statement for
9825  |                 retrieving attribute rows from the ATTR_T table
9826  |                 along with the corresponding attribute metadata from
9827  |                 FEM_DIM_ATTRIBUTES_B
9828  |
9829  | SCOPE - PRIVATE
9830  |
9831  | NOTES
9832  |    Procedure is split into 4 sections:
9833  |       For CAL Period - getting for new specific member
9834  |                        getting only where member exists, but multiple members
9835  |       For Value Set Dim - getting for new specific member
9836  |                           getting only where member exists but mult members
9837  |
9838  |       When getting for new specific member:
9839  |          Only get default version of 'Req' attributes
9840  |
9841  |       This means that when processing new members, only required attributes
9842  |       are read.  All other attribute assignments get loaded only after
9843  |       the member is already created.
9844  |
9845  |
9846  | MODIFICATION HISTORY
9847  |    Rob Flippo   23-OCT-03  Created
9848  |    Rob Flippo   13-SEP-04  Modified so that when looking for required attributes
9849  |                            (in the specific member select), we don't care if
9850  |                            any rows exist in FEM_DIM_ATTR_GRPS, because Req
9851  |                            attributes not allowed to be assigned in that table
9852  |                            However, when specific_member = 'N', we do need to
9853  |                            check FEM_DIM_ATTR_GRPS.
9854  |
9855  |                            The logic for checking is as follows:
9856  |                            If attribute_required_flag = 'N', then we
9857  |                            check FEM_DIM_ATTR_GRPS to see if it has been
9858  |                            assigned specifically to any groups.  But if the
9859  |                            attribute_required_flag='Y', then we don't check.
9860  |
9861  |                            Also - modified all of the queries to join with the
9862  |                            fem_dim_attr_versions_b table and restrict on min(version_id)
9863  |                            Previously, this was only occuring for specific_member='Y'.
9864  |                            This needs to occur for every attribute query since
9865  |                            the pre_validation_attr procedure already exists to mark
9866  |                            rows with invalid version_display_code.
9867  |   Rob Flippo   01-OCT-04   Modified query to retieve member read_only_flag
9868  |                            for the "specific_member=Y" queries (i.e., the queries used
9869  |                            by the attr_assign_update procedure to update attr
9870  |                            of existing members);  For "specific_member=N", it returns
9871  |                            null for that flag;
9872  |   Rob Flippo   12-NOV-04   Add where condition on aw_snapshot_flag = 'N' so that
9873  |                            users can't try to update snapshot versions using the
9874  |                            loader
9875  |   Rob Flippo   04-JAN-05   For CAL_PERIOD, added a new column
9876  |                            to the select for "use_interim_table_flag = Y".  This
9877  |                            info is only queried during the ATTR_ASSIGN_UPDATE
9878  |                            to identify any CAL Period attributes that require
9879  |                            use of the FEM_CALP_ATTR_INTERIM_T table prior to
9880  |                            moving the assignment into FEM
9881  |
9882  |                            Also added selection of new columns for Spec Mbr =N
9883  |                            for CAL_PERIOD so that we have enough information to
9884  |                            insert into the INTERIM tables for overlap checking
9885  |
9886  |                            Bug#3822561  Added 4 new CALPATTR columns to all
9887  |                            Select statements to support attributes of CAL_PERIOD
9888  |
9889  |                            Also - for non-value set dims, added where condition
9890  |                            for dimension_varchar_label if the dim uses the shared
9891  |                            attr table
9892  |   Rob Flippo   15-MAR-05   Bug#4226011 Modified to only retreive attributes where
9893  |                            user_assign_allowed_flag not in ('N');
9894  |   Rob Flippo   09-JUN-05   Modify for Specific_mbr_flag='N' case
9895  |                            where dim supports levels (hier_flag=Y)
9896  |                            but is value_set_required='N'
9897  |   Rob Flippo   11-AUG-05   Bug#4547868 get member_id and value_set_id
9898  |                            for the attr_update phase
9899  +===========================================================================*/
9900 
9901    procedure build_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
9902                                 ,p_dimension_id IN NUMBER
9903                                 ,p_source_b_table IN VARCHAR2
9904                                 ,p_source_attr_table IN VARCHAR2
9905                                 ,p_target_b_table IN VARCHAR2
9906                                 ,p_member_t_dc_col IN VARCHAR2
9907                                 ,p_member_dc_col IN VARCHAR2
9908                                 ,p_member_col IN VARCHAR2
9909                                 ,p_value_set_required_flag IN VARCHAR2
9910                                 ,p_shared_dimension_flag IN VARCHAR2
9911                                 ,p_hier_dimension_flag IN VARCHAR2
9912                                 ,p_outer_join_flag IN VARCHAR2
9913                                 ,p_specific_member_flag IN VARCHAR2
9914                                 ,p_exec_mode_clause IN VARCHAR2
9915                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
9916    IS
9917       -- Value Set where conditions
9918       v_value_set_where_cond       VARCHAR2(1000);
9919       v_value_set_select_T1         VARCHAR2(1000);
9920       v_value_set_select_T2         VARCHAR2(1000);
9921       v_vs_where_M2               VARCHAR2(1000);  -- where condition for Specific Member='No'
9922       v_vs_table                  VARCHAR2(1000);
9923 
9924       -- Special conditions to handle CAL_PERIOD
9925       v_member_code                VARCHAR2(1000);
9926       v_calendar_id                VARCHAR2(100);
9927       v_calendar_table             VARCHAR2(100);
9928       v_calendar_where_cond        VARCHAR2(1000);
9929       v_member_dc_where_cond       VARCHAR2(1000);
9930 
9931       -- additional conditions
9932       v_outer_join                 VARCHAR2(3);
9933       v_dim_label_where_cond       VARCHAR2(1000);
9934       v_spcmbr_dim_label_where_cond    VARCHAR2(1000);
9935 
9936 
9937    BEGIN
9938         FEM_ENGINES_PKG.TECH_MESSAGE
9939          (c_log_level_2,c_block||'.'||
9940           'build_attr_select_stmt',
9941           'Begin Build select statement for attributes from source _ATTR_T table');
9942 
9943       -- The Specific Member Flag indicates if we are looking for attributes of a
9944       -- given Member ID and Value Set where attribute_required_flag = 'Y'.
9945       -- If we are not looking for a specific member, then we are looking only
9946       -- for attributes where the member already exists
9947       -- The SQL for "specific Member" is used when creating new members,
9948       -- since it does not require that the member exist, and also only gets
9949       -- attr assignments for the "default" version
9950 
9951 
9952       IF p_outer_join_flag = 'Y' THEN
9953          v_outer_join := '(+)';
9954       ELSE
9955          v_outer_join := '';
9956       END IF; -- p_outer_join_flag
9957 
9958       IF p_shared_dimension_flag = 'Y' THEN
9959          v_dim_label_where_cond  :=
9960             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
9961          v_spcmbr_dim_label_where_cond :=
9962             ' AND S1.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
9963       ELSE
9964          v_dim_label_where_cond := '';
9965          v_spcmbr_dim_label_where_cond := '';
9966       END IF;
9967 
9968 /*
9969       IF p_value_set_required_flag = 'Y' THEN
9970         v_value_set_where_cond := ' AND T2.value_set_display_code'||v_outer_join||' = :b_value_set_display_code';
9971         v_value_set_select_T1     := ', T1.value_set_display_code';
9972         v_value_set_select_T2     := ', T2.value_set_display_code';
9973         v_vs_where_M2  := ' AND M2.value_set_id = V2.value_set_id '||
9974                           ' AND V2.value_set_display_code = T2.value_set_display_code';
9975         v_vs_table     := ', fem_value_sets_b V2';
9976 
9977 
9978       ELSE
9979         v_value_set_where_cond       := '';
9980         v_value_set_select_T1           := ',null';
9981         v_value_set_select_T2           := ',null';
9982         v_vs_where_M2                   := '';
9983         v_vs_table                      := '';
9984 
9985       END IF; */
9986 
9987       IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
9988 
9989          v_member_code :=
9990                'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
9991                'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
9992                'LPAD(to_char(C.calendar_id),5,''0'')||'||
9993                'LPAD(to_char(D.time_dimension_group_key),5,''0'') ';
9994 /*
9995          v_calendar_id    := ', C.calendar_id';
9996          v_calendar_table := ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D';
9997          v_calendar_where_cond := ' WHERE T1.calendar_display_code = C.calendar_display_code '||
9998                                   ' AND T1.dimension_group_display_code = D.dimension_group_display_code';
9999 */
10000 
10001          IF (p_specific_member_flag = 'Y') THEN
10002          -- Data_slc predicate does not apply
10003            x_attr_select_stmt :=
10004            'SELECT T2.base_rowid'||
10005            ' ,null'||
10006            ' ,A1.attribute_id'||
10007            ' ,A1.attribute_varchar_label'||
10008            ' ,A1.attribute_dimension_id'||
10009            ' ,A1.attribute_value_column_name'||
10010            ' ,A1.attribute_data_type_code'||
10011            ' ,A1.attribute_required_flag'||
10012            ' ,A1.assignment_is_read_only_flag'||
10013            ' ,A1.allow_multiple_versions_flag'||
10014            ' ,A1.allow_multiple_assignment_flag'||
10015            ' ,T2.member_code'||
10016            ' ,null'||
10017            ' ,T2.attribute_assign_value'||
10018            ' ,null, null, null, null, null'||
10019            ' ,T2.version_display_code, null'||
10020            ' ,T2.attr_assign_vs_display_code, null'||
10021            ' ,''LOAD'''||
10022            ',''Y'''||
10023            ', T2.CALPATTR_CAL_DISPLAY_CODE'||
10024            ', T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10025            ', T2.CALPATTR_END_DATE'||
10026            ', T2.CALPATTR_PERIOD_NUM'||
10027            ' FROM fem_dim_attributes_b A1'||
10028            ',fem_dim_attr_versions_b V1'||
10029            ',fem_dimensions_b B1'||
10030            ',(SELECT B.rowid base_rowid'||
10031            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10032            ', D.dimension_group_id'||
10033            ', B.version_display_code'||
10034       	   ', B.attribute_assign_value'||
10035     	   ', B.attr_assign_vs_display_code'||
10036            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10037            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10038            ', B.CALPATTR_END_DATE'||
10039            ', B.CALPATTR_PERIOD_NUM'||
10040            ' FROM '||p_source_attr_table||' B'||
10041            ','||p_source_b_table||' S1'||
10042            ', fem_dimension_grps_b D'||
10043            ', FEM_CALENDARS_VL C'||
10044            ' WHERE B.calendar_display_code = C.calendar_display_code'||
10045            ' AND S1.calendar_display_code = B.calendar_display_code'||
10046            ' AND S1.dimension_group_display_code = B.dimension_group_display_code'||
10047            ' AND S1.cal_period_end_date = B.cal_period_end_date'||
10048            ' AND S1.cal_period_number = B.cal_period_number'||
10049            ' AND B.status'||p_exec_mode_clause||
10050            ' AND S1.dimension_group_display_code = D.dimension_group_display_code'||
10051            ' AND D.dimension_id = '||p_dimension_id||') T2'||
10052            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10053            ' AND T2.member_code '||v_outer_join||' = :b_member_display_code'||
10054            ' AND B1.dimension_id = A1.dimension_id'||
10055            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10056            ' AND T2.version_display_code = V1.version_display_code'||
10057            ' AND V1.version_id IN (SELECT min(version_id) FROM fem_dim_attr_versions_b V3'||
10058            ' WHERE V3.default_version_flag = ''Y'''||
10059            ' AND V3.aw_snapshot_flag = ''N'''||
10060            ' AND V3.attribute_id = A1.attribute_id)'||
10061            ' AND A1.attribute_id = V1.attribute_id'||
10062            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10063            ' AND A1.attribute_required_flag = ''Y''';
10064 
10065 
10066          ELSE
10067            x_attr_select_stmt :=
10068            'SELECT T2.base_rowid'||
10069            ' ,M2.read_only_flag'||
10070            ' ,A1.attribute_id'||
10071            ' ,A1.attribute_varchar_label'||
10072            ' ,A1.attribute_dimension_id'||
10073            ' ,A1.attribute_value_column_name'||
10074            ' ,A1.attribute_data_type_code'||
10075            ' ,A1.attribute_required_flag'||
10076            ' ,A1.assignment_is_read_only_flag'||
10077            ' ,A1.allow_multiple_versions_flag'||
10078            ' ,A1.allow_multiple_assignment_flag'||
10079            ' ,T2.member_code'||
10080            ' ,null'||
10081            ' ,T2.member_code'||
10082            ' ,null'||
10083            ' ,T2.attribute_assign_value'||
10084            ' ,null, null, null, null, null'||
10085            ' ,T2.version_display_code, null'||
10086            ' ,T2.attr_assign_vs_display_code, null'||
10087            ' ,T2.cal_period_end_date'||
10088            ' ,''LOAD'' '||
10089            ',decode(A1.attribute_varchar_label,''CAL_PERIOD_START_DATE'',''Y'',''N'')'||
10090            ' ,T2.cal_period_number'||
10091            ' ,T2.calendar_dc'||
10092            ' ,T2.calendar_id'||
10093            ' ,T2.dimension_group_dc'||
10094            ' ,T2.dimension_group_id'||
10095            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10096            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10097            ' ,T2.CALPATTR_END_DATE'||
10098            ' ,T2.CALPATTR_PERIOD_NUM'||
10099            ' FROM fem_dim_attributes_b A1'||
10100            ',fem_dim_attr_versions_b V1'||
10101            ',fem_dimensions_b B1'||
10102            ',(SELECT B.rowid base_rowid'||
10103            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10104            ', B.cal_period_number CAL_PERIOD_NUMBER'||
10105            ', C.calendar_id CALENDAR_ID'||
10106            ', C.calendar_display_code CALENDAR_DC'||
10107            ', D.dimension_group_id DIMENSION_GROUP_ID'||
10108            ', D.dimension_group_display_code DIMENSION_GROUP_DC'||
10109            ', B.version_display_code'||
10110     	   ', B.attribute_assign_value'||
10111 	       ', B.attr_assign_vs_display_code'||
10112 	       ', B.cal_period_end_date'||
10113            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10114            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10115            ', B.CALPATTR_END_DATE'||
10116            ', B.CALPATTR_PERIOD_NUM'||
10117            ' FROM '||p_source_attr_table||' B'||
10118            ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D'||
10119            ' WHERE B.calendar_display_code = C.calendar_display_code '||
10120            ' AND B.status'||p_exec_mode_clause||
10121            ' AND   {{data_slice}} '||
10122            ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
10123            ' AND D.dimension_id = '||p_dimension_id||') T2'||
10124            ', '||p_target_b_table||' M2'||
10125            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10126            ' AND B1.dimension_id = A1.dimension_id'||
10127            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10128            ' AND T2.version_display_code = V1.version_display_code'||
10129            ' AND V1.attribute_id = A1.attribute_id'||
10130            ' AND V1.aw_snapshot_flag = ''N'''||
10131            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10132            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10133            ' AND (((A1.attribute_required_flag = ''Y''))'||
10134            ' OR ((A1.attribute_required_flag =''N'') AND '||
10135            ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10136            ' FROM fem_dim_attr_grps AG1))'||
10137            ' OR (A1.attribute_id IN (SELECT attribute_id'||
10138            ' FROM fem_dim_attr_grps AG2'||
10139            ' WHERE AG2.dimension_group_id = T2.dimension_group_id))))';
10140 
10141 
10142          END IF; -- specific member flag 'Y' or 'N' for Cal Period
10143 
10144       ELSE -- not a Cal Period
10145          v_member_code := p_member_t_dc_col;
10146 /*
10147          v_calendar_id := '';
10148          v_calendar_table := '';
10149          v_calendar_where_cond := '';
10150          v_member_dc_where_cond := ' AND B.'||p_member_t_dc_col||
10151                                    '=T.'||p_member_t_dc_col; */
10152 
10153 
10154          IF (p_specific_member_flag = 'Y')
10155             AND ((p_hier_dimension_flag = 'Y') OR (p_hier_dimension_flag = 'N'))
10156             AND (p_value_set_required_flag = 'Y') THEN
10157          -- Data_slc predicate does not apply
10158            x_attr_select_stmt :=
10159            'SELECT T2.base_rowid'||
10160            ' ,null'||
10161            ' ,A1.attribute_id'||
10162            ' ,A1.attribute_varchar_label'||
10163            ' ,A1.attribute_dimension_id'||
10164            ' ,A1.attribute_value_column_name'||
10165            ' ,A1.attribute_data_type_code'||
10166            ' ,A1.attribute_required_flag'||
10167            ' ,A1.assignment_is_read_only_flag'||
10168            ' ,A1.allow_multiple_versions_flag'||
10169            ' ,A1.allow_multiple_assignment_flag'||
10170            ',T2.member_code'||
10171            ', T2.value_set_display_code'||
10172            ' ,T2.attribute_assign_value'||
10173            ' ,null, null, null, null, null'||
10174            ' ,T2.version_display_code, null'||
10175            ' ,T2.attr_assign_vs_display_code, null'||
10176            ' ,''LOAD'' '||
10177            ' ,''N'''||
10178            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10179            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10180            ' ,T2.CALPATTR_END_DATE'||
10181            ' ,T2.CALPATTR_PERIOD_NUM'||
10182            ' FROM fem_dim_attributes_b A1'||
10183            ',fem_dim_attr_versions_b V1'||
10184            ',fem_dimensions_b B1'||
10185            ',(SELECT B.rowid base_rowid'||
10186            ', B.attribute_varchar_label,B.'||v_member_code||' MEMBER_CODE'||
10187            ', B.value_set_display_code'||
10188            ', B.version_display_code'||
10189       	   ', B.attribute_assign_value'||
10190     	   ', B.attr_assign_vs_display_code'||
10191            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10192            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10193            ', B.CALPATTR_END_DATE'||
10194            ', B.CALPATTR_PERIOD_NUM'||
10195            ' FROM '||p_source_attr_table||' B'||
10196            ','||p_source_b_table||' S1'||
10197            ' WHERE S1.'||v_member_code||' = B.'||v_member_code||
10198            ' AND S1.value_set_display_code = B.value_set_display_code'||
10199            ' AND B.status'||p_exec_mode_clause||') T2 '||
10200            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10201            ' AND T2.member_code '||v_outer_join||' = :b_member_display_code'||
10202            ' AND B1.dimension_id = A1.dimension_id'||
10203            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10204            ' AND T2.version_display_code = V1.version_display_code'||
10205            ' AND V1.version_id IN (SELECT min(version_id) FROM fem_dim_attr_versions_b V3'||
10206            ' WHERE V3.default_version_flag = ''Y'''||
10207            ' AND V3.aw_snapshot_flag = ''N'''||
10208            ' AND V3.attribute_id = A1.attribute_id)'||
10209            ' AND A1.attribute_id = V1.attribute_id'||
10210            ' AND T2.value_set_display_code'||v_outer_join||' = :b_value_set_display_code'||
10211            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10212            ' AND A1.attribute_required_flag = ''Y''';
10213 
10214 
10215          ELSIF (p_specific_member_flag = 'Y')
10216             AND ((p_hier_dimension_flag = 'N') OR (p_hier_dimension_flag = 'Y'))
10217             AND (p_value_set_required_flag = 'N') THEN
10218          -- Data_slc predicate does not apply
10219            x_attr_select_stmt :=
10220            'SELECT T2.base_rowid'||
10221            ' ,null'||
10222            ' ,A1.attribute_id'||
10223            ' ,A1.attribute_varchar_label'||
10224            ' ,A1.attribute_dimension_id'||
10225            ' ,A1.attribute_value_column_name'||
10226            ' ,A1.attribute_data_type_code'||
10227            ' ,A1.attribute_required_flag'||
10228            ' ,A1.assignment_is_read_only_flag'||
10229            ' ,A1.allow_multiple_versions_flag'||
10230            ' ,A1.allow_multiple_assignment_flag'||
10231            ',T2.member_code'||
10232            ', null'||
10233            ' ,T2.attribute_assign_value'||
10234            ' ,null, null, null, null, null'||
10235            ' ,T2.version_display_code, null'||
10236            ' ,T2.attr_assign_vs_display_code, null'||
10237            ' ,''LOAD'' '||
10238            ' ,''N'''||
10239            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10240            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10241            ' ,T2.CALPATTR_END_DATE'||
10242            ' ,T2.CALPATTR_PERIOD_NUM'||
10243            ' FROM fem_dim_attributes_b A1'||
10244            ',fem_dim_attr_versions_b V1'||
10245            ',fem_dimensions_b B1'||
10246            ',(SELECT B.rowid base_rowid'||
10247            ', B.attribute_varchar_label,B.'||v_member_code||' MEMBER_CODE'||
10248            ', B.version_display_code'||
10249       	   ', B.attribute_assign_value'||
10250     	   ', B.attr_assign_vs_display_code'||
10251            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10252            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10253            ', B.CALPATTR_END_DATE'||
10254            ', B.CALPATTR_PERIOD_NUM'||
10255            ' FROM '||p_source_attr_table||' B'||
10256            ','||p_source_b_table||' S1'||
10257            ' WHERE S1.'||v_member_code||' = B.'||v_member_code||
10258            v_dim_label_where_cond||
10259            v_spcmbr_dim_label_where_cond||
10260            ' AND B.status'||p_exec_mode_clause||') T2 '||
10261            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10262            ' AND T2.member_code '||v_outer_join||' = :b_member_display_code'||
10263            ' AND B1.dimension_id = A1.dimension_id'||
10264            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10265            ' AND T2.version_display_code = V1.version_display_code'||
10266            ' AND V1.version_id IN (SELECT min(version_id) FROM fem_dim_attr_versions_b V3'||
10267            ' WHERE V3.default_version_flag = ''Y'''||
10268            ' AND V3.aw_snapshot_flag = ''N'''||
10269            ' AND V3.attribute_id = A1.attribute_id)'||
10270            ' AND A1.attribute_id = V1.attribute_id'||
10271            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10272            ' AND A1.attribute_required_flag = ''Y''';
10273 
10274 
10275          ELSIF (p_specific_member_flag = 'N')
10276             AND (p_hier_dimension_flag = 'Y')
10277             AND (p_value_set_required_flag = 'Y') THEN
10278 
10279            x_attr_select_stmt :=
10280            'SELECT T2.base_rowid'||
10281            ' ,M2.read_only_flag'||
10282            ' ,A1.attribute_id'||
10283            ' ,A1.attribute_varchar_label'||
10284            ' ,A1.attribute_dimension_id'||
10285            ' ,A1.attribute_value_column_name'||
10286            ' ,A1.attribute_data_type_code'||
10287            ' ,A1.attribute_required_flag'||
10288            ' ,A1.assignment_is_read_only_flag'||
10289            ' ,A1.allow_multiple_versions_flag'||
10290            ' ,A1.allow_multiple_assignment_flag'||
10291            ',T2.member_code'||
10292            ', T2.value_set_display_code'||
10293            ', M2.'||p_member_col||
10294            ', M2.value_set_id'||
10295            ' ,T2.attribute_assign_value'||
10296            ' ,null, null, null, null, null'||
10297            ' ,T2.version_display_code, null'||
10298            ' ,T2.attr_assign_vs_display_code, null,null'||
10299            ' ,''LOAD'' '||
10300            ' ,''N'''||
10301            ' ,null'||
10302            ' ,null'||
10303            ' ,null'||
10304            ' ,null'||
10305            ' ,null'||
10306            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10307            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10308            ' ,T2.CALPATTR_END_DATE'||
10309            ' ,T2.CALPATTR_PERIOD_NUM'||
10310            ' FROM fem_dim_attributes_b A1'||
10311            ',fem_dim_attr_versions_b V1'||
10312            ',fem_dimensions_b B1'||
10313            ',(SELECT B.rowid base_rowid'||
10314            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10315            ', B.value_set_display_code'||
10316            ', B.version_display_code'||
10317      	   ', B.attribute_assign_value'||
10318 	       ', B.attr_assign_vs_display_code'||
10319            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10320            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10321            ', B.CALPATTR_END_DATE'||
10322            ', B.CALPATTR_PERIOD_NUM'||
10323            ' FROM '||p_source_attr_table||' B'||
10324            ' WHERE B.status'||p_exec_mode_clause||
10325            ' AND   {{data_slice}} '||
10326            ') T2'||
10327            ', '||p_target_b_table||' M2'||
10328            ', fem_value_sets_b V2'||
10329            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10330            ' AND B1.dimension_id = A1.dimension_id'||
10331            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10332            ' AND T2.version_display_code = V1.version_display_code'||
10333            ' AND V1.attribute_id = A1.attribute_id'||
10334            ' AND V1.aw_snapshot_flag = ''N'''||
10335            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10336            ' AND M2.value_set_id = V2.value_set_id '||
10337            ' AND V2.value_set_display_code = T2.value_set_display_code'||
10338            ' AND V2.dimension_id = '||p_dimension_id||
10339            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10340            ' AND (((A1.attribute_required_flag = ''Y''))'||
10341            ' OR ((A1.attribute_required_flag =''N'') AND '||
10342            ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10343            ' FROM fem_dim_attr_grps AG1))'||
10344            ' OR (A1.attribute_id IN (SELECT attribute_id'||
10345            ' FROM fem_dim_attr_grps AG2'||
10346            ' WHERE AG2.dimension_group_id = M2.dimension_group_id))))';
10347 
10348 
10349          ELSIF (p_specific_member_flag = 'N')
10350             AND (p_hier_dimension_flag = 'N')
10351             AND (p_value_set_required_flag = 'Y') THEN
10352 
10353            x_attr_select_stmt :=
10354            'SELECT T2.base_rowid'||
10355            ' ,M2.read_only_flag'||
10356            ' ,A1.attribute_id'||
10357            ' ,A1.attribute_varchar_label'||
10358            ' ,A1.attribute_dimension_id'||
10359            ' ,A1.attribute_value_column_name'||
10360            ' ,A1.attribute_data_type_code'||
10361            ' ,A1.attribute_required_flag'||
10362            ' ,A1.assignment_is_read_only_flag'||
10363            ' ,A1.allow_multiple_versions_flag'||
10364            ' ,A1.allow_multiple_assignment_flag'||
10365            ',T2.member_code'||
10366            ', T2.value_set_display_code'||
10367            ', M2.'||p_member_col||
10368            ', M2.value_set_id'||
10369            ' ,T2.attribute_assign_value'||
10370            ' ,null, null, null, null, null'||
10371            ' ,T2.version_display_code, null'||
10372            ' ,T2.attr_assign_vs_display_code, null,null'||
10373            ' ,''LOAD'' '||
10374            ' ,''N'''||
10375            ' ,null'||
10376            ' ,null'||
10377            ' ,null'||
10378            ' ,null'||
10379            ' ,null'||
10380            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10381            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10382            ' ,T2.CALPATTR_END_DATE'||
10383            ' ,T2.CALPATTR_PERIOD_NUM'||
10384            ' FROM fem_dim_attributes_b A1'||
10385            ',fem_dim_attr_versions_b V1'||
10386            ',fem_dimensions_b B1'||
10387            ',(SELECT B.rowid base_rowid'||
10388            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10389            ', B.value_set_display_code'||
10390            ', B.version_display_code'||
10391      	   ', B.attribute_assign_value'||
10392 	       ', B.attr_assign_vs_display_code'||
10393            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10394            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10395            ', B.CALPATTR_END_DATE'||
10396            ', B.CALPATTR_PERIOD_NUM'||
10397            ' FROM '||p_source_attr_table||' B'||
10398            ' WHERE B.status'||p_exec_mode_clause||
10399            ' AND   {{data_slice}} '||
10400            ') T2'||
10401            ', '||p_target_b_table||' M2'||
10402            ', fem_value_sets_b V2'||
10403            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10404            ' AND B1.dimension_id = A1.dimension_id'||
10405            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10406            ' AND T2.version_display_code = V1.version_display_code'||
10407            ' AND V1.attribute_id = A1.attribute_id'||
10408            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10409            ' AND V1.aw_snapshot_flag = ''N'''||
10410            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10411            ' AND M2.value_set_id = V2.value_set_id '||
10412            ' AND V2.dimension_id = '||p_dimension_id||
10413            ' AND V2.value_set_display_code = T2.value_set_display_code';
10414 
10415          -- surrogate key
10416          ELSIF (p_specific_member_flag = 'N')
10417             AND (p_hier_dimension_flag = 'Y')
10418             AND (p_value_set_required_flag = 'N')
10419             AND (p_member_col <> p_member_dc_col) THEN
10420 
10421            x_attr_select_stmt :=
10422            'SELECT T2.base_rowid'||
10423            ' ,M2.read_only_flag'||
10424            ' ,A1.attribute_id'||
10425            ' ,A1.attribute_varchar_label'||
10426            ' ,A1.attribute_dimension_id'||
10427            ' ,A1.attribute_value_column_name'||
10428            ' ,A1.attribute_data_type_code'||
10429            ' ,A1.attribute_required_flag'||
10430            ' ,A1.assignment_is_read_only_flag'||
10431            ' ,A1.allow_multiple_versions_flag'||
10432            ' ,A1.allow_multiple_assignment_flag'||
10433            ',T2.member_code'||
10434            ', null'||
10435            ', M2.'||p_member_col||
10436            ', null'||
10437            ' ,T2.attribute_assign_value'||
10438            ' ,null, null, null, null, null'||
10439            ' ,T2.version_display_code, null'||
10440            ' ,T2.attr_assign_vs_display_code, null,null'||
10441            ' ,''LOAD'' '||
10442            ' ,''N'''||
10443            ' ,null'||
10444            ' ,null'||
10445            ' ,null'||
10446            ' ,null'||
10447            ' ,null'||
10448            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10449            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10450            ' ,T2.CALPATTR_END_DATE'||
10451            ' ,T2.CALPATTR_PERIOD_NUM'||
10452            ' FROM fem_dim_attributes_b A1'||
10453            ',fem_dim_attr_versions_b V1'||
10454            ',fem_dimensions_b B1'||
10455            ',(SELECT B.rowid base_rowid'||
10456            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10457            ', B.version_display_code'||
10458      	   ', B.attribute_assign_value'||
10459 	       ', B.attr_assign_vs_display_code'||
10460            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10461            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10462            ', B.CALPATTR_END_DATE'||
10463            ', B.CALPATTR_PERIOD_NUM'||
10464            ' FROM '||p_source_attr_table||' B'||
10465            ' WHERE B.status'||p_exec_mode_clause||
10466            v_dim_label_where_cond||
10467            ' AND   {{data_slice}} '||
10468            ') T2'||
10469            ', '||p_target_b_table||' M2'||
10470            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10471            ' AND B1.dimension_id = A1.dimension_id'||
10472            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10473            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10474            ' AND T2.version_display_code = V1.version_display_code'||
10475            ' AND V1.attribute_id = A1.attribute_id'||
10476            ' AND V1.aw_snapshot_flag = ''N'''||
10477            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10478            ' AND (((A1.attribute_required_flag = ''Y''))'||
10479            ' OR ((A1.attribute_required_flag =''N'') AND '||
10480            ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10481            ' FROM fem_dim_attr_grps AG1))'||
10482            ' OR (A1.attribute_id IN (SELECT attribute_id'||
10483            ' FROM fem_dim_attr_grps AG2'||
10484            ' WHERE AG2.dimension_group_id = M2.dimension_group_id))))';
10485 
10486          -- No surrogate key
10487          ELSIF (p_specific_member_flag = 'N')
10488             AND (p_hier_dimension_flag = 'Y')
10489             AND (p_value_set_required_flag = 'N')
10490             AND (p_member_col = p_member_dc_col) THEN
10491 
10492            x_attr_select_stmt :=
10493            'SELECT T2.base_rowid'||
10494            ' ,M2.read_only_flag'||
10495            ' ,A1.attribute_id'||
10496            ' ,A1.attribute_varchar_label'||
10497            ' ,A1.attribute_dimension_id'||
10498            ' ,A1.attribute_value_column_name'||
10499            ' ,A1.attribute_data_type_code'||
10500            ' ,A1.attribute_required_flag'||
10501            ' ,A1.assignment_is_read_only_flag'||
10502            ' ,A1.allow_multiple_versions_flag'||
10503            ' ,A1.allow_multiple_assignment_flag'||
10504            ',T2.member_code'||
10505            ', null'||
10506            ', null'||
10507            ', null'||
10508            ' ,T2.attribute_assign_value'||
10509            ' ,null, null, null, null, null'||
10510            ' ,T2.version_display_code, null'||
10511            ' ,T2.attr_assign_vs_display_code, null,null'||
10512            ' ,''LOAD'' '||
10513            ' ,''N'''||
10514            ' ,null'||
10515            ' ,null'||
10516            ' ,null'||
10517            ' ,null'||
10518            ' ,null'||
10519            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10520            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10521            ' ,T2.CALPATTR_END_DATE'||
10522            ' ,T2.CALPATTR_PERIOD_NUM'||
10523            ' FROM fem_dim_attributes_b A1'||
10524            ',fem_dim_attr_versions_b V1'||
10525            ',fem_dimensions_b B1'||
10526            ',(SELECT B.rowid base_rowid'||
10527            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10528            ', B.version_display_code'||
10529      	   ', B.attribute_assign_value'||
10530 	       ', B.attr_assign_vs_display_code'||
10531            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10532            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10533            ', B.CALPATTR_END_DATE'||
10534            ', B.CALPATTR_PERIOD_NUM'||
10535            ' FROM '||p_source_attr_table||' B'||
10536            ' WHERE B.status'||p_exec_mode_clause||
10537            v_dim_label_where_cond||
10538            ' AND   {{data_slice}} '||
10539            ') T2'||
10540            ', '||p_target_b_table||' M2'||
10541            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10542            ' AND B1.dimension_id = A1.dimension_id'||
10543            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10544            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10545            ' AND T2.version_display_code = V1.version_display_code'||
10546            ' AND V1.attribute_id = A1.attribute_id'||
10547            ' AND V1.aw_snapshot_flag = ''N'''||
10548            ' AND M2.'||p_member_dc_col||' = T2.member_code'||
10549            ' AND (((A1.attribute_required_flag = ''Y''))'||
10550            ' OR ((A1.attribute_required_flag =''N'') AND '||
10551            ' (A1.attribute_id NOT IN (SELECT attribute_id'||
10552            ' FROM fem_dim_attr_grps AG1))'||
10553            ' OR (A1.attribute_id IN (SELECT attribute_id'||
10554            ' FROM fem_dim_attr_grps AG2'||
10555            ' WHERE AG2.dimension_group_id = M2.dimension_group_id))))';
10556 
10557          -- surrogate key
10558          ELSIF p_member_col <> p_member_dc_col THEN
10559 
10560            x_attr_select_stmt :=
10561            'SELECT T2.base_rowid'||
10562            ' ,M2.read_only_flag'||
10563            ' ,A1.attribute_id'||
10564            ' ,A1.attribute_varchar_label'||
10565            ' ,A1.attribute_dimension_id'||
10566            ' ,A1.attribute_value_column_name'||
10567            ' ,A1.attribute_data_type_code'||
10568            ' ,A1.attribute_required_flag'||
10569            ' ,A1.assignment_is_read_only_flag'||
10570            ' ,A1.allow_multiple_versions_flag'||
10571            ' ,A1.allow_multiple_assignment_flag'||
10572            ',T2.member_code'||
10573            ', null'||
10574            ',M2.'||p_member_col||
10575            ', null'||
10576            ' ,T2.attribute_assign_value'||
10577            ' ,null, null, null, null, null'||
10578            ' ,T2.version_display_code, null'||
10579            ' ,T2.attr_assign_vs_display_code, null,null'||
10580            ' ,''LOAD'' '||
10581            ' ,''N'''||
10582            ' ,null'||
10583            ' ,null'||
10584            ' ,null'||
10585            ' ,null'||
10586            ' ,null'||
10587            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10588            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10589            ' ,T2.CALPATTR_END_DATE'||
10590            ' ,T2.CALPATTR_PERIOD_NUM'||
10591            ' FROM fem_dim_attributes_b A1'||
10592            ',fem_dim_attr_versions_b V1'||
10593            ',fem_dimensions_b B1'||
10594            ',(SELECT B.rowid base_rowid'||
10595            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10596            ', B.version_display_code'||
10597      	   ', B.attribute_assign_value'||
10598 	       ', B.attr_assign_vs_display_code'||
10599            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10600            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10601            ', B.CALPATTR_END_DATE'||
10602            ', B.CALPATTR_PERIOD_NUM'||
10603            ' FROM '||p_source_attr_table||' B'||
10604            ' WHERE B.status'||p_exec_mode_clause||
10605            v_dim_label_where_cond||
10606            ' AND   {{data_slice}} '||
10607            ') T2'||
10608            ', '||p_target_b_table||' M2'||
10609            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10610            ' AND B1.dimension_id = A1.dimension_id'||
10611            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10612            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10613            ' AND T2.version_display_code = V1.version_display_code'||
10614            ' AND V1.attribute_id = A1.attribute_id'||
10615            ' AND V1.aw_snapshot_flag = ''N'''||
10616            ' AND M2.'||p_member_dc_col||' = T2.member_code';
10617 
10618          -- no surrogate key
10619          ELSE
10620 
10621            x_attr_select_stmt :=
10622            'SELECT T2.base_rowid'||
10623            ' ,M2.read_only_flag'||
10624            ' ,A1.attribute_id'||
10625            ' ,A1.attribute_varchar_label'||
10626            ' ,A1.attribute_dimension_id'||
10627            ' ,A1.attribute_value_column_name'||
10628            ' ,A1.attribute_data_type_code'||
10629            ' ,A1.attribute_required_flag'||
10630            ' ,A1.assignment_is_read_only_flag'||
10631            ' ,A1.allow_multiple_versions_flag'||
10632            ' ,A1.allow_multiple_assignment_flag'||
10633            ',T2.member_code'||
10634            ', null'||
10635            ', null'||
10636            ', null'||
10637            ' ,T2.attribute_assign_value'||
10638            ' ,null, null, null, null, null'||
10639            ' ,T2.version_display_code, null'||
10640            ' ,T2.attr_assign_vs_display_code, null,null'||
10641            ' ,''LOAD'' '||
10642            ' ,''N'''||
10643            ' ,null'||
10644            ' ,null'||
10645            ' ,null'||
10646            ' ,null'||
10647            ' ,null'||
10648            ' ,T2.CALPATTR_CAL_DISPLAY_CODE'||
10649            ' ,T2.CALPATTR_DIMGRP_DISPLAY_CODE'||
10650            ' ,T2.CALPATTR_END_DATE'||
10651            ' ,T2.CALPATTR_PERIOD_NUM'||
10652            ' FROM fem_dim_attributes_b A1'||
10653            ',fem_dim_attr_versions_b V1'||
10654            ',fem_dimensions_b B1'||
10655            ',(SELECT B.rowid base_rowid'||
10656            ', B.attribute_varchar_label,'||v_member_code||' MEMBER_CODE'||
10657            ', B.version_display_code'||
10658      	   ', B.attribute_assign_value'||
10659 	       ', B.attr_assign_vs_display_code'||
10660            ', B.CALPATTR_CAL_DISPLAY_CODE'||
10661            ', B.CALPATTR_DIMGRP_DISPLAY_CODE'||
10662            ', B.CALPATTR_END_DATE'||
10663            ', B.CALPATTR_PERIOD_NUM'||
10664            ' FROM '||p_source_attr_table||' B'||
10665            ' WHERE B.status'||p_exec_mode_clause||
10666            v_dim_label_where_cond||
10667            ' AND   {{data_slice}} '||
10668            ') T2'||
10669            ', '||p_target_b_table||' M2'||
10670            ' WHERE T2.attribute_varchar_label'||v_outer_join||' = A1.attribute_varchar_label '||
10671            ' AND B1.dimension_id = A1.dimension_id'||
10672            ' AND nvl(A1.user_assign_allowed_flag,''Y'') NOT IN (''N'')'||
10673            ' AND B1.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
10674            ' AND T2.version_display_code = V1.version_display_code'||
10675            ' AND V1.attribute_id = A1.attribute_id'||
10676            ' AND V1.aw_snapshot_flag = ''N'''||
10677            ' AND M2.'||p_member_dc_col||' = T2.member_code';
10678 
10679          END IF;  -- Specific member flag 'Y' or 'N'
10680       END IF; -- IF Cal Period 'Y' or 'N'
10681 
10682 
10683         FEM_ENGINES_PKG.TECH_MESSAGE
10684          (c_log_level_2,c_block||'.'||
10685           'build_attr_select_stmt',
10686           'End');
10687 
10688 
10689    END build_attr_select_stmt;
10690 
10691 /*===========================================================================+
10692  | PROCEDURE
10693  |              BUILD_BAD_ATTR_SELECT_STMT
10694  |
10695  | DESCRIPTION
10696  |                 Procedure for building the dynamic SELECT statement for
10697  |                 retrieving attribute rows from the ATTR_T table
10698  |                 where the Member does not exist in FEM and does not exist
10699  |                 in the _B_T interface table.  Such attribute rows are bad
10700  |                 because the member isn't value, and we want to update their
10701  |                 STATUS since otherwise it would left as 'LOAD'.
10702  |
10703  |                 This procedure runs after the Attribute loader sections
10704  |                 to ensure that we don't retrieve any ATTR_T records for members
10705  |                 that would be created by the loader
10706  |
10707  | SCOPE - PRIVATE
10708  |
10709  | NOTES
10710  |    We are getting ATTR_T records where the member does not exist in
10711  |    either the "real" FEM dimension member table and does not exist in
10712  |    the join of the _B_T with the _TL_T.  In the case of the join, any
10713  |    bad attr records that have a member in the join of _B_T/TL_T will be identified
10714  |    during the NEW_MEMBERS module.
10715  |
10716  |    Procedure is split into 2 sections:
10717  |       For CAL PERIOD
10718  |          Only need to look for records where the
10719  |          CALENDAR_DISPLAY_CODE and DIMENSION_GROUP_DISPLAY_CODE are valid, since
10720  |          the New Members module performs validations on those columns already.
10721  |
10722  |       For Value Set Dim
10723  |
10724  | MODIFICATION HISTORY
10725  |    Rob Flippo   26-MAR-04  Created
10726  |    Rob Flippo   14-SEP-04  Modify so that it excludes records
10727  |                            where the version is actually valid.
10728  |                            This allows the
10729  |                            Bad version cursor to find the bad version rows
10730  |                            and update
10731  |                            them appropriately;
10732  |                            Also modify so that don't join with the source
10733  |                            B_T and _TL_T
10734  |                            tables - since this procedure gets called after
10735  |                            NEW_MEMBER
10736  |                            is already complete, we don't have worry if the
10737  |                            new_members
10738  |                            have been processed or not
10739  |    Rob Flippo  27-OCT-04   Bug#3973837
10740  |                            FEM.C.DP3.4: DIMENSION LOADER ERRORS
10741  |                            ALL ATTRIBUTES IN ATTR_T TABLE
10742  |                            Fixed the select stmt to select rows as follows:
10743  |                            1)  the attribute is not required AND the member
10744  |                                does not exist in the official _B table OR
10745  |                            2)  the attribute is required AND the member does
10746  |                                not exist in the official _B table AND the
10747  |                                member does not exist in a join of the
10748  |                                interface _B_T/_TL_T tables
10749  |
10750  |   Rob Flippo   01-NOV-04   Modified so that members with invalid grp
10751  |                            or bad value_set continue to be processed
10752  |                            so that their attr records can get updated
10753  |                            with an invalid_member status
10754  |   Rob Flippo   15-MAR-05   Bug#4226011 add user_assign_allowed_flag not in ('N')
10755  |                            to all queries against the fem_dim_attributes_b table
10756  +===========================================================================*/
10757 
10758 procedure build_bad_attr_select_stmt (p_dimension_varchar_label IN VARCHAR2
10759                                 ,p_dimension_id IN NUMBER
10760                                 ,p_source_b_table IN VARCHAR2
10761                                 ,p_source_tl_table IN VARCHAR2
10762                                 ,p_source_attr_table IN VARCHAR2
10763                                 ,p_target_b_table IN VARCHAR2
10764                                 ,p_member_t_dc_col IN VARCHAR2
10765                                 ,p_member_dc_col IN VARCHAR2
10766                                 ,p_value_set_required_flag IN VARCHAR2
10767                                 ,p_shared_dimension_flag IN VARCHAR2
10768                                 ,p_exec_mode_clause IN VARCHAR2
10769                                 ,x_bad_attr_select_stmt OUT NOCOPY VARCHAR2)
10770 IS
10771 
10772       -- Value Set where conditions
10773       v_value_set_where_cond       VARCHAR2(1000);
10774       v_value_set_select_T1         VARCHAR2(1000);
10775       v_value_set_select_T2         VARCHAR2(1000);
10776       v_vs_where_M2               VARCHAR2(1000);  -- where condition for Specific Member='No'
10777       v_vs_table                  VARCHAR2(1000);
10778 
10779       -- Special conditions to handle CAL_PERIOD
10780       v_member_code                VARCHAR2(1000);
10781       v_calendar_id                VARCHAR2(100);
10782       v_calendar_table             VARCHAR2(100);
10783       v_calendar_where_cond        VARCHAR2(1000);
10784       v_member_dc_where_cond       VARCHAR2(1000);
10785 
10786       -- other conditions
10787       v_dim_label_where_cond       VARCHAR2(1000);
10788 
10789 BEGIN
10790 
10791    FEM_ENGINES_PKG.TECH_MESSAGE
10792      (c_log_level_2,c_block||'.'||
10793       'build_bad_attr_select_stmt',
10794       'Begin Build_bad_attr_select_stmt');
10795 
10796       IF p_shared_dimension_flag = 'Y' THEN
10797          v_dim_label_where_cond  :=
10798             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
10799       ELSE
10800          v_dim_label_where_cond := '';
10801       END IF;
10802 
10803 
10804    IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
10805 
10806            x_bad_attr_select_stmt :=
10807            'SELECT B.rowid'||
10808            ',''INVALID_MEMBER'''||
10809            ' FROM '||p_source_attr_table||' B'||
10810            ', FEM_CALENDARS_VL C, FEM_DIMENSION_GRPS_B D'||
10811            ', FEM_DIM_ATTR_VERSIONS_B V'||
10812            ', FEM_DIM_ATTRIBUTES_B A'||
10813            ' WHERE B.calendar_display_code = C.calendar_display_code '||
10814            ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
10815            ' AND B.STATUS'||p_exec_mode_clause||
10816            ' AND B.attribute_varchar_label = A.attribute_varchar_label'||
10817            ' AND A.dimension_id = '||p_dimension_id||
10818            ' AND B.version_display_code = V.version_display_code'||
10819            ' AND V.attribute_id = A.attribute_id'||
10820            ' AND LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
10821            'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
10822            'LPAD(to_char(C.calendar_id),5,''0'')||'||
10823            'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
10824            ' NOT IN (SELECT cal_period_id FROM fem_cal_periods_b) '||
10825            ' AND ((A.attribute_required_flag = ''N'')'||
10826            ' OR (A.attribute_required_flag = ''Y'''||
10827            ' AND NOT EXISTS (SELECT 0 FROM fem_cal_periods_b_t B2'||
10828            ' ,fem_cal_periods_tl_t TL2'||
10829            ' WHERE B2.cal_period_end_date = B.cal_period_end_date'||
10830            ' AND B2.cal_period_number = B.cal_period_number'||
10831            ' AND B2.calendar_display_code = B.calendar_display_code'||
10832            ' AND B2.dimension_group_display_code = B.dimension_group_display_code'||
10833            ' AND B2.cal_period_end_date = TL2.cal_period_end_date'||
10834            ' AND B2.calendar_display_code = TL2.calendar_display_code'||
10835            ' AND B2.dimension_group_display_code = TL2.dimension_group_display_code'||
10836            ' AND B2.cal_period_number = TL2.cal_period_number'||
10837            ' AND B2.STATUS'||p_exec_mode_clause||
10838            ' AND TL2.STATUS'||p_exec_mode_clause||')))'||
10839            ' AND   {{data_slice}} ';
10840 
10841 /* RCF 9-14-2004  Removing this since we should always update in the _ATTR table
10842                   when the member doesn't exist in the _B table.  That's because this
10843                   update occurs after the NEW_MEMBER procedure is complete
10844            ' AND B.cal_period_number NOT IN (SELECT B1.cal_period_number '||
10845            ' FROM fem_cal_periods_b_t B1, fem_cal_periods_tl_t TL '||
10846            ' WHERE B1.calendar_display_code = B.calendar_display_code '||
10847            ' AND B1.dimension_group_display_code = B.dimension_group_display_code '||
10848            ' AND B1.cal_period_end_date = B.cal_period_end_date'||
10849            ' AND B1.calendar_display_code = TL.calendar_display_code'||
10850            ' AND B1.dimension_group_display_code = TL.dimension_group_display_code'||
10851            ' AND B1.cal_period_end_date = TL.cal_period_end_date'||
10852            ' AND B1.cal_period_number = TL.cal_period_number) '||
10853 
10854 */
10855 
10856    ELSIF p_value_set_required_flag = 'Y' THEN
10857            x_bad_attr_select_stmt :=
10858            'SELECT B.rowid'||
10859            ',''INVALID_MEMBER'''||
10860            ' FROM '||p_source_attr_table||' B'||
10861            ', FEM_DIM_ATTR_VERSIONS_B V'||
10862            ', FEM_DIM_ATTRIBUTES_B A'||
10863            ' WHERE B.STATUS'||p_exec_mode_clause||
10864            ' AND B.attribute_varchar_label = A.attribute_varchar_label'||
10865            ' AND A.dimension_id = '||p_dimension_id||
10866            ' AND nvl(A.user_assign_allowed_flag,''Y'') not in (''N'')'||
10867            ' AND B.version_display_code = V.version_display_code'||
10868            ' AND V.attribute_id = A.attribute_id'||
10869            ' AND NOT EXISTS (SELECT 0'||
10870            ' FROM '||p_target_b_table||' T'||
10871            ',fem_value_sets_b V'||
10872            ' WHERE T.value_set_id = V.value_set_id'||
10873            ' AND V.value_set_display_code = B.value_set_display_code'||
10874            ' AND T.'||p_member_dc_col||' = B.'||p_member_t_dc_col||')'||
10875            ' AND ((A.attribute_required_flag = ''N'')'||
10876            ' OR (A.attribute_required_flag = ''Y'''||
10877            ' AND NOT EXISTS (SELECT 0 FROM '||p_source_b_table||' B2'||
10878            ', '||p_source_tl_table||' TL2'||
10879            ' WHERE B2.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
10880            ' AND B2.value_set_display_code = B.value_set_display_code'||
10881            ' AND B2.'||p_member_t_dc_col||' = TL2.'||p_member_t_dc_col||
10882            ' AND B2.value_set_display_code = TL2.value_set_display_code'||
10883            ' AND B2.STATUS'||p_exec_mode_clause||
10884            ' AND TL2.STATUS'||p_exec_mode_clause||')))'||
10885            ' AND   {{data_slice}} ';
10886 
10887 /* RCF 9-14-2004  Removing this since we should always update in the _ATTR table
10888                   when the member doesn't exist in the _B table.  That's because this
10889                   update occurs after the NEW_MEMBER procedure is complete
10890            ' AND NOT EXISTS (SELECT 0'||
10891            ' FROM '||p_source_b_table||' B1'||
10892            ','||p_source_tl_table||' TL'||
10893            ' WHERE B1.value_set_display_code = B.value_set_display_code'||
10894            ' AND B1.value_set_display_code = TL.value_set_display_code'||
10895            ' AND B1.'||p_member_t_dc_col||' = TL.'||p_member_t_dc_col||
10896            ' AND B1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||')'||
10897 
10898            */
10899    ELSE
10900            x_bad_attr_select_stmt :=
10901            'SELECT B.rowid'||
10902            ',''INVALID_MEMBER'''||
10903            ' FROM '||p_source_attr_table||' B'||
10904            ',FEM_DIM_ATTR_VERSIONS_B V'||
10905            ',FEM_DIM_ATTRIBUTES_B A'||
10906            ' WHERE B.STATUS'||p_exec_mode_clause||
10907            v_dim_label_where_cond||
10908            ' AND B.attribute_varchar_label = A.attribute_varchar_label'||
10909            ' AND A.dimension_id = '||p_dimension_id||
10910            ' AND nvl(A.user_assign_allowed_flag,''Y'') not in (''N'')'||
10911            ' AND B.version_display_code = V.version_display_code'||
10912            ' AND V.attribute_id = A.attribute_id'||
10913            ' AND NOT EXISTS (SELECT 0'||
10914            ' FROM '||p_target_b_table||' T'||
10915            ' WHERE T.'||p_member_dc_col||' = B.'||p_member_t_dc_col||')'||
10916            ' AND ((A.attribute_required_flag = ''N'')'||
10917            ' OR (A.attribute_required_flag = ''Y'''||
10918            ' AND NOT EXISTS (SELECT 0 FROM '||p_source_b_table||' B2'||
10919            ', '||p_source_tl_table||' TL2'||
10920            ' WHERE B2.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
10921            ' AND B2.'||p_member_t_dc_col||' = TL2.'||p_member_t_dc_col||
10922            ' AND B2.STATUS'||p_exec_mode_clause||
10923            ' AND TL2.STATUS'||p_exec_mode_clause||')))'||
10924            ' AND   {{data_slice}} ';
10925 
10926 /* RCF 9-14-2004  Removing this since we should always update in the _ATTR table
10927                   when the member doesn't exist in the _B table.  That's because this
10928                   update occurs after the NEW_MEMBER procedure is complete
10929            ' AND NOT EXISTS (SELECT 0'||
10930            ' FROM '||p_source_b_table||' B1'||
10931            ','||p_source_tl_table||' TL'||
10932            ' WHERE B1.'||p_member_t_dc_col||' = TL.'||p_member_t_dc_col||
10933            ' AND B1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||')'||
10934 
10935 */
10936    END IF;
10937 
10938      FEM_ENGINES_PKG.TECH_MESSAGE
10939       (c_log_level_2,c_block||'.'||
10940        'build_bad_attr_select_stmt',
10941        'End Build_bad_attr_select_stmt');
10942 
10943 
10944 END build_bad_attr_select_stmt;
10945 
10946 /*===========================================================================+
10947  | PROCEDURE
10948  |              BUILD_SEQ_ENF_HIERCOUNT_STMT
10949  |
10950  | DESCRIPTION
10951  |     Procedure for building the dynamic SELECT statement for
10952  |     identifying if a member participates in a sequence enforced hierarchy
10953  |
10954  | SCOPE - PRIVATE
10955  |
10956  | NOTES
10957  |
10958  | MODIFICATION HISTORY
10959  |    Rob Flippo   16-MAR-05  Created
10960  |
10961  +===========================================================================*/
10962 
10963 procedure build_seq_enf_hiercount_stmt (p_value_set_required_flag IN VARCHAR2
10964                                  ,p_hier_table_name IN VARCHAR2
10965                                  ,x_select_stmt OUT NOCOPY VARCHAR2)
10966 IS
10967 
10968 BEGIN
10969    FEM_ENGINES_PKG.TECH_MESSAGE
10970       (c_log_level_2,c_block||'.'||'build_seq_enf_hiercount_stmt',
10971        'Begin Build SQL statement to identify if member participates in sequence enf hier');
10972 
10973    IF p_value_set_required_flag = 'Y' THEN
10974       x_select_stmt := 'SELECT count(*)'||
10975                        ' FROM '||p_hier_table_name||' H'||
10976                        ',fem_object_definition_b D'||
10977                        ',fem_hierarchies O'||
10978                        ' WHERE H.hierarchy_obj_def_id = D.object_definition_id'||
10979                        ' AND D.object_id = O.hierarchy_obj_id'||
10980                        ' AND O.group_sequence_enforced_code '||
10981                        ' IN (''SEQUENCE_ENFORCED'',''SEQUENCE_ENFORCED_SKIP_LEVEL'')'||
10982                        ' AND to_char(child_id) = to_char(:b_member_id)'||
10983                        ' AND H.child_value_set_id = :b_value_set_id';
10984    ELSE
10985       x_select_stmt := 'SELECT count(*)'||
10986                        ' FROM '||p_hier_table_name||' H'||
10987                        ',fem_object_definition_b D'||
10988                        ',fem_hierarchies O'||
10989                        ' WHERE H.hierarchy_obj_def_id = D.object_definition_id'||
10990                        ' AND D.object_id = O.hierarchy_obj_id'||
10991                        ' AND O.group_sequence_enforced_code '||
10992                        ' IN (''SEQUENCE_ENFORCED'',''SEQUENCE_ENFORCED_SKIP_LEVEL'')'||
10993                        ' AND to_char(child_id) = to_char(:b_member_id)';
10994 
10995    END IF;
10996 
10997    FEM_ENGINES_PKG.TECH_MESSAGE
10998       (c_log_level_2,c_block||'.'||'build_seq_enf_hiercount_stmt',
10999        'End Build SQL statement to identify if member participates in sequence enf hier');
11000 
11001 END build_seq_enf_hiercount_stmt;
11002 
11003 
11004 /*===========================================================================+
11005  | PROCEDURE
11006  |              BUILD_DOES_ATTR_EXIST_STMT
11007  |
11008  | DESCRIPTION
11009  |                 Procedure for building the dynamic SELECT statement for
11010  |                 identifying if an attribute row already exists in the _ATTR table
11011  |
11012  | SCOPE - PRIVATE
11013  |
11014  | NOTES
11015  |
11016  |
11017  |
11018  |
11019  | MODIFICATION HISTORY
11020  |    Rob Flippo   23-OCT-03  Created
11021  |    Rob Flippo   02-MAR-05  Bug#4170444 Modified to return value for the
11022  |                            READ_ONLY_FLAG from the ATTR table
11023  |    Rob Flippo   11-AUG-05  Bug#4547868 performance issue on query
11024  |                            - remove join to _B table
11025  |
11026  +===========================================================================*/
11027 
11028    procedure build_does_attr_exist_stmt (p_target_attr_table IN VARCHAR2
11029                                 ,p_target_b_table IN VARCHAR2
11030                                 ,p_member_col IN VARCHAR2
11031                                 ,p_member_dc_col IN VARCHAR2
11032                                 ,p_value_set_required_flag IN VARCHAR2
11033                                 ,p_version_flag IN VARCHAR2
11034                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
11035    IS
11036 
11037       v_value_set_where_cond       VARCHAR2(1000);
11038       v_value_set_table                VARCHAR2(100);
11039       v_version_where_cond         VARCHAR2(1000);
11040 
11041 
11042    BEGIN
11043         FEM_ENGINES_PKG.TECH_MESSAGE
11044          (c_log_level_2,c_block||'.'||
11045           'build_does_attr_exist_stmt',
11046           'Begin Build SQL statement to identify if attribute assignment already exists');
11047 
11048       IF p_value_set_required_flag = 'Y' THEN
11049         v_value_set_where_cond := ' and A.value_set_id = :b_value_set_id';
11050 
11051         /*** commented out 8/11/2005
11052         ' AND A.value_set_id = V.value_set_id'||
11053                                   ' AND V.value_set_display_code = :b_value_set_dc'||
11054                                   ' AND A.value_set_id = B.value_set_id'; */
11055 
11056         v_value_set_table      := ',fem_value_sets_b V ';
11057       ELSE
11058         v_value_set_where_cond       := '';
11059         v_value_set_table            := '';
11060       END IF;
11061 
11062       IF p_version_flag = 'Y' THEN
11063          v_version_where_cond :=   ' AND A.version_id = :b_version_id';
11064 
11065       ELSE
11066          v_version_where_cond := '';
11067       END IF;
11068 
11069         x_attr_select_stmt :=
11070            'SELECT count(*), max(A.read_only_flag)'||
11071            ' FROM '||p_target_attr_table||' A'||
11072            ' WHERE A.attribute_id = :b_attribute_id'||
11073            v_version_where_cond||
11074            ' AND A.'||p_member_col||' = :b_member_id'||
11075            v_value_set_where_cond;
11076 
11077         FEM_ENGINES_PKG.TECH_MESSAGE
11078          (c_log_level_2,c_block||'.'||
11079           'build_does_attr_exist_stmt',
11080           'End');
11081 
11082 
11083    END build_does_attr_exist_stmt;
11084 
11085 
11086 /*===========================================================================+
11087  | PROCEDURE
11088  |              BUILD_DOES_MULTATTR_EXIST_STMT
11089  |
11090  | DESCRIPTION
11091  |                 Procedure for building the dynamic SELECT statement for
11092  |                 identifying if an attribute row already exists in the _ATTR table
11093  |                 when the attribute is Multi-assignment
11094  |
11095  | SCOPE - PRIVATE
11096  |
11097  | NOTES
11098  |
11099  |
11100  |
11101  |
11102  | MODIFICATION HISTORY
11103  |    Rob Flippo   06-JUL-06  Created
11104  |
11105  +===========================================================================*/
11106 
11107    procedure build_does_multattr_exist_stmt (p_target_attr_table IN VARCHAR2
11108                                 ,p_target_b_table IN VARCHAR2
11109                                 ,p_member_col IN VARCHAR2
11110                                 ,p_member_dc_col IN VARCHAR2
11111                                 ,p_value_set_required_flag IN VARCHAR2
11112                                 ,p_attr_value_column_name IN VARCHAR2
11113                                 ,p_attr_assign_vs_id IN NUMBER
11114                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
11115    IS
11116 
11117       v_value_set_where_cond       VARCHAR2(1000);
11118       v_value_set_table                VARCHAR2(100);
11119       v_version_where_cond         VARCHAR2(1000);
11120       v_assign_where_cond          VARCHAR2(4000);
11121 
11122 
11123    BEGIN
11124         FEM_ENGINES_PKG.TECH_MESSAGE
11125          (c_log_level_2,c_block||'.'||
11126           'build_does_multattr_exist_stmt',
11127           'Begin Build SQL statement to identify if attribute assignment already exists for multi-assign attributes');
11128 
11129       IF p_value_set_required_flag = 'Y' THEN
11130         v_value_set_where_cond := ' and A.value_set_id = :b_value_set_id';
11131         v_value_set_table      := ',fem_value_sets_b V ';
11132       ELSE
11133         v_value_set_where_cond       := '';
11134         v_value_set_table            := '';
11135       END IF;
11136 
11137       IF p_attr_value_column_name = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
11138          AND p_attr_assign_vs_id IS NOT NULL THEN
11139 
11140          v_assign_where_cond :=
11141            ' AND A.dim_attribute_numeric_member = :b_dim_attr_numeric_mbr'||
11142            ' AND A.dim_attribute_value_set_id = :b_dim_attr_vs';
11143       ELSIF p_attr_value_column_name = 'DIM_ATTRIBUTE_NUMERIC_MEMBER'
11144          AND p_attr_assign_vs_id IS NULL THEN
11145          v_assign_where_cond :=
11146            ' AND A.dim_attribute_numeric_member = :b_dim_attr_numeric_mbr';
11147       ELSE
11148          v_assign_where_cond :=
11149            ' AND A.dim_attribute_varchar_member = :b_dim_attr_varchar_mbr';
11150 
11151       END IF;
11152 
11153       v_version_where_cond :=   ' AND A.version_id = :b_version_id';
11154 
11155         x_attr_select_stmt :=
11156            'SELECT count(*)'||
11157            ' FROM '||p_target_attr_table||' A'||
11158            ' WHERE A.attribute_id = :b_attribute_id'||
11159            v_version_where_cond||
11160            ' AND A.'||p_member_col||' = :b_member_id'||
11161            v_value_set_where_cond||
11162            v_assign_where_cond;
11163 
11164         FEM_ENGINES_PKG.TECH_MESSAGE
11165          (c_log_level_2,c_block||'.'||
11166           'build_does_multattr_exist_stmt',
11167           'End');
11168 
11169 
11170    END build_does_multattr_exist_stmt;
11171 
11172 
11173 /*===========================================================================+
11174  | PROCEDURE
11175  |              build_get_identical_assgn_stmt
11176  |
11177  | DESCRIPTION
11178  |                 Procedure for building the dynamic SELECT statement for
11179  |                 identifying if the attribute assignment from the interface
11180  |                 table is exactly the same as an existing attr assignment row
11181  |
11182  | SCOPE - PRIVATE
11183  |
11184  | NOTES
11185  |
11186  |
11187  | MODIFICATION HISTORY
11188  |    Rob Flippo   30-SEP-04  Created
11189  |
11190  +===========================================================================*/
11191 
11192    procedure build_get_identical_assgn_stmt (p_target_attr_table IN VARCHAR2
11193                                 ,p_target_b_table IN VARCHAR2
11194                                 ,p_member_col IN VARCHAR2
11195                                 ,p_member_dc_col IN VARCHAR2
11196                                 ,p_value_set_required_flag IN VARCHAR2
11197                                 ,p_date_format_mask IN VARCHAR2
11198                                 ,x_attr_select_stmt OUT NOCOPY VARCHAR2)
11199    IS
11200 
11201       v_value_set_where_cond       VARCHAR2(1000);
11202       v_value_set_table                VARCHAR2(100);
11203 
11204 
11205    BEGIN
11206         FEM_ENGINES_PKG.TECH_MESSAGE
11207          (c_log_level_2,c_block||'.'||
11208           'build_get_identical_assgn_stmt',
11209           'Begin Build SQL statement to identify if existing attr assignment is identical to one from the interface table');
11210 
11211       IF p_value_set_required_flag = 'Y' THEN
11212         v_value_set_where_cond := ' AND A.value_set_id = V.value_set_id'||
11213                                   ' AND V.value_set_display_code = :b_value_set_dc'||
11214                                   ' AND A.value_set_id = B.value_set_id';
11215         v_value_set_table      := ',fem_value_sets_b V ';
11216       ELSE
11217         v_value_set_where_cond       := '';
11218         v_value_set_table            := '';
11219       END IF;
11220 
11221 
11222         x_attr_select_stmt :=
11223            'SELECT count(*)'||
11224            ' FROM '||p_target_attr_table||' A'||
11225            ','||p_target_b_table||' B'||
11226            v_value_set_table||
11227            ' WHERE A.attribute_id = :b_attribute_id'||
11228            ' AND A.version_id = :b_version_id'||
11229            ' AND A.'||p_member_col||' = B.'||p_member_col||
11230            v_value_set_where_cond||
11231            ' AND B.'||p_member_dc_col||' = :b_member_dc'||
11232            ' AND ((:b_dim_attr_numeric_member IS NULL '||
11233            ' AND A.dim_attribute_numeric_member IS NULL)'||
11234            ' OR (:b_dim_attr_numeric_member IS NOT NULL '||
11235            ' AND A.dim_attribute_numeric_member = :b_dim_attr_numeric_member))'||
11236            ' AND ((:b_dim_attr_vs_id IS NULL '||
11237            ' AND A.dim_attribute_value_set_id IS NULL)'||
11238            ' OR (:b_dim_attr_vs_id IS NOT NULL '||
11239            ' AND A.dim_attribute_value_set_id = :b_dim_attr_vs_id))'||
11240            ' AND ((:b_dim_attr_varchar_member IS NULL '||
11241            ' AND A.dim_attribute_varchar_member IS NULL)'||
11242            ' OR (:b_dim_attr_varchar_member IS NOT NULL '||
11243            ' AND A.dim_attribute_varchar_member = :b_dim_attr_varchar_member))'||
11244            ' AND ((:b_number_assign_value IS NULL '||
11245            ' AND A.number_assign_value IS NULL)'||
11246            ' OR (:b_number_assign_value IS NOT NULL '||
11247            ' AND A.number_assign_value = :b_number_assign_value))'||
11248            ' AND ((:b_varchar_assign_value IS NULL '||
11249            ' AND A.varchar_assign_value IS NULL)'||
11250            ' OR (:b_varchar_assign_value IS NOT NULL '||
11251            ' AND A.varchar_assign_value = :b_varchar_assign_value))'||
11252            ' AND ((:b_date_assign_value IS NULL '||
11253            ' AND A.date_assign_value IS NULL) '||
11254            ' OR (:b_date_assign_value IS NOT NULL '||
11255            ' AND A.date_assign_value = :b_date_assign_value))';
11256 
11257 
11258         FEM_ENGINES_PKG.TECH_MESSAGE
11259          (c_log_level_2,c_block||'.'||
11260           'build_get_identical_assgn_stmt',
11261           'End');
11262 
11263 
11264    END build_get_identical_assgn_stmt;
11265 
11266 
11267 /*===========================================================================+
11268  | PROCEDURE
11269  |              VERIFY_ATTR_MEMBER
11270  |
11271  | DESCRIPTION
11272  |                 Procedure for checking if the Attribute assignment value
11273  |                 exists in the appropriate dimension member table
11274  |                 for DIM_ATTRIBUTE_VARCHAR_MEMBER and DIM_ATTRIBUTE_NUMERIC_MEMBER
11275  |                 attributes
11276  |
11277  | SCOPE - PRIVATE
11278  |
11279  | NOTES
11280  |
11281  |
11282  |
11283  |
11284  | MODIFICATION HISTORY
11285  |    Rob Flippo   27-OCT-03  Created
11286  |    Rob Flippo   03-MAR-05  Added new return status MISSING_ATTR_ASSIGN_VS to
11287  |                            identify when the user forgets to populate the
11288  |                            ATTR_ASSIGN_VS_DISPLAY_CODE column for attributes
11289  |                            that point to value set required dimensions
11290  |
11291  +===========================================================================*/
11292 
11293    procedure verify_attr_member (p_attribute_varchar_label IN VARCHAR2
11294                                 ,p_dimension_varchar_label IN VARCHAR2
11295                                 ,p_attr_member_dc IN VARCHAR2
11296                                 ,p_attr_member_vs_dc IN VARCHAR2
11297                                 ,x_attr_success OUT NOCOPY VARCHAR2
11298                                 ,x_member OUT NOCOPY VARCHAR2)
11299    IS
11300 
11301       v_dimension_id                 NUMBER;
11302       v_attr_dimension_varchar_label VARCHAR2(30);
11303       v_get_dim_status             VARCHAR2(30);  -- ignore this in this procedure
11304       v_target_b_table             VARCHAR2(30);
11305       v_target_tl_table            VARCHAR2(30);
11306       v_target_attr_table          VARCHAR2(30);
11307       v_source_b_table             VARCHAR2(30);
11308       v_source_tl_table            VARCHAR2(30);
11309       v_source_attr_table          VARCHAR2(30);
11310       v_member_col                 VARCHAR2(30);
11311       v_member_dc_col    VARCHAR2(30);
11312       v_member_t_dc_col  VARCHAR2(30);
11313       v_member_name_col            VARCHAR2(30);
11314       v_member_t_name_col          VARCHAR2(30);
11315       v_member_description_col     VARCHAR2(30);
11316       v_value_set_required_flag    VARCHAR2(1);
11317       v_user_defined_flag          VARCHAR2(1);
11318       v_hier_table_name            VARCHAR2(30);
11319       v_simple_dimension_flag      VARCHAR2(1);
11320       v_shared_dimension_flag      VARCHAR2(1);
11321       v_hier_dimension_flag        VARCHAR2(1);
11322       v_member_id_method_code      VARCHAR2(30);
11323       v_table_handler_name         VARCHAR2(30);
11324       v_err_code  NUMBER        := 0;
11325       v_err_msg   VARCHAR2(255);
11326       v_composite_dimension_flag   VARCHAR2(1); --
11327       v_structure_id NUMBER; --
11328 
11329       x_member_exists_stmt         VARCHAR2(4000);
11330 
11331 
11332    BEGIN
11333       FEM_ENGINES_PKG.TECH_MESSAGE
11334        (c_log_level_2,c_block||'.'||
11335         'verify_attr_member',
11336         'Begin identify if attribute assignment member is valid');
11337 
11338       FEM_ENGINES_PKG.TECH_MESSAGE
11339        (c_log_level_1,c_block||'.'||
11340         'verify_attr_member.p_attr_member_vs_dc',
11341         p_attr_member_vs_dc);
11342 
11343 
11344       SELECT B2.dimension_varchar_label
11345       INTO v_attr_dimension_varchar_label
11346       FROM fem_dimensions_b B1, fem_dim_attributes_b A1, fem_dimensions_b B2
11347       WHERE B1.dimension_id = A1.dimension_id
11348       AND A1.attribute_varchar_label = p_attribute_varchar_label
11349       AND B1.dimension_varchar_label = p_dimension_varchar_label
11350       AND B2.dimension_id = A1.attribute_dimension_id;
11351 
11352 
11353       --dbms_output.put_line('attr label = '||v_attr_dimension_varchar_label);
11354 
11355       get_dimension_info (v_attr_dimension_varchar_label
11356                          ,v_dimension_id
11357                          ,v_target_b_table
11358                          ,v_target_tl_table
11359                          ,v_target_attr_table
11360                          ,v_source_b_table
11361                          ,v_source_tl_table
11362                          ,v_source_attr_table
11363                          ,v_member_col
11364                          ,v_member_dc_col
11365                          ,v_member_t_dc_col
11366                          ,v_member_name_col
11367                          ,v_member_t_name_col
11368                          ,v_member_description_col
11369                          ,v_value_set_required_flag
11370                          ,v_user_defined_flag
11371                          ,v_simple_dimension_flag
11372                          ,v_shared_dimension_flag
11373                          ,v_hier_table_name
11374                          ,v_hier_dimension_flag
11375                          ,v_member_id_method_code
11376                          ,v_table_handler_name
11377                          ,v_composite_dimension_flag --
11378                          ,v_structure_id); --
11379 
11380       build_member_exists_stmt (v_target_b_table
11381                                ,v_member_col
11382                                ,v_member_dc_col
11383                                ,v_value_set_required_flag
11384                                ,x_member_exists_stmt);
11385       --dbms_output.put_line(substr(x_member_exists_stmt, 1,200));
11386       --dbms_output.put_line(substr(x_member_exists_stmt, 201,200));
11387 
11388       -- add check to see if the attr_vs_display_code is populated for an
11389       -- attribute that points to a value set required dimension.  If it is
11390       -- null, then we should skip the check altogether and report
11391       -- a special status to the calling procedure
11392       IF v_value_set_required_flag = 'Y' AND p_attr_member_vs_dc is not null THEN
11393          EXECUTE IMMEDIATE x_member_exists_stmt
11394             INTO x_member
11395             USING p_attr_member_dc
11396                  ,p_attr_member_vs_dc;
11397       ELSIF v_value_set_required_flag = 'N' THEN
11398          EXECUTE IMMEDIATE x_member_exists_stmt
11399             INTO x_member
11400             USING p_attr_member_dc;
11401       END IF;
11402 
11403       FEM_ENGINES_PKG.TECH_MESSAGE
11404        (c_log_level_1,c_block||'.'||
11405         'verify_attr_member.after the member exists query',
11406         null);
11407 
11408 
11409       IF x_member IS NOT NULL THEN
11410          x_attr_success := 'Y';
11411       ELSIF v_value_set_required_flag = 'Y' AND p_attr_member_vs_dc is null THEN
11412          x_attr_success := 'MISSING_ATTR_ASSIGN_VS';
11413       ELSE
11414          x_attr_success := 'N';
11415       END IF;
11416 
11417       FEM_ENGINES_PKG.TECH_MESSAGE
11418        (c_log_level_1,c_block||'.'||
11419         'x_attr_sucess',
11420         x_attr_success);
11421       FEM_ENGINES_PKG.TECH_MESSAGE
11422        (c_log_level_2,c_block||'.'||
11423         'verify_attr_member',
11424         'End');
11425 
11426    EXCEPTION
11427       WHEN no_data_found THEN
11428         x_attr_success := 'N';
11429 
11430    END verify_attr_member;
11431 
11432 
11433 /*===========================================================================+
11434  | PROCEDURE
11435  |              BUILD_MEMBER_EXISTS_STMT
11436  |
11437  | DESCRIPTION
11438  |                 Procedure for building the SQL statement that checks
11439  |                 if a member exists in a dimension table
11440  |
11441  | SCOPE - PRIVATE
11442  |
11443  |
11444  | MODIFICATION HISTORY
11445  |    Rob Flippo   27-OCT-03  Created
11446  |
11447  +===========================================================================*/
11448 
11449    procedure build_member_exists_stmt (p_member_table IN VARCHAR2
11450                                 ,p_member_col IN VARCHAR2
11451                                 ,p_member_dc_col IN VARCHAR2
11452                                 ,p_value_set_required_flag IN VARCHAR2
11453                                 ,x_member_exists_stmt OUT NOCOPY VARCHAR2)
11454 
11455 
11456    IS
11457 
11458       v_value_set_where_cond       VARCHAR2(1000);
11459       v_value_set_table            VARCHAR2(1000);
11460 
11461    BEGIN
11462       FEM_ENGINES_PKG.TECH_MESSAGE
11463        (c_log_level_2,c_block||'.'||
11464         'build_member_exists_stmt',
11465         'Begin Build SQL statement to identify if a dimension member exists in FEM');
11466 
11467       IF (p_value_set_required_flag = 'Y') THEN
11468         v_value_set_where_cond := ' AND V1.value_set_id = B1.value_set_id '||
11469                                   ' AND V1.value_set_display_code = :b_value_set_display_code';
11470         v_value_set_table      := ', FEM_VALUE_SETS_B V1';
11471 
11472       ELSE
11473         v_value_set_where_cond := '';
11474         v_value_set_table      := '';
11475       END IF;
11476 
11477 
11478         x_member_exists_stmt :=
11479            'SELECT '||p_member_col||
11480            ' FROM '||p_member_table||' B1 '||v_value_set_table||
11481            ' WHERE to_char('||p_member_dc_col||') = to_char(:b_member_dc)'||
11482            v_value_set_where_cond;
11483 
11484       FEM_ENGINES_PKG.TECH_MESSAGE
11485        (c_log_level_1,c_block||'.'||
11486         'build_member_exists_stmt',
11487         x_member_exists_stmt);
11488 
11489       FEM_ENGINES_PKG.TECH_MESSAGE
11490        (c_log_level_2,c_block||'.'||
11491         'build_member_exists_stmt',
11492         'End');
11493 
11494    END build_member_exists_stmt;
11495 
11496 
11497 /*===========================================================================+
11498  | PROCEDURE
11499  |              BUILD_BAD_NEW_MBRS_STMT
11500  |
11501  | DESCRIPTION
11502  |                 Retrieves any members from the _B_T table that do not exist
11503  |                 in FEM but also do not have a corresponding _TL_T name/desc record.
11504  |                 Such members are considered invalid and cannot be loaded.
11505  |
11506  |
11507  | SCOPE - PRIVATE
11508  |
11509  | NOTES
11510  |
11511  |
11512  | MODIFICATION HISTORY
11513  |    Rob Flippo   28-OCT-03  Created
11514  |    Rob Flippo   28-SEP-04  Bug#3906218 Ability undelete members
11515  |                            Modified the select stmt so that it excludes
11516  |                            members that already exist in the target table
11517  |
11518  +===========================================================================*/
11519 
11520    procedure build_bad_new_mbrs_stmt (p_load_type IN VARCHAR2
11521                                 ,p_dimension_varchar_label IN VARCHAR2
11522                                 ,p_source_b_table IN VARCHAR2
11523                                 ,p_source_tl_table IN VARCHAR2
11524                                 ,p_target_b_table IN VARCHAR2
11525                                 ,p_member_t_dc_col IN VARCHAR2
11526                                 ,p_member_dc_col IN VARCHAR2
11527                                 ,p_value_set_required_flag IN VARCHAR2
11528                                 ,p_shared_dimension_flag IN VARCHAR2
11529                                 ,p_exec_mode_clause IN VARCHAR2
11530                                 ,x_bad_member_select_stmt OUT NOCOPY VARCHAR2)
11531       IS
11532 
11533       v_member_code                VARCHAR2(1000); -- used only in the CAL_PERIOD select
11534 
11535  BEGIN
11536       FEM_ENGINES_PKG.TECH_MESSAGE
11537        (c_log_level_2,c_block||'.'||
11538         'build_bad_new_members_stmt',
11539         'Begin Build SQL statement to retrieve invalid new members from the source _B_T table');
11540 
11541       --dbms_output.put_line('Building the Bad New Members Select');
11542 
11543       IF (p_load_type = 'DIMENSION_MEMBER') AND
11544          (p_dimension_varchar_label = 'CAL_PERIOD') THEN
11545 
11546       -- Setting the special conditions for CAL_PERIOD
11547          v_member_code :=
11548                'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
11549                'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
11550                'LPAD(to_char(C.calendar_id),5,''0'')||'||
11551                'LPAD(to_char(D.time_dimension_group_key),5,''0'')';
11552 
11553 
11554             x_bad_member_select_stmt :=
11555             'SELECT B.rowid'||
11556             ',''MISSING_NAME'''||
11557             ' FROM '||p_source_b_table||' B'||
11558             ', fem_calendars_b C, fem_dimension_grps_b D'||
11559             ' WHERE B.status'||p_exec_mode_clause||
11560             ' AND B.calendar_display_code = C.calendar_display_code'||
11561             ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
11562 
11563             ' AND   {{data_slice}} '||
11564             ' AND NOT EXISTS (SELECT 0 FROM '||
11565             p_source_tl_table||' S1'||
11566             ' WHERE S1.CALENDAR_DISPLAY_CODE = B.CALENDAR_DISPLAY_CODE'||
11567             ' AND S1.DIMENSION_GROUP_DISPLAY_CODE = B.DIMENSION_GROUP_DISPLAY_CODE'||
11568             ' AND S1.CAL_PERIOD_END_DATE = B.CAL_PERIOD_END_DATE'||
11569             ' AND S1.CAL_PERIOD_NUMBER = B.CAL_PERIOD_NUMBER'||
11570             ' AND S1.STATUS'||p_exec_mode_clause||')'||
11571             ' AND NOT EXISTS (SELECT 0 FROM '||
11572             p_target_b_table||' G'||
11573             ' WHERE to_char(G.cal_period_id) = '||v_member_code||')';
11574 
11575 
11576       ELSIF (p_load_type = 'DIMENSION_MEMBER')
11577             AND (p_value_set_required_flag = 'Y') THEN
11578             x_bad_member_select_stmt :=
11579             'SELECT B.rowid'||
11580             ',''MISSING_NAME'''||
11581             ' FROM '||p_source_b_table||' B'||
11582             ' WHERE B.status'||p_exec_mode_clause||
11583             ' AND   {{data_slice}} '||
11584             ' AND NOT EXISTS (SELECT 0 FROM '||
11585             p_source_tl_table||' S1'||
11586             ' WHERE S1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
11587             ' AND S1.value_set_display_code = B.value_set_display_code'||
11588             ' AND S1.status'||p_exec_mode_clause||')'||
11589             ' AND NOT EXISTS (SELECT 0 FROM '||
11590             p_target_b_table||' G'||
11591             ', fem_value_sets_b V'||
11592             ' WHERE to_char(G.'||p_member_dc_col||') = B.'||p_member_t_dc_col||
11593             ' AND G.value_set_id = V.value_set_id'||
11594             ' AND V.value_set_display_code = B.value_set_display_code)';
11595       ELSIF (p_load_type = 'DIMENSION_MEMBER')
11596             AND (p_value_set_required_flag = 'N')
11597             AND (p_shared_dimension_flag = 'N') THEN
11598             x_bad_member_select_stmt :=
11599             'SELECT B.rowid'||
11600             ',''MISSING_NAME'''||
11601             ' FROM '||p_source_b_table||' B'||
11602             ' WHERE B.status'||p_exec_mode_clause||
11603             ' AND   {{data_slice}} '||
11604             ' AND NOT EXISTS (SELECT 0 FROM '||
11605             p_source_tl_table||' S1'||
11606             ' WHERE S1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
11607             ' AND S1.status'||p_exec_mode_clause||')'||
11608             ' AND NOT EXISTS (SELECT 0 FROM '||
11609             p_target_b_table||' G'||
11610             ' WHERE to_char(G.'||p_member_dc_col||') = B.'||p_member_t_dc_col||')';
11611       ELSE
11612             x_bad_member_select_stmt :=
11613             'SELECT B.rowid'||
11614             ',''MISSING_NAME'''||
11615             ' FROM '||p_source_b_table||' B'||
11616             ' WHERE B.status'||p_exec_mode_clause||
11617             ' AND   {{data_slice}} '||
11618             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
11619             ' AND NOT EXISTS (SELECT 0 FROM '||
11620             p_source_tl_table||' S1'||
11621             ' WHERE S1.'||p_member_t_dc_col||' = B.'||p_member_t_dc_col||
11622             ' AND S1.dimension_varchar_label = B.dimension_varchar_label'||
11623             ' AND S1.status'||p_exec_mode_clause||')'||
11624             ' AND NOT EXISTS (SELECT 0 FROM '||
11625             p_target_b_table||' G'||
11626             ' WHERE to_char(G.'||p_member_dc_col||') = B.'||p_member_t_dc_col||')';
11627 
11628 
11629       END IF;
11630 
11631 
11632       FEM_ENGINES_PKG.TECH_MESSAGE
11633        (c_log_level_2,c_block||'.'||
11634         'build_bad_new_members_stmt',
11635         'End');
11636 
11637       END build_bad_new_mbrs_stmt;
11638 
11639 
11640 /*===========================================================================+
11641  | PROCEDURE
11642  |              BUILD_BAD_ATTR_VERS_STMT
11643  |
11644  | DESCRIPTION
11645  |                 Retrieves any attribute assignment records from the _ATTR_T
11646  |                 table that have version_display_code values that do not exist
11647  |                 in FEM.
11648  |
11649  |
11650  | SCOPE - PRIVATE
11651  |
11652  | NOTES
11653  |
11654  |
11655  |
11656  |
11657  | MODIFICATION HISTORY
11658  |    Rob Flippo   10-MAR-04  Created
11659  |    Rob Flippo   12-NOV-04  Added where condition on aw_snapshot_flag = N
11660  |                            to prevent users from trying update snapshot
11661  |                            versions
11662  |    Rob Flippo   31-JAN-05  Added where condition on dimension_varchar_label
11663  |                            when the dimension uses the shared ATTR_T table
11664  |    Rob Flippo   15-MAR-05  Bug#4226011 add where user_assign_allowed_flag
11665  |                            not in 'N' to the select stmt
11666  +===========================================================================*/
11667 
11668    procedure build_bad_attr_vers_stmt (p_dimension_varchar_label IN VARCHAR2
11669                                       ,p_source_attr_table IN VARCHAR2
11670                                       ,p_shared_dimension_flag IN VARCHAR2
11671                                       ,p_exec_mode_clause IN VARCHAR2
11672                                       ,x_bad_attr_vers_select_stmt OUT NOCOPY VARCHAR2)
11673  IS
11674     v_dim_label_where_cond VARCHAR2(1000);
11675 
11676  BEGIN
11677       FEM_ENGINES_PKG.TECH_MESSAGE
11678        (c_log_level_2,c_block||'.'||
11679         'build_bad_attr_vers_stmt',
11680         'Begin Build SQL statement to retrieve invalid attribute assignments from the source _ATTR_T table');
11681 
11682       IF p_shared_dimension_flag = 'Y' THEN
11683          v_dim_label_where_cond  :=
11684             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
11685       ELSE
11686          v_dim_label_where_cond := '';
11687       END IF;
11688 
11689 
11690          x_bad_attr_vers_select_stmt :=
11691             'SELECT B.rowid'||
11692             ',''INVALID_VERSION'''||
11693             ' FROM '||p_source_attr_table||' B'||
11694             ' WHERE B.status'||p_exec_mode_clause||
11695             v_dim_label_where_cond||
11696             ' AND NOT EXISTS (SELECT 0 FROM fem_dim_attr_versions_b V'||
11697             ' ,fem_dim_attributes_b D'||
11698             ' WHERE V.version_display_code = B.version_display_code'||
11699             ' AND V.attribute_id = D.attribute_id'||
11700             ' AND V.aw_snapshot_flag = ''N'''||
11701             ' AND D.attribute_varchar_label = B.attribute_varchar_label)'||
11702             ' AND EXISTS (SELECT 0 FROM fem_dim_attributes_b A'||
11703             ' WHERE A.attribute_varchar_label = B.attribute_varchar_label'||
11704             ' AND nvl(A.user_assign_allowed_flag,''Y'') not in (''N''))'||
11705             ' AND   {{data_slice}} ';
11706 
11707       FEM_ENGINES_PKG.TECH_MESSAGE
11708        (c_log_level_2,c_block||'.'||
11709         'build_bad_attr_vers_stmt',
11710         'End');
11711 
11712       END build_bad_attr_vers_stmt;
11713 
11714 
11715 /*===========================================================================+
11716  | PROCEDURE
11717  |              GET_ATTR_VERSION
11718  |
11719  | DESCRIPTION
11720  |                 Verifies that a version name for a particular attribute
11721  |                 exists for the given Language and returns the VERSION_ID
11722  |
11723  |
11724  |
11725  | SCOPE - PRIVATE
11726  |
11727  | NOTES
11728  |
11729  |
11730  |
11731  |
11732  | MODIFICATION HISTORY
11733  |    Rob Flippo   28-OCT-03  Created
11734  |
11735  +===========================================================================*/
11736 
11737 
11738    procedure get_attr_version (p_dimension_varchar_label IN VARCHAR2
11739                               ,p_attribute_varchar_label IN VARCHAR2
11740                               ,p_version_display_code IN VARCHAR2
11741                               ,x_version_id OUT NOCOPY NUMBER)
11742    IS
11743 
11744 
11745    BEGIN
11746       FEM_ENGINES_PKG.TECH_MESSAGE
11747        (c_log_level_2,c_block||'.'||
11748         'get_attr_version',
11749         'Begin verify that a version display_code exists for an attribute');
11750 
11751       FEM_ENGINES_PKG.TECH_MESSAGE
11752        (c_log_level_1,c_block||'.'||
11753         'get_attr_version.attribute_varchar_label',
11754         p_attribute_varchar_label);
11755 
11756       FEM_ENGINES_PKG.TECH_MESSAGE
11757        (c_log_level_1,c_block||'.'||
11758         'get_attr_version.version_display_code',
11759         p_version_display_code);
11760 
11761       SELECT B.version_id
11762       INTO x_version_id
11763       FROM fem_dim_attr_versions_b B, fem_dim_attributes_b A, fem_dimensions_b D
11764       WHERE B.version_display_code = p_version_display_code
11765       AND B.attribute_id = A.attribute_id
11766       AND A.attribute_varchar_label = p_attribute_varchar_label
11767       AND D.dimension_varchar_label = p_dimension_varchar_label
11768       AND D.dimension_id = A.dimension_id;
11769 
11770       FEM_ENGINES_PKG.TECH_MESSAGE
11771        (c_log_level_2,c_block||'.'||
11772         'get_attr_version',
11773         'End');
11774 
11775    EXCEPTION
11776       WHEN no_data_found THEN
11777          x_version_id := '';
11778 
11779    END get_attr_version;
11780 
11781 
11782 /*===========================================================================+
11783  | PROCEDURE
11784  |              BUILD_INSERT_MEMBER_STMT
11785  |
11786  | DESCRIPTION
11787  |                 Procedure that constructs the dynamic statement that calls the
11788  |                 INSERT_ROW procedure of the table handler
11789  |
11790  |
11791  |
11792  | SCOPE - PRIVATE
11793  |
11794  | NOTES
11795  |
11796  |
11797  |
11798  |
11799  | MODIFICATION HISTORY
11800  |    Rob Flippo   28-OCT-03  Created
11801  |    Rob Flippo   04-AUG-06  Bug5060746 Change literals to bind variables
11802  |                            whereever possible
11803  |
11804  +===========================================================================*/
11805 
11806 
11807    procedure build_insert_member_stmt (p_table_handler_name IN VARCHAR2
11808                                       ,p_dimension_id IN NUMBER
11809                                       ,p_value_set_required_flag IN VARCHAR2
11810                                       ,p_hier_dimension_flag IN VARCHAR2
11811                                       ,p_simple_dimension_flag IN VARCHAR2
11812                                       ,p_member_id_method_code IN VARCHAR2
11813                                       ,p_member_col IN VARCHAR2
11814                                       ,p_member_dc_col IN VARCHAR
11815                                       ,p_member_name_col IN VARCHAR2
11816                                       ,x_insert_member_stmt OUT NOCOPY VARCHAR2)
11817 
11818    IS
11819 
11820    BEGIN
11821       FEM_ENGINES_PKG.TECH_MESSAGE
11822        (c_log_level_2,c_block||'.'||
11823         'build_insert_member_stmt',
11824         'Begin SQL statement to insert new dimension members');
11825 
11826       IF p_table_handler_name = 'FEM_CAL_PERIODS_PKG' THEN
11827          x_insert_member_stmt :=
11828                    'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER;'||
11829                    'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11830                    '(x_rowid => v_row_id '||
11831                   ',x_'||p_member_col||' => fem_dimension_util_pkg.generate_member_id('||
11832                   ':b_end_date,:b_period_number,:b_calendar_id, :b_dimension_group_id,v_err_code,x_num_msg) '||
11833                   ',x_dimension_group_id => :b_dimension_group_id '||
11834                   ',x_calendar_id => :b_calendar_id '||
11835                   ',x_enabled_flag => ''Y'' '||
11836                   ',x_personal_flag => ''N'' '||
11837                   ',x_read_only_flag => ''N'' '||
11838                   ',x_object_version_number => '||c_object_version_number||
11839                   ',x_'||p_member_name_col||' => :b_member_name'||
11840                   ',x_description => :b_member_desc '||
11841                   ',x_creation_date => sysdate '||
11842                   ',x_created_by => :b_apps_user_id'||
11843                   ',x_last_update_date => sysdate '||
11844                   ',x_last_updated_by => :b_apps_user_id2'||
11845                   ',x_last_update_login => null ); END;';
11846       ELSIF (p_table_handler_name = 'FEM_DIMENSION_GRPS_PKG') THEN
11847          x_insert_member_stmt :=
11848                   'DECLARE v_row_id VARCHAR2(1000); '||
11849                   'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11850                   '(x_rowid => v_row_id '||
11851                   ',x_'||p_member_dc_col||' => :b_member_dc '||
11852                   ',x_enabled_flag => ''Y'' '||
11853                   ',x_personal_flag => ''N'' '||
11854                   ',x_read_only_flag => ''N'' '||
11855                   ',x_object_version_number => '||c_object_version_number||
11856                   ',x_'||p_member_name_col||' => :b_member_name'||
11857                   ',x_description => :b_member_desc '||
11858                   ',x_creation_date => sysdate '||
11859                   ',x_created_by => :b_apps_user_id'||
11860                   ',x_last_update_date => sysdate '||
11861                   ',x_last_updated_by => :b_apps_user_id2'||
11862                   ',x_last_update_login => null '||
11863                   ',x_time_dimension_group_key => :b_time_dimension_group_key '||
11864                   ',x_dimension_group_seq => :b_dimension_group_seq'||
11865                   ',x_time_group_type_code => :b_time_group_type_code'||
11866                   ',x_dimension_group_id => :b_dimension_group_id'||
11867                   ',x_dimension_id => :b_dimension_id ); END;';
11868 
11869       ELSIF (p_value_set_required_flag = 'Y'
11870              AND p_hier_dimension_flag = 'Y'
11871              AND p_member_id_method_code = 'FUNCTION') THEN
11872          x_insert_member_stmt :=
11873                   'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11874                   'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11875                   '(x_rowid => v_row_id'||
11876                    ',x_'||p_member_col||' =>'||
11877                    'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11878                   ',x_value_set_id => :b_value_set_id '||
11879                   ',x_dimension_group_id =>:b_dimension_group_id '||
11880                   ',x_'||p_member_dc_col||' => :b_member_dc'||
11881                   ',x_enabled_flag => ''Y'' '||
11882                   ',x_personal_flag => ''N'' '||
11883                   ',x_read_only_flag => ''N'' '||
11884                   ',x_object_version_number => '||c_object_version_number||
11885                   ',x_'||p_member_name_col||' => :b_member_name'||
11886                   ',x_description => :b_member_desc '||
11887                   ',x_creation_date => sysdate '||
11888                   ',x_created_by => :b_apps_user_id'||
11889                   ',x_last_update_date => sysdate '||
11890                   ',x_last_updated_by => :b_apps_user_id2'||
11891                   ',x_last_update_login => null ); END;';
11892 
11893       ELSIF (p_value_set_required_flag = 'Y'
11894              AND p_hier_dimension_flag = 'N'
11895              AND p_member_id_method_code = 'FUNCTION') THEN
11896          x_insert_member_stmt :=
11897                   'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11898                   'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11899                   '(x_rowid => v_row_id'||
11900                    ',x_'||p_member_col||' =>'||
11901                    'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11902                   ',x_value_set_id => :b_value_set_id '||
11903                   ',x_'||p_member_dc_col||' => :b_member_dc'||
11904                   ',x_enabled_flag => ''Y'' '||
11905                   ',x_personal_flag => ''N'' '||
11906                   ',x_read_only_flag => ''N'' '||
11907                   ',x_object_version_number => '||c_object_version_number||
11908                   ',x_'||p_member_name_col||' => :b_member_name'||
11909                   ',x_description => :b_member_desc '||
11910                   ',x_creation_date => sysdate '||
11911                   ',x_created_by => :b_apps_user_id'||
11912                   ',x_last_update_date => sysdate '||
11913                   ',x_last_updated_by => :b_apps_user_id2'||
11914                   ',x_last_update_login => null ); END;';
11915       ELSIF (p_value_set_required_flag = 'N'
11916              AND p_hier_dimension_flag = 'Y'
11917              AND p_member_id_method_code = 'FUNCTION') THEN
11918          x_insert_member_stmt :=
11919                   'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11920                   'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11921                   '(x_rowid => v_row_id'||
11922                    ',x_'||p_member_col||' =>'||
11923                    'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11924                   ',x_dimension_group_id =>:b_dimension_group_id '||
11925                   ',x_'||p_member_dc_col||' => :b_member_dc'||
11926                   ',x_enabled_flag => ''Y'' '||
11927                   ',x_personal_flag => ''N'' '||
11928                   ',x_read_only_flag => ''N'' '||
11929                   ',x_object_version_number => '||c_object_version_number||
11930                   ',x_'||p_member_name_col||' => :b_member_name'||
11931                   ',x_description => :b_member_desc '||
11932                   ',x_creation_date => sysdate '||
11933                   ',x_created_by => :b_apps_user_id'||
11934                   ',x_last_update_date => sysdate '||
11935                   ',x_last_updated_by => :b_apps_user_id2'||
11936                   ',x_last_update_login => null ); END;';
11937       ELSIF (p_value_set_required_flag = 'N'
11938              AND p_hier_dimension_flag = 'N'
11939              AND p_member_id_method_code = 'FUNCTION') THEN
11940          x_insert_member_stmt :=
11941                   'DECLARE v_row_id VARCHAR2(1000); v_err_code NUMBER; x_num_msg NUMBER; '||
11942                   'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11943                   '(x_rowid => v_row_id'||
11944                    ',x_'||p_member_col||' =>'||
11945                    'fem_dimension_util_pkg.generate_member_id('||p_dimension_id||',v_err_code,x_num_msg)'||
11946                   ',x_'||p_member_dc_col||' => :b_member_dc'||
11947                   ',x_enabled_flag => ''Y'' '||
11948                   ',x_personal_flag => ''N'' '||
11949                   ',x_read_only_flag => ''N'' '||
11950                   ',x_object_version_number => '||c_object_version_number||
11951                   ',x_'||p_member_name_col||' => :b_member_name'||
11952                   ',x_description => :b_member_desc '||
11953                   ',x_creation_date => sysdate '||
11954                   ',x_created_by => :b_apps_user_id'||
11955                   ',x_last_update_date => sysdate '||
11956                   ',x_last_updated_by => :b_apps_user_id2'||
11957                   ',x_last_update_login => null ); END;';
11958 
11959       ELSE
11960          x_insert_member_stmt :=
11961                   'DECLARE v_row_id VARCHAR2(1000); '||
11962                   'BEGIN '||p_table_handler_name||'.INSERT_ROW'||
11963                   '(x_rowid => v_row_id '||
11964                   ',x_'||p_member_col||' => :b_member_dc '||
11965                   ',x_enabled_flag => ''Y'' '||
11966                   ',x_personal_flag => ''N'' '||
11967                   ',x_read_only_flag => ''N'' '||
11968                   ',x_object_version_number => '||c_object_version_number||
11969                   ',x_'||p_member_name_col||' => :b_member_name'||
11970                   ',x_description => :b_member_desc '||
11971                   ',x_creation_date => sysdate '||
11972                   ',x_created_by => :b_apps_user_id'||
11973                   ',x_last_update_date => sysdate '||
11974                   ',x_last_updated_by => :b_apps_user_id2'||
11975                   ',x_last_update_login => null ); END;';
11976 
11977       END IF;
11978 
11979       FEM_ENGINES_PKG.TECH_MESSAGE
11980        (c_log_level_2,c_block||'.'||
11981         'build_insert_member_stmt',
11982         'End');
11983 
11984    END build_insert_member_stmt;
11985 
11986 
11987 /*===========================================================================+
11988  | PROCEDURE
11989  |              BUILD_INSERT_ATTR_STMT
11990  |
11991  | DESCRIPTION
11992  |                 Procedure that constructs the dynamic insert statement
11993  |                 for inserting into the ATTR table
11994  |
11995  |
11996  |
11997  | SCOPE - PRIVATE
11998  |
11999  | NOTES
12000  |
12001  |
12002  |
12003  |
12004  | MODIFICATION HISTORY
12005  |    Rob Flippo   28-OCT-03  Created
12006  |    Rob Flippo   04-AUG-06  Bug5060746 Change literals to bind variables
12007  |                            whereever possible
12008  |
12009  +===========================================================================*/
12010 
12011 
12012    procedure build_insert_attr_stmt (p_target_attr_table IN VARCHAR2
12013                                     ,p_target_b_table IN VARCHAR2
12014                                     ,p_member_col IN VARCHAR2
12015                                     ,p_member_dc_col IN VARCHAR2
12016                                     ,p_value_set_required_flag IN VARCHAR2
12017                                     ,x_insert_attr_stmt OUT NOCOPY VARCHAR2)
12018 
12019    IS
12020 
12021       v_value_set_parm       VARCHAR2(100);
12022       v_value_set_column     VARCHAR2(30);
12023       v_value_set_select     VARCHAR2(100);
12024       v_value_set_where_cond VARCHAR2(1000);
12025       v_value_set_table      VARCHAR2(100);
12026 
12027    BEGIN
12028       FEM_ENGINES_PKG.TECH_MESSAGE
12029        (c_log_level_2,c_block||'.'||
12030         'build_insert_attr_stmt',
12031         'Begin SQL statement to insert new attribute assignments');
12032 
12033       IF p_value_set_required_flag = 'Y' THEN
12034          v_value_set_parm := ', :b_value_set_id';
12035          v_value_set_column := ', value_set_id';
12036          v_value_set_select := ', V1.value_set_id';
12037          v_value_set_where_cond := ' AND B1.value_set_id = V1.value_set_id '||
12038                                    ' AND V1.value_set_display_code = :b_value_set_display_code';
12039          v_value_set_table := ', FEM_VALUE_SETS_B V1';
12040       ELSE
12041          v_value_set_parm := '';
12042          v_value_set_column := '';
12043          v_value_set_select := '';
12044          v_value_set_where_cond := '';
12045          v_value_set_table := '';
12046       END IF;
12047 
12048 
12049       x_insert_attr_stmt := 'INSERT INTO '||p_target_attr_table||' ('||
12050                             'attribute_id'||
12051                             ',version_id'||
12052                             ','||p_member_col||
12053                             v_value_set_column||
12054                             ', dim_attribute_numeric_member'||
12055                             ', dim_attribute_value_set_id'||
12056                             ', dim_attribute_varchar_member'||
12057                             ', number_assign_value'||
12058                             ', varchar_assign_value'||
12059                             ', date_assign_value'||
12060                             ', creation_date'||
12061                             ', created_by'||
12062                             ', last_updated_by'||
12063                             ', last_update_date'||
12064                             ', last_update_login'||
12065 
12066                             ', object_version_number'||
12067                             ', aw_snapshot_flag)'||
12068                             ' SELECT'||
12069                             ' :b_attribute_id '||
12070                             ', :b_version_id '||
12071                             ','||p_member_col||
12072                             v_value_set_select||
12073                             ', :b_dim_attribute_numeric_member'||
12074                             ', :b_attr_assign_vs_id'||
12075                             ', :b_dim_attribute_varchar_member'||
12076                             ', :b_number_assign_value'||
12077                             ', :b_varchar_assign_value'||
12078                             ', :b_date_assign_value'||
12079                             ', sysdate'||
12080                             ',:b_apps_user_id'||
12081                             ',:b_apps_user_id2'||
12082                             ', sysdate'||
12083                             ', null'||
12084                             ', 1'||
12085                             ', ''N'''||
12086                             ' FROM '||p_target_b_table||' B1 '||
12087                             v_value_set_table||
12088                             ' WHERE B1.'||p_member_dc_col||' = :b_member_dc'||
12089                             v_value_set_where_cond||
12090                             ' AND :b_status = ''LOAD''';
12091 
12092       FEM_ENGINES_PKG.TECH_MESSAGE
12093        (c_log_level_2,c_block||'.'||
12094         'build_insert_attr_stmt',
12095         'End');
12096 
12097    END build_insert_attr_stmt;
12098 
12099 
12100 /*===========================================================================+
12101  | PROCEDURE
12102  |              BUILD_STATUS_UPDATE_STMT
12103  |
12104  | DESCRIPTION
12105  |                 Procedure that constructs the dynamic update statement
12106  |                 for setting the status in the _T table for any records
12107  |                 not loaded.
12108  |
12109  | SCOPE - PRIVATE
12110  |
12111  | NOTES
12112  |
12113  | MODIFICATION HISTORY
12114  |    Rob Flippo   04-NOV-03  Created
12115  |
12116  +===========================================================================*/
12117 
12118    procedure build_status_update_stmt (p_source_table IN VARCHAR2
12119                                       ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12120 
12121    IS
12122 
12123    BEGIN
12124       FEM_ENGINES_PKG.TECH_MESSAGE
12125        (c_log_level_2,c_block||'.'||
12126         'build_status_update_stmt',
12127         'Begin SQL statement to update the status in the source interface table');
12128 
12129 
12130       x_update_status_stmt := 'UPDATE '||p_source_table||
12131                               ' SET status = :b_t_a_status '||
12132                               ' WHERE rowid = :b_rowid'||
12133                               ' AND   :b_t_a_status <> ''LOAD''';
12134 
12135       FEM_ENGINES_PKG.TECH_MESSAGE
12136        (c_log_level_2,c_block||'.'||
12137         'build_status_update_stmt',
12138         'End');
12139 
12140    END build_status_update_stmt;
12141 
12142 /*===========================================================================+
12143  | PROCEDURE
12144  |              BUILD_CALP_STATUS_UPDATE_STMT
12145  |
12146  | DESCRIPTION
12147  |                 Procedure that constructs the dynamic update statement
12148  |                 for setting the status in the various CAL_PERIOD
12149  |                 _T table for any records identified in the Interim table
12150  |                 as having an error
12151  |
12152  | SCOPE - PRIVATE
12153  |
12154  | NOTES
12155  |
12156  | MODIFICATION HISTORY
12157  |    Rob Flippo   05-JAN-05  Created
12158  |
12159  +===========================================================================*/
12160 
12161    procedure build_calp_status_update_stmt (p_operation_mode IN VARCHAR2
12162                                            ,p_source_table IN VARCHAR2
12163                                            ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12164 
12165    IS
12166 
12167    BEGIN
12168       FEM_ENGINES_PKG.TECH_MESSAGE
12169        (c_log_level_2,c_block||'.'||
12170         'build_calp_status_update_stmt',
12171         'Begin SQL statement to update the status in the interface table based on bad records from the CALP Interim table');
12172 
12173       IF p_operation_mode = 'ATTRIBUTE_LABEL' THEN
12174 
12175          x_update_status_stmt := 'UPDATE '||p_source_table||
12176                                  ' SET status = :b_t_a_status '||
12177                                  ' WHERE cal_period_number = :b_cal_period_number'||
12178                                  ' AND cal_period_end_date = :b_cal_period_end_date'||
12179                                  ' AND calendar_display_code = :b_calendar_dc'||
12180                                  ' AND dimension_group_display_code = :b_dimension_group_dc'||
12181                                  ' AND :b_overlap_flag = ''Y'''||
12182                                  ' AND attribute_varchar_label = ''CAL_PERIOD_START_DATE''';
12183       ELSE
12184          x_update_status_stmt := 'UPDATE '||p_source_table||
12185                                  ' SET status = :b_t_a_status '||
12186                                  ' WHERE cal_period_number = :b_cal_period_number'||
12187                                  ' AND cal_period_end_date = :b_cal_period_end_date'||
12188                                  ' AND calendar_display_code = :b_calendar_dc'||
12189                                  ' AND dimension_group_display_code = :b_dimension_group_dc'||
12190                                  ' AND   :b_overlap_flag = ''Y''';
12191 
12192       END IF;
12193 
12194       FEM_ENGINES_PKG.TECH_MESSAGE
12195        (c_log_level_2,c_block||'.'||
12196         'build_calp_status_update_stmt',
12197         'End');
12198 
12199    END build_calp_status_update_stmt;
12200 /*===========================================================================+
12201  | PROCEDURE
12202  |              BUILD_CALP_DELETE_STMT
12203  |
12204  | DESCRIPTION
12205  |                 Procedure that constructs the dynamic delete statement
12206  |                 for setting CAL_PERIOD members from the INTERIM table
12207  |                 that were successfully moved into FEM
12208  |
12209  | SCOPE - PRIVATE
12210  |
12211  | NOTES
12212  |
12213  | MODIFICATION HISTORY
12214  |    Rob Flippo   25-JAN-05  Created
12215  |    Rob Flippo   15-MAR-07  Bug#5900463 - TL rows for other languages
12216  |                            getting deleted when new members are being
12217  |                            loaded
12218  |
12219  +===========================================================================*/
12220 
12221    procedure build_calp_delete_stmt (p_source_table IN VARCHAR2
12222                                     ,p_operation_mode IN VARCHAR2
12223                                     ,x_calp_delete_stmt OUT NOCOPY VARCHAR2)
12224 
12225    IS
12226 
12227       v_attr_where_cond VARCHAR2(4000);
12228       v_tl_where_cond VARCHAR2(4000);
12229 
12230    BEGIN
12231       FEM_ENGINES_PKG.TECH_MESSAGE
12232        (c_log_level_2,c_block||'.'||
12233         'build_calp_delete_stmt',
12234         'Begin SQL statement to delete rows from the CAL_PERIOD interface tables');
12235       IF p_source_table = 'FEM_CAL_PERIODS_ATTR_T' THEN
12236          v_tl_where_cond := null;
12237          IF p_operation_mode = 'NEW_MEMBERS' THEN
12238             v_attr_where_cond := ' AND attribute_varchar_label IN '||
12239                                  ' (SELECT attribute_varchar_label'||
12240                                  '  FROM fem_dim_attributes_b'||
12241                                  '  WHERE dimension_id=1'||
12242                                  '  AND attribute_required_flag = ''Y'')';
12243          ELSE
12244             v_attr_where_cond := ' AND attribute_varchar_label IN '||
12245                                  ' (SELECT attribute_varchar_label'||
12246                                  '  FROM fem_dim_attributes_b A, fem_calp_attr_interim_t I'||
12247                                  '  WHERE A.dimension_id=1'||
12248                                  '  AND A.attribute_id = I.attribute_id'||
12249                                  '  AND I.cal_period_id = :cal_period_id'||
12250                                  '  AND overlap_flag = ''N'')';
12251 
12252          END IF;
12253       ELSIF p_source_table = 'FEM_CAL_PERIODS_TL_T' THEN
12254          v_attr_where_cond := null;
12255          v_tl_where_cond := ' AND language = userenv(''LANG'')';
12256       ELSE
12257          v_attr_where_cond := null;
12258          v_tl_where_cond := null;
12259       END IF;
12260 
12261 
12262 
12263          x_calp_delete_stmt := 'DELETE FROM '||p_source_table||
12264                                ' WHERE cal_period_number = :b_cal_period_number'||
12265                                ' AND cal_period_end_date = :b_cal_period_end_date'||
12266                                ' AND calendar_display_code = :b_calendar_dc'||
12267                                ' AND dimension_group_display_code = :b_dimension_group_dc'||
12268                                v_attr_where_cond||v_tl_where_cond;
12269 
12270 
12271       FEM_ENGINES_PKG.TECH_MESSAGE
12272        (c_log_level_2,c_block||'.'||
12273         'build_calp_delete_stmt',
12274         'End');
12275 
12276    END build_calp_delete_stmt;
12277 
12278 
12279 
12280 /*===========================================================================+
12281  | PROCEDURE
12282  |              BUILD_DEP_STATUS_UPDATE_STMT
12283  |
12284  | DESCRIPTION
12285  |                 Procedure that constructs the dynamic update statement
12286  |                 for setting the status in the depended _T tables (_ATTR and _TL_T)
12287  |                 for records with the same member identifier as records
12288  |                 that were identified in the _B_T table as having a bad Dimension Group,
12289  |                 Bad Value Set, or Missing Name
12290  |
12291  |
12292  | SCOPE - PRIVATE
12293  |
12294  | NOTES
12295  |    We only want to update dependent attribute records where the status='LOAD'
12296  |    And the member failed for some other reason.  This is just so that all attr
12297  |    records for failed members have some sort of error status, thus enabling
12298  |    the records to be all reprocessed with an Error Reprocessing run
12299  | MODIFICATION HISTORY
12300  |    Rob Flippo   29-MAR-04  Created
12301  |    Rob Flippo   17-SEP-04  This procedure is obsolete and is no longer called
12302  |
12303  +===========================================================================*/
12304 
12305    procedure build_dep_status_update_stmt (p_dimension_varchar_label IN VARCHAR2
12306                                       ,p_source_table IN VARCHAR2
12307                                       ,p_member_t_dc_col IN VARCHAR2
12308                                       ,p_value_set_required_flag IN VARCHAR2
12309                                       ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12310 
12311    IS
12312 
12313    BEGIN
12314       FEM_ENGINES_PKG.TECH_MESSAGE
12315        (c_log_level_2,c_block||'.'||
12316         'build_dep_status_update_stmt',
12317         'Begin');
12318 
12319    IF (p_dimension_varchar_label = 'CAL_PERIOD') THEN
12320 
12321       x_update_status_stmt := 'UPDATE '||p_source_table||
12322                               ' SET status = ''INVALID_MEMBER'' '||
12323                               ' WHERE calendar_display_code = :b_calendar_display_code'||
12324                               ' AND dimension_group_display_code = :b_dimension_group_display_code'||
12325                               ' AND cal_period_end_date = :b_cal_period_end_date'||
12326                               ' AND cal_period_number = :b_cal_period_number'||
12327                               ' AND   :b_t_a_status <> ''LOAD'''||
12328                               ' AND status IN (''LOAD'')';
12329 
12330    ELSIF (p_value_set_required_flag = 'Y') THEN
12331       x_update_status_stmt := 'UPDATE '||p_source_table||
12332                               ' SET status = ''INVALID_MEMBER'' '||
12333                               ' WHERE '||p_member_t_dc_col||' = :b_member_dc'||
12334                               ' AND value_set_display_code = :b_value_set_display_code'||
12335                               ' AND   :b_t_a_status <> ''LOAD'''||
12336                               ' AND status IN (''LOAD'')';
12337    END IF;
12338 
12339       FEM_ENGINES_PKG.TECH_MESSAGE
12340        (c_log_level_2,c_block||'.'||
12341         'build_dep_status_update_stmt',
12342         'End');
12343 
12344    END build_dep_status_update_stmt;
12345 
12346 
12347 /*===========================================================================+
12348  | PROCEDURE
12349  |              BUILD_ATTRLAB_UPDATE_STMT
12350  |
12351  | DESCRIPTION
12352  |                 Procedure that constructs the dynamic update statement
12353  |                 for setting the status in the ATTR_T tables
12354  |                 for records where the ATTRIBUTE_VARCHAR_LABEL does not exist;
12355  |                 such records would not otherwise be updated
12356  |
12357  |
12358  | SCOPE - PRIVATE
12359  |
12360  | NOTES
12361  | MODIFICATION HISTORY
12362  |    Rob Flippo   14-SEP-04  Created
12363  |
12364  +===========================================================================*/
12365 
12366    procedure build_attrlab_update_stmt (p_dimension_varchar_label IN VARCHAR2
12367                                       ,p_source_attr_table IN VARCHAR2
12368                                       ,p_shared_dimension_flag IN VARCHAR2
12369                                       ,p_exec_mode_clause IN VARCHAR2
12370                                       ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12371 
12372    IS
12373 
12374       v_dim_label_where_cond VARCHAR2(1000);
12375 
12376    BEGIN
12377       FEM_ENGINES_PKG.TECH_MESSAGE
12378        (c_log_level_2,c_block||'.'||
12379         'build_attrlab_update_stmt',
12380         'Begin');
12381 
12382       IF p_shared_dimension_flag = 'Y' THEN
12383          v_dim_label_where_cond  :=
12384             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12385       ELSE
12386          v_dim_label_where_cond := '';
12387       END IF;
12388 
12389 
12390       x_update_status_stmt := 'UPDATE '||p_source_attr_table||' B'||
12391                               ' SET status = ''INVALID_ATTRIBUTE_LABEL'' '||
12392                               ' WHERE attribute_varchar_label NOT IN (SELECT '||
12393                               ' attribute_varchar_label FROM fem_dim_attributes_b A'||
12394                               ' ,fem_dimensions_b D '||
12395                               ' WHERE D.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
12396                               ' AND D.dimension_id = A.dimension_id)'||
12397                               ' AND B.status '||p_exec_mode_clause||
12398                               v_dim_label_where_cond||
12399                               ' AND   {{data_slice}} ';
12400 
12401 
12402       FEM_ENGINES_PKG.TECH_MESSAGE
12403        (c_log_level_2,c_block||'.'||
12404         'build_attrlab_update_stmt',
12405         'End');
12406 
12407    END build_attrlab_update_stmt;
12408 
12409 /*===========================================================================+
12410  | PROCEDURE
12411  |              BUILD_NOT_USER_LABEL_UPD_STMT
12412  |
12413  | DESCRIPTION
12414  |                 Procedure that constructs the dynamic update statement
12415  |                 for setting the status in the ATTR_T tables
12416  |                 for records where the ATTRIBUTE_VARCHAR_LABEL is
12417  |                 user_assign_allowed_flag = 'N';
12418  |                 such records would not otherwise be updated
12419  |
12420  |
12421  | SCOPE - PRIVATE
12422  |
12423  | NOTES
12424  | MODIFICATION HISTORY
12425  |    Rob Flippo   15-MAR-05  Created
12426  |
12427  +===========================================================================*/
12428 
12429    procedure build_not_user_label_upd_stmt (p_dimension_varchar_label IN VARCHAR2
12430                                       ,p_source_attr_table IN VARCHAR2
12431                                       ,p_shared_dimension_flag IN VARCHAR2
12432                                       ,p_exec_mode_clause IN VARCHAR2
12433                                       ,x_update_status_stmt OUT NOCOPY VARCHAR2)
12434 
12435    IS
12436 
12437       v_dim_label_where_cond VARCHAR2(1000);
12438 
12439    BEGIN
12440       FEM_ENGINES_PKG.TECH_MESSAGE
12441        (c_log_level_2,c_block||'.'||
12442         'build_attrlab_update_stmt',
12443         'Begin');
12444 
12445       IF p_shared_dimension_flag = 'Y' THEN
12446          v_dim_label_where_cond  :=
12447             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12448       ELSE
12449          v_dim_label_where_cond := '';
12450       END IF;
12451 
12452 
12453       x_update_status_stmt := 'UPDATE '||p_source_attr_table||' B'||
12454                               ' SET status = ''ATTR_LABEL_NOT_USER_ASSIGN'' '||
12455                               ' WHERE attribute_varchar_label IN (SELECT '||
12456                               ' attribute_varchar_label FROM fem_dim_attributes_b A'||
12457                               ' ,fem_dimensions_b D '||
12458                               ' WHERE D.dimension_varchar_label = '''||p_dimension_varchar_label||''''||
12459                               ' AND nvl(A.user_assign_allowed_flag,''Y'') = ''N'''||
12460                               ' AND D.dimension_id = A.dimension_id)'||
12461                               ' AND B.status '||p_exec_mode_clause||
12462                               v_dim_label_where_cond||
12463                               ' AND   {{data_slice}} ';
12464 
12465 
12466       FEM_ENGINES_PKG.TECH_MESSAGE
12467        (c_log_level_2,c_block||'.'||
12468         'build_attrlab_update_stmt',
12469         'End');
12470 
12471    END build_not_user_label_upd_stmt;
12472 
12473 
12474 
12475 /*===========================================================================+
12476  | PROCEDURE
12477  |              BUILD_DELETE_STMT
12478  |
12479  | DESCRIPTION
12480  |                 Procedure that constructs the dynamic delete statement
12481  |                 for removing loaded records from the _ATTR_T and _TL_T tables
12482  |
12483  |
12484  |
12485  | SCOPE - PRIVATE
12486  |
12487  | NOTES
12488  |
12489  |
12490  |
12491  |
12492  | MODIFICATION HISTORY
12493  |   Rob Flippo   04-NOV-03  Created
12494  |   Rob Flippo   05-JAN-05  Modified to include use_interim_table_flag
12495  +===========================================================================*/
12496 
12497    procedure build_delete_stmt (p_source_table IN VARCHAR2
12498                                ,x_delete_stmt OUT NOCOPY VARCHAR2)
12499 
12500    IS
12501 
12502    BEGIN
12503       FEM_ENGINES_PKG.TECH_MESSAGE
12504        (c_log_level_2,c_block||'.'||
12505         'build_delete_stmt',
12506         'Begin');
12507 
12508       x_delete_stmt := 'DELETE FROM '||p_source_table||
12509                        ' WHERE rowid = :b_rowid'||
12510                        ' AND   :b_t_a_status = ''LOAD'''||
12511                        ' AND :b_use_interim_table_flag = ''N''';
12512 
12513       FEM_ENGINES_PKG.TECH_MESSAGE
12514        (c_log_level_2,c_block||'.'||
12515         'build_delete_stmt',
12516         'End');
12517 
12518    END build_delete_stmt;
12519 
12520 
12521 /*===========================================================================+
12522  | PROCEDURE
12523  |              BUILD_SPECIAL_DELETE_STMT
12524  |
12525  | DESCRIPTION
12526  |                 Procedure that constructs the dynamic delete statement
12527  |                 for removing records from the _ATTR_T that successfully updated
12528  |
12529  |
12530  |
12531  | SCOPE - PRIVATE
12532  |
12533  | NOTES
12534  |
12535  |
12536  |
12537  |
12538  | MODIFICATION HISTORY
12539  |    Rob Flippo   04-NOV-03  Created
12540  |
12541  +===========================================================================*/
12542 
12543    procedure build_special_delete_stmt (p_source_table IN VARCHAR2
12544                                ,x_delete_stmt OUT NOCOPY VARCHAR2)
12545 
12546    IS
12547 
12548    BEGIN
12549       FEM_ENGINES_PKG.TECH_MESSAGE
12550        (c_log_level_2,c_block||'.'||
12551         'build_special_delete_stmt',
12552         'Begin');
12553 
12554       x_delete_stmt := 'DELETE FROM '||p_source_table||
12555                        ' WHERE rowid = :b_rowid'||
12556                        ' AND :b_allow_mult_assign_flag = ''N'''||
12557                        ' AND :b_attr_exists_count > 0'||
12558                        ' AND :b_status = ''LOAD'''||
12559                        ' AND :b_use_interim_table_flag = ''N''';
12560 
12561 
12562       FEM_ENGINES_PKG.TECH_MESSAGE
12563        (c_log_level_2,c_block||'.'||
12564         'build_special_delete_stmt',
12565         'End');
12566 
12567    END build_special_delete_stmt;
12568 
12569 
12570 
12571 /*===========================================================================+
12572  | PROCEDURE
12573  |              build_remain_mbr_select_stmt
12574  |
12575  | DESCRIPTION
12576  |                 Builds the dynamic SELECT statement for retrieving
12577  |                 the remaining members from the _B_T interface table.
12578  |                 When this SELECT is run, only the only records remaining
12579  |                 in the _B_T table with "LOAD" status are those for Value Set Required
12580  |                 dimensions that already exist in FEM.
12581  |                 Note that this SELECT stmt is not run for CAL_PERIOD and Simple dimensions
12582  |                 since the Dimension Group for members of those dimensions either
12583  |                 doesn't apply (Simple Dimensions) or can't be changed (CAL_PERIOD)
12584  |
12585  | SCOPE - PRIVATE
12586  |
12587  | NOTES
12588  |
12589  |
12590  |
12591  |
12592  | MODIFICATION HISTORY
12593  |    Rob Flippo   06-NOV-03  Created
12594  |    Rob Flippo   16-MAR-05  Bug34244082 Modify to return the member_id
12595  |                            in the select so that we can use that to
12596  |                            query the HIER table in Base_update
12597  |    Rob Flippo   22-MAR-05  Fix query so that dimension_id is part of where
12598  |                            condition when joining to FEM_DIMENSION_GRPS_B
12599  +===========================================================================*/
12600 
12601 
12602    procedure build_remain_mbr_select_stmt  (p_load_type IN VARCHAR2
12603                                            ,p_dimension_id IN NUMBER
12604                                            ,p_dimension_varchar_label IN VARCHAR2
12605                                            ,p_shared_dimension_flag IN VARCHAR2
12606                                            ,p_value_set_required_flag IN VARCHAR2
12607                                            ,p_hier_dimension_flag IN VARCHAR2
12608                                            ,p_source_b_table IN VARCHAR2
12609                                            ,p_target_b_table IN VARCHAR2
12610                                            ,p_member_col IN VARCHAR2
12611                                            ,p_member_dc_col IN VARCHAR2
12612                                            ,p_member_t_dc_col IN VARCHAR2
12613                                            ,p_exec_mode_clause IN VARCHAR2
12614                                            ,x_remain_mbr_select_stmt OUT NOCOPY VARCHAR2)
12615    IS
12616      -- Dimension Label where condition (for shared dimensions)
12617       v_dim_label_where_cond       VARCHAR2(1000);
12618 
12619 
12620    BEGIN
12621       FEM_ENGINES_PKG.TECH_MESSAGE
12622        (c_log_level_2,c_block||'.'||
12623         'build_remain_mbr_select_stmt',
12624         'Begin');
12625 
12626       -- setting the Dim Label conditions
12627       IF (p_value_set_required_flag = 'N'
12628           AND p_shared_dimension_flag = 'Y') THEN
12629          v_dim_label_where_cond  :=
12630             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12631       ELSE
12632          v_dim_label_where_cond  := '';
12633       END IF; -- setting the Dim Label conditions
12634 
12635 
12636    IF (p_load_type = 'DIMENSION_MEMBER') AND
12637       (p_value_set_required_flag = 'Y') AND
12638       (p_hier_dimension_flag = 'Y') THEN
12639          x_remain_mbr_select_stmt :=
12640             'SELECT B.rowid'||
12641             ', to_char(TB.'||p_member_col||')'||
12642             ', B.'||p_member_t_dc_col||
12643             ', B.value_set_display_code'||
12644             ', V.value_set_id'||
12645             ', B.dimension_group_display_code'||
12646             ', D.dimension_group_id'||
12647             ', TB.dimension_group_id'||
12648             ',null'||
12649             ',null'||
12650             ', ''LOAD'' '||
12651             ' FROM '||p_source_b_table||' B'||
12652             ', FEM_DIMENSION_GRPS_B D'||
12653             ', FEM_VALUE_SETS_B V'||
12654             ', '||p_target_b_table||' TB'||
12655             ' WHERE B.status'||p_exec_mode_clause||
12656             ' AND   {{data_slice}} '||
12657             ' AND B.value_set_display_code = V.value_set_display_code'||
12658             ' AND B.dimension_group_display_code = D.dimension_group_display_code (+)'||
12659             ' AND D.dimension_id (+) = '||p_dimension_id||
12660             ' AND B.'||p_member_t_dc_col||' = TB.'||p_member_dc_col||
12661             ' AND TB.value_set_id = V.value_set_id';
12662 
12663              /*****************************************************
12664              3/16/05 commented out because doing join now to target b table
12665             ' AND EXISTS (SELECT 0'||
12666             ' FROM '||p_target_b_table||
12667             ' WHERE '||p_member_dc_col||' = B.'||p_member_t_dc_col||
12668             ' AND value_set_id = (SELECT value_set_id FROM fem_value_sets_b'||
12669             ' WHERE value_set_display_code = B.value_set_display_code))';
12670             ********************************************************/
12671 
12672    ELSIF (p_load_type = 'DIMENSION_MEMBER') AND
12673       (p_value_set_required_flag = 'Y') AND
12674       (p_hier_dimension_flag = 'N') THEN
12675          x_remain_mbr_select_stmt :=
12676             'SELECT B.rowid'||
12677             ', to_char(TB.'||p_member_col||')'||
12678             ', B.'||p_member_t_dc_col||
12679             ', B.value_set_display_code'||
12680             ', V.value_set_id'||
12681             ', null'||
12682             ', null'||
12683             ',null'||
12684             ',null'||
12685             ',null'||
12686             ', ''LOAD'' '||
12687             ' FROM '||p_source_b_table||' B'||
12688             ', FEM_VALUE_SETS_B V'||
12689             ', '||p_target_b_table||' TB'||
12690             ' WHERE B.status'||p_exec_mode_clause||
12691             ' AND   {{data_slice}} '||
12692             ' AND B.value_set_display_code = V.value_set_display_code'||
12693             ' AND B.'||p_member_t_dc_col||' = TB.'||p_member_dc_col||
12694             ' AND TB.value_set_id = V.value_set_id';
12695 
12696              /*****************************************************
12697              3/16/05 commented out because doing join now to target b table
12698             ' AND EXISTS (SELECT 0'||
12699             ' FROM '||p_target_b_table||
12700             ' WHERE '||p_member_dc_col||' = B.'||p_member_t_dc_col||
12701             ' AND value_set_id = (SELECT value_set_id FROM fem_value_sets_b'||
12702             ' WHERE value_set_display_code = B.value_set_display_code))';
12703             ********************************************************/
12704 
12705    ELSIF (p_load_type = 'DIMENSION_MEMBER')
12706          AND (p_dimension_varchar_label = 'CAL_PERIOD') THEN
12707 
12708          -- keeping the where exists clause rather than straight join due to
12709          -- the fact that source_b table doesn't have a single display_code col
12710          -- for CAL_PERIOD
12711          x_remain_mbr_select_stmt :=
12712             'SELECT B.rowid'||
12713             ',LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
12714             'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
12715             'LPAD(to_char(C.calendar_id),5,''0'')||'||
12716             'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
12717             ',LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
12718             'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
12719             'LPAD(to_char(C.calendar_id),5,''0'')||'||
12720             'LPAD(to_char(D.time_dimension_group_key),5,''0'') '||
12721             ', null'||
12722             ', null'||
12723             ', null'||
12724             ', null'||
12725             ',null'||
12726             ',null'||
12727             ',null'||
12728             ', ''LOAD'' '||
12729             ' FROM '||p_source_b_table||' B'||
12730             ', FEM_CALENDARS_B C'||
12731             ', FEM_DIMENSION_GRPS_B D'||
12732             ' WHERE B.calendar_display_code = C.calendar_display_code'||
12733             ' AND B.dimension_group_display_code = D.dimension_group_display_code'||
12734             ' AND EXISTS (SELECT 0'||
12735             ' FROM '||p_target_b_table||
12736             ' WHERE to_char('||p_member_dc_col||') = '||
12737             'LPAD(to_char(to_number(to_char(B.cal_period_end_date,''j''))),7,''0'')||'||
12738             'LPAD(TO_CHAR(B.cal_period_number),15,''0'')||'||
12739             'LPAD(to_char(C.calendar_id),5,''0'')||'||
12740             'LPAD(to_char(D.time_dimension_group_key),5,''0'')) '||
12741             ' AND B.status'||p_exec_mode_clause||
12742             ' AND   {{data_slice}} ';
12743    ELSIF (p_load_type = 'DIMENSION_MEMBER') AND
12744       (p_value_set_required_flag = 'N') AND
12745       (p_dimension_varchar_label NOT IN  ('CAL_PERIOD')) THEN
12746          x_remain_mbr_select_stmt :=
12747             'SELECT B.rowid'||
12748             ', to_char(TB.'||p_member_col||')'||
12749             ', B.'||p_member_t_dc_col||
12750             ', null'||
12751             ', null'||
12752             ', null'||
12753             ', null'||
12754             ',null'||
12755             ',null'||
12756             ',null'||
12757             ', ''LOAD'' '||
12758             ' FROM '||p_source_b_table||' B'||
12759             ', '||p_target_b_table||' TB'||
12760             ' WHERE B.status'||p_exec_mode_clause||
12761             v_dim_label_where_cond||
12762             ' AND B.'||p_member_t_dc_col||' = TB.'||p_member_dc_col||
12763             ' AND   {{data_slice}} ';
12764 
12765              /*****************************************************
12766              3/16/05 commented out because doing join now to target b table
12767             ' WHERE EXISTS (SELECT 0'||
12768             ' FROM '||p_target_b_table||
12769             ' WHERE '||p_member_dc_col||' = '||
12770             ' B.'||p_member_t_dc_col||')'||
12771             ******************************************************/
12772 
12773    ELSIF (p_load_type = 'DIMENSION_GROUP') THEN
12774          x_remain_mbr_select_stmt :=
12775             'SELECT B.rowid'||
12776             ', to_char(TB.'||p_member_col||')'||
12777             ', B.'||p_member_t_dc_col||
12778             ', null'||
12779             ', null'||
12780             ', null'||
12781             ', null'||
12782             ', null'||
12783             ',B.dimension_group_seq'||
12784             ',B.time_group_type_code'||
12785             ', ''LOAD'' '||
12786             ' FROM '||p_source_b_table||' B'||
12787             ', '||p_target_b_table||' TB'||
12788             ', fem_dimensions_b D'||
12789             ' WHERE B.status'||p_exec_mode_clause||
12790             ' AND B.dimension_varchar_label = D.dimension_varchar_label'||
12791             ' AND D.dimension_id = TB.dimension_id'||
12792             ' AND TB.dimension_group_display_code = B.dimension_group_display_code'||
12793             ' AND B.dimension_varchar_label = '''||p_dimension_varchar_label||'''';
12794 
12795              /*****************************************************
12796              3/16/05 commented out because doing join now to target b table
12797             ' WHERE EXISTS (SELECT 0'||
12798             ' FROM '||p_target_b_table||
12799             ' WHERE '||p_member_dc_col||' = '||
12800             ' B.'||p_member_t_dc_col||')'||
12801             *******************************************************/
12802 
12803    END IF;
12804 
12805       FEM_ENGINES_PKG.TECH_MESSAGE
12806        (c_log_level_2,c_block||'.'||
12807         'build_remain_mbr_select_stmt',
12808         'End');
12809 
12810    END build_remain_mbr_select_stmt;
12811 
12812 
12813 /*===========================================================================+
12814  | PROCEDURE
12815  |              BUILD_DIMGRP_UPDATE_STMT
12816  |
12817  | DESCRIPTION
12818  |                 Builds the dynamic UPDATE statement for updating
12819  |                 the DIMENSION_GROUP_ID column on the _B member table
12820  |
12821  | SCOPE - PRIVATE
12822  |
12823  | NOTES
12824  |    This procedure does not use the table handlers for performing the update
12825  |
12826  |
12827  |
12828  | MODIFICATION HISTORY
12829  |    Rob Flippo   06-NOV-03  Created
12830  |    Rob Flippo   16-MAR-05  Bug#4244082 requires this procedure
12831  |    Rob Flippo   04-AUG-06  Bug 5060746 Change literals to bind variables wherever possible
12832  +===========================================================================*/
12833 
12834 
12835    procedure build_dimgrp_update_stmt (p_target_b_table IN VARCHAR2
12836                                       ,p_value_set_required_flag IN VARCHAR2
12837                                       ,p_member_dc_col IN VARCHAR2
12838                                       ,x_update_stmt OUT NOCOPY VARCHAR2)
12839 
12840    IS
12841 
12842 
12843    BEGIN
12844       FEM_ENGINES_PKG.TECH_MESSAGE
12845        (c_log_level_2,c_block||'.'||
12846         'build_dimgrp_update_stmt',
12847         'Begin');
12848 
12849 
12850       IF p_value_set_required_flag = 'Y' THEN
12851         x_update_stmt :=
12852         'UPDATE '||p_target_b_table||
12853            ' SET dimension_group_id = :b_dimension_group_id'||
12854            ',last_update_date = sysdate '||
12855            ',last_updated_by = :b_apps_user_id'||
12856            ',last_update_login = :b_login_id'||
12857            ' WHERE '||p_member_dc_col||' = :b_member_dc'||
12858            ' AND value_set_id = :b_value_set_id'||
12859            ' AND :b_status = ''LOAD''';
12860 
12861       ELSE
12862         x_update_stmt :=
12863         'UPDATE '||p_target_b_table||
12864            ' SET dimension_group_id = :b_dimension_group_id'||
12865            ',last_update_date = sysdate '||
12866            ',last_updated_by = :b_apps_user_id'||
12867            ',last_update_login = :b_login_id'||
12868            ' WHERE '||p_member_dc_col||' = :b_member_dc'||
12869            ' AND :b_status = ''LOAD''';
12870 
12871       END IF;
12872       FEM_ENGINES_PKG.TECH_MESSAGE
12873        (c_log_level_2,c_block||'.'||
12874         'build_dimgrp_update_stmt',
12875         'End');
12876 
12877    END build_dimgrp_update_stmt;
12878 
12879 
12880 
12881 /*===========================================================================+
12882  | PROCEDURE
12883  |              BUILD_ATTR_UPDATE_STMT
12884  |
12885  | DESCRIPTION
12886  |                 Builds the dynamic UPDATE statement for updating
12887  |                 existing ATTR rows using the interface source _ATTR_T rows
12888  |
12889  | SCOPE - PRIVATE
12890  |
12891  | NOTES
12892  |
12893  |
12894  |
12895  |
12896  | MODIFICATION HISTORY
12897  |    Rob Flippo   13-NOV-03  Created
12898  |    Rob Flippo   04-JAN-05  Added "use_interim_table_flag" condition
12899  |                            so that the update only happens for rows that are
12900  |                            not going to the FEM_CALP_ATTR_INTERIM_T table for
12901  |                            additional processing
12902  |   Rob Flippo   11-AUG-05   Bug#4547868 performance issue - fix update
12903  |                            so no subquery against base table
12904  | Rob Flippo  04-AUG-06  Bug 5060746 Change literals to bind variables wherever possible
12905  +===========================================================================*/
12906 
12907 
12908    procedure build_attr_update_stmt (p_target_attr_table IN VARCHAR2
12909                                     ,p_target_b_table IN VARCHAR2
12910                                     ,p_member_dc_col IN VARCHAR2
12911                                     ,p_member_col IN VARCHAR2
12912                                     ,p_value_set_required_flag IN VARCHAR2
12913                                     ,x_update_stmt OUT NOCOPY VARCHAR2)
12914 
12915    IS
12916 
12917 
12918    BEGIN
12919       FEM_ENGINES_PKG.TECH_MESSAGE
12920        (c_log_level_2,c_block||'.'||
12921         'build_attr_update_stmt',
12922         'Begin');
12923 
12924    IF p_value_set_required_flag = 'Y' THEN
12925         x_update_stmt :=
12926 
12927         'UPDATE '||p_target_attr_table||' A'||
12928            ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12929            ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12930            ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12931            ' ,number_assign_value = :b_number_assign_value'||
12932            ' ,varchar_assign_value = :b_varchar_assign_value'||
12933            ' ,date_assign_value = :b_date_assign_value'||
12934            ',last_update_date = sysdate '||
12935            ',last_updated_by = :b_apps_user_id'||
12936            ',last_update_login = :b_login_id'||
12937            ' WHERE A.'||p_member_col||' = :b_member_id'||
12938            ' AND A.value_set_id = :value_set_id'||
12939            ' AND A.attribute_id = :b_attribute_id'||
12940            ' AND A.version_id = :b_version_id'||
12941            ' AND :b_allow_mult_assign_flag = ''N'''||
12942            ' AND :b_attr_exists_count > 0'||
12943            ' AND :b_status = ''LOAD''';
12944 
12945 
12946 /*************************8
12947 commented out per bug#4547868
12948         'UPDATE '||p_target_attr_table||' A'||
12949            ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12950            ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12951            ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12952            ' ,number_assign_value = :b_number_assign_value'||
12953            ' ,varchar_assign_value = :b_varchar_assign_value'||
12954            ' ,date_assign_value = :b_date_assign_value'||
12955            ',last_update_date = sysdate '||
12956            ',last_updated_by = '||gv_apps_user_id||
12957            ',last_update_login = '||gv_login_id||
12958            ' WHERE A.'||p_member_col||' = (SELECT '||p_member_col||
12959            ' FROM '||p_target_b_table||' B'||
12960            ', fem_value_sets_b V'||
12961            ' WHERE B.'||p_member_dc_col||' = :b_member_dc'||
12962            ' AND B.value_set_id = V.value_set_id'||
12963            ' AND V.value_set_display_code = :value_set_dc)'||
12964            ' AND A.attribute_id = :b_attribute_id'||
12965            ' AND A.version_id = :b_version_id'||
12966            ' AND :b_allow_mult_assign_flag = ''N'''||
12967            ' AND :b_attr_exists_count > 0'||
12968            ' AND :b_status = ''LOAD''';
12969 ****************************************************/
12970    ELSE
12971         x_update_stmt :=
12972         'UPDATE '||p_target_attr_table||' A'||
12973            ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12974            ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12975            ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12976            ' ,number_assign_value = :b_number_assign_value'||
12977            ' ,varchar_assign_value = :b_varchar_assign_value'||
12978            ' ,date_assign_value = :b_date_assign_value'||
12979            ',last_update_date = sysdate '||
12980            ',last_updated_by = :b_apps_user_id'||
12981            ',last_update_login = :b_login_id'||
12982            ' WHERE A.'||p_member_col||' = :b_member_id'||
12983            ' AND A.attribute_id = :b_attribute_id'||
12984            ' AND A.version_id = :b_version_id'||
12985            ' AND :b_allow_mult_assig_flag = ''N'''||
12986            ' AND :b_attr_exists_count > 0'||
12987            ' AND :b_status = ''LOAD'''||
12988            ' AND :b_use_interim_table_flag = ''N''';
12989 /***********************************
12990 commented out per bug#4547868
12991         'UPDATE '||p_target_attr_table||' A'||
12992            ' SET dim_attribute_numeric_member = :b_dim_attribute_numeric_member'||
12993            ' ,dim_attribute_value_set_id = :b_dim_attribute_value_set_id'||
12994            ' ,dim_attribute_varchar_member = :b_dim_attribute_varchar_member'||
12995            ' ,number_assign_value = :b_number_assign_value'||
12996            ' ,varchar_assign_value = :b_varchar_assign_value'||
12997            ' ,date_assign_value = :b_date_assign_value'||
12998            ',last_update_date = sysdate '||
12999            ',last_updated_by = '||gv_apps_user_id||
13000            ',last_update_login = '||gv_login_id||
13001            ' WHERE A.'||p_member_col||' = (SELECT '||p_member_col||
13002            ' FROM '||p_target_b_table||' B'||
13003            ' WHERE to_char(B.'||p_member_dc_col||') = :b_member_dc)'||
13004            ' AND A.attribute_id = :b_attribute_id'||
13005            ' AND A.version_id = :b_version_id'||
13006            ' AND :b_allow_mult_assig_flag = ''N'''||
13007            ' AND :b_attr_exists_count > 0'||
13008            ' AND :b_status = ''LOAD'''||
13009            ' AND :b_use_interim_table_flag = ''N''';
13010 *******************************************/
13011 
13012 
13013    END IF; -- p_value_set_required_flag
13014       FEM_ENGINES_PKG.TECH_MESSAGE
13015        (c_log_level_2,c_block||'.'||
13016         'build_attr_update_stmt',
13017         'End');
13018 
13019    END build_attr_update_stmt;
13020 
13021 /*===========================================================================+
13022  | PROCEDURE
13023  |              Calp_Date_Overlap_Check
13024  |
13025  | DESCRIPTION
13026  |                 Called after New_Members and ATTR_ASSIGN_UPDATE
13027  |                 procedures are complete
13028  |                 Identifies Date Overlap records for CAL_PERIOD loads
13029  |                 This procedure does not employ MP - it is single threaded
13030  |                 because all cal_periods to be loaded must be evaluated
13031  |                 for each member to be loaded
13032  |
13033  | SCOPE - PRIVATE
13034  |
13035  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
13036  |
13037  | ARGUMENTS  : IN:
13038  |
13039  |
13040  |              OUT:
13041  |
13042  |
13043  |
13044  |              IN/ OUT:
13045  |
13046  | RETURNS    : NONE
13047  |
13048  | NOTES
13049  |   If operation_mode = 'NEW_MEMBERS', then Bulk Collect CAL_PERIOD_IDs
13050  |      to check from FEM_CALP_INTERIM_T
13051  |   Else operation_mode = 'ATTR_UPDATE', then Bulk Collect CAL_PERIOD_IDs
13052  |      to check from join of FEM_CALP_ATTR_INTERIM_T and FEM_CALP_INTERIM_T
13053  |      where the attribute = CAL_PERIOD_START_DATE
13054  |      Note that FEM_CALP_INTERIM_T is always populated, even for Attr Update,
13055  |      which is why we can use this table to perform the overlap checks
13056  |
13057  |   Once the list of CAL_PERIOD_IDs to check is populated query the
13058  |     FEM_CALP_INTERIM_T table for each one to see if any date overlaps exist
13059  |     This table will be populated for all CAL_PERIODs in the load, whether
13060  |     for a New_Member phase or an ATTR_ASSIGN_UPDATE phase
13061  |
13062  |   For NEW_MEMBER phase, if an overlap is found, update the OVERLAP_FLAG = 'Y'
13063  |   in FEM_CALP_INTERIM_T for that cal_period_id.
13064  |   -- also update the STATUS in the _B_T, _TL_T and ATTR_T tables for CAL_PERIOD
13065  |      for each member as follows:
13066  |      ATTR_T table: CALENDAR_PERIOD_START_DATE attr row =  "OVERLAP_START_DATE_IN_LOAD"
13067  |      ATTR_T table: all other attr rows = "INVALID_MEMBER"
13068  |      TL_T table: "INVALID_MEMBER"
13069  |      B_T table:  "INVALID_REQUIRED_ATTRIBUTE"
13070  |
13071  |   For ATTR_UPDATE phase, if an overlap is found, update the OVERLAP_FLAG = 'Y'
13072  |   in FEM_CALP_ATTR_INTERIM_T for the "START_DATE" attribute rows
13073  |   -- also update the STATUS in the _ATTR_T table as follows:
13074  |      CALENDAR_PERIOD_START_DATE attr row = "OVERLAP_START_DATE_IN_LOAD"
13075  |
13076  |   Note:  We perform the STATUS updates on the interface tables in this procedure
13077  |          since we already have the bad rows in our array.  Rather than require
13078  |          a requery of the Interim tables in another procedure, it's more performant just
13079  |          to perform the status update now, even though it is single threaded
13080  |
13081  | MODIFICATION HISTORY
13082  |    Rob Flippo   03-JAN-05  Created
13083  |
13084  +===========================================================================*/
13085 
13086 procedure calp_date_overlap_check(x_rows_rejected OUT NOCOPY NUMBER
13087                                  ,p_operation_mode IN VARCHAR2
13088 )
13089 IS
13090 
13091    t_cal_period_id      number_type;
13092    t_calendar_id        number_type;
13093    t_dimension_group_id number_type;
13094    t_start_date         date_type;
13095    t_end_date           date_type;
13096    t_rowid              rowid_type;
13097    t_overlap_flag       flag_type;
13098    t_calendar_dc        varchar2_std_type;
13099    t_dimension_group_dc varchar2_std_type;
13100    t_cal_period_number  number_type;
13101 
13102 
13103    v_bulk_rows_rejected NUMBER;
13104    v_rows_rejected NUMBER;
13105    v_mbr_last_row NUMBER;
13106    v_count        NUMBER;
13107    v_fetch_limit  NUMBER;
13108    v_interim_table_name   VARCHAR2(30);  -- this holds the interim table_name for sql operations
13109 
13110    x_select_stmt                VARCHAR2(4000);
13111    x_date_check_stmt            VARCHAR2(4000);
13112    x_update_stmt                VARCHAR2(4000);
13113    x_update_mbr_status_stmt     VARCHAR2(4000);
13114    x_update_tl_status_stmt      VARCHAR2(4000);
13115    x_update_attr_status_stmt    VARCHAR2(4000);
13116    x_update_attrlab_status_stmt VARCHAR2(4000);
13117 
13118    -- Declare Table names for status updates
13119    v_source_b_table    VARCHAR2(4000);
13120    v_source_tl_table   VARCHAR2(4000);
13121    v_source_attr_table VARCHAR2(4000);
13122 
13123 ---------------------
13124 -- Declare cursors --
13125 ---------------------
13126    cv_get_rows           cv_curs;
13127 
13128 BEGIN
13129 
13130    FEM_ENGINES_PKG.TECH_MESSAGE
13131     (c_log_level_2,c_block||'.'||'calp_date_overlap_check','Begin Date Overlap Check for CAL_PERIOD load');
13132 
13133    -- initialize the fetch limit to 10,000 rows
13134    -- since calp_date_overlap_check is not an MP procedure, we can't get
13135    -- the fetch limit from the MP parameters.  So we set it manually
13136    -- here
13137    v_fetch_limit := 10000;
13138 
13139    -- initialize the table name variables for CAL_PERIOD interface table names
13140    v_source_b_table := 'FEM_CAL_PERIODS_B_T';
13141    v_source_tl_table := 'FEM_CAL_PERIODS_TL_T';
13142    v_source_attr_table := 'FEM_CAL_PERIODS_ATTR_T';
13143 
13144    -- initialize the rejected row count
13145    v_rows_rejected := 0;
13146 
13147    build_calp_status_update_stmt ('ATTRIBUTE_LABEL'
13148                                  ,v_source_attr_table
13149                                  ,x_update_attrlab_status_stmt);
13150 
13151 
13152    IF p_operation_mode = 'NEW_MEMBERS' THEN
13153       v_interim_table_name := 'FEM_CALP_INTERIM_T';
13154 
13155       x_select_stmt := 'SELECT rowid'||
13156                        ', cal_period_id'||
13157                        ', calendar_id'||
13158                        ', dimension_group_id'||
13159                        ', cal_period_end_date'||
13160                        ', cal_period_start_date'||
13161                        ', overlap_flag'||
13162                        ', cal_period_number'||
13163                        ', calendar_display_code'||
13164                        ', dimension_group_display_code'||
13165                        ' FROM fem_calp_interim_t'||
13166                        ' WHERE adjustment_period_flag = ''N''';
13167 
13168       -- When processing Members, we have to perform status
13169       -- updates on the other interface tables, plus the other
13170       -- rows in the ATTR_T table
13171       build_calp_status_update_stmt ('NO_LABEL'
13172                                     ,v_source_b_table
13173                                     ,x_update_mbr_status_stmt);
13174 
13175       build_calp_status_update_stmt ('NO_LABEL'
13176                                     ,v_source_tl_table
13177                                     ,x_update_tl_status_stmt);
13178 
13179       build_calp_status_update_stmt ('NO_LABEL'
13180                                     ,v_source_attr_table
13181                                     ,x_update_attr_status_stmt);
13182 
13183 
13184    ELSE
13185       v_interim_table_name := 'FEM_CALP_ATTR_INTERIM_T';
13186       x_select_stmt := 'SELECT AI.rowid'||
13187                        ', AI.cal_period_id'||
13188                        ', I.calendar_id'||
13189                        ', I.dimension_group_id'||
13190                        ', I.cal_period_end_date'||
13191                        ', I.cal_period_start_date'||
13192                        ', I.overlap_flag'||
13193                        ', I.cal_period_number'||
13194                        ', I.calendar_display_code'||
13195                        ', I.dimension_group_display_code'||
13196                        ' FROM fem_calp_attr_interim_t AI'||
13197                        ',fem_calp_interim_t I'||
13198                        ',fem_dim_attributes_b A'||
13199                        ' WHERE AI.cal_period_id = I.cal_period_id'||
13200                        ' AND AI.attribute_id = A.attribute_id'||
13201                        ' AND A.attribute_varchar_label = ''CAL_PERIOD_START_DATE'''||
13202                        ' AND I.adjustment_period_flag = ''N''';
13203 
13204 
13205    END IF;
13206    x_date_check_stmt := 'SELECT count(*) FROM fem_calp_interim_t'||
13207                         ' WHERE cal_period_end_date >= :b_start_date'||
13208                         ' AND cal_period_start_date <= :b_end_date'||
13209                         ' AND calendar_id = :b_calendar_id'||
13210                         ' AND dimension_group_id = :b_dimension_group_id'||
13211                         ' AND adjustment_period_flag = ''N'''||
13212                         ' AND cal_period_id <> :b_cal_period_id';
13213 
13214    x_update_stmt := 'UPDATE '||v_interim_table_name||
13215                             ' SET overlap_flag = ''Y'''||
13216                             ' WHERE rowid = :b_rowid'||
13217                             ' AND :b_overlap_flag = ''Y''';
13218 
13219    FEM_ENGINES_PKG.TECH_MESSAGE
13220     (c_log_level_1,c_block||'.'||'x_select_stmt',x_select_stmt);
13221 
13222    OPEN cv_get_rows FOR x_select_stmt;
13223 
13224    LOOP
13225 
13226       FETCH cv_get_rows BULK COLLECT INTO
13227              t_rowid
13228             ,t_cal_period_id
13229             ,t_calendar_id
13230             ,t_dimension_group_id
13231             ,t_end_date
13232             ,t_start_date
13233             ,t_overlap_flag
13234             ,t_cal_period_number
13235             ,t_calendar_dc
13236             ,t_dimension_group_dc
13237       LIMIT v_fetch_limit;
13238       ----------------------------------------------
13239       -- EXIT Fetch LOOP If No Rows are Retrieved --
13240       ----------------------------------------------
13241       v_mbr_last_row := t_cal_period_id.LAST;
13242 
13243       IF (v_mbr_last_row IS NULL)
13244       THEN
13245          EXIT;
13246       END IF;
13247 
13248       --------------------------------------------------------------------------
13249       --  Begin Looking for Overlaps
13250       --  process each calendar period id in the array row by row
13251       --  when an overlap condition found, mark the selected cal_period_id
13252       --  in the interim table.  Note that we don't attempt to mark any of the
13253       --  cal_period_ids that caused the overlap, because to do so would be
13254       --  expensive in terms of code and even performance because it would require
13255       --  an additional I/O since the overlaps might not exist within the array
13256       ------------------------------------------------------------------------
13257    FEM_ENGINES_PKG.TECH_MESSAGE
13258     (c_log_level_1,c_block||'.'||'calp_date_overlap_check','Begin looking for overlaps');
13259 
13260       FOR i IN 1..v_mbr_last_row
13261       LOOP
13262          EXECUTE IMMEDIATE x_date_check_stmt
13263          INTO v_count
13264          USING t_start_date(i)
13265               ,t_end_date(i)
13266               ,t_calendar_id(i)
13267               ,t_dimension_group_id(i)
13268               ,t_cal_period_id(i);
13269 
13270          IF v_count > 0 THEN
13271             t_overlap_flag(i) := 'Y';
13272          END IF;
13273 
13274       END LOOP; -- Begin Looking for Overlaps
13275       ------------------------------------------------------------
13276       -- Update the Interim table Overlap Flag for all bad records
13277       -- this statement either updates FEM_CALP_INTERIM_T or
13278       -- FEM_CALP_ATTR_INTERIM_T, depending on the Operation Mode
13279       ------------------------------------------------------------
13280    FEM_ENGINES_PKG.TECH_MESSAGE
13281     (c_log_level_1,c_block||'.'||'calp_date_overlap_check','Update interim table');
13282 
13283       FORALL i IN 1..v_mbr_last_row
13284          EXECUTE IMMEDIATE x_update_stmt
13285          USING t_rowid(i)
13286               ,t_overlap_flag(i);
13287 
13288       -- For mode = NEW_MEMBERS, we update the status in the
13289       -- following interface tables:
13290       -- FEM_CAL_PERIODS_B_T
13291       -- FEM_CAL_PERIODS_TL_T
13292       -- FEM_CAL_PERIODS_ATTR_T (for the START_DATE attribute)
13293       -- FEM_CAL_PERIODS_ATTR_T (for any other attr rows of that member)
13294       --
13295       -- Otherwise (Attr Assign Update mode), we only update the
13296       -- following interface table:
13297       -- FEM_CAL_PERIODS_ATTR_T (for the START_DATE attribute)
13298    FEM_ENGINES_PKG.TECH_MESSAGE
13299     (c_log_level_1,c_block||'.'||'calp_date_overlap_check','Update status of bad records');
13300 
13301       IF p_operation_mode = 'NEW_MEMBERS' THEN
13302          ----------------------------------------------------------
13303          -- Update Status of _B_T table for failed members
13304          ----------------------------------------------------------
13305          FORALL i IN 1..v_mbr_last_row
13306             EXECUTE IMMEDIATE x_update_mbr_status_stmt
13307             USING 'INVALID_REQUIRED_ATTRIBUTE'
13308                  ,t_cal_period_number(i)
13309                  ,t_end_date(i)
13310                  ,t_calendar_dc(i)
13311                  ,t_dimension_group_dc(i)
13312                  ,t_overlap_flag(i);
13313 
13314             v_bulk_rows_rejected := SQL%ROWCOUNT;
13315             v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
13316 
13317          ----------------------------------------------------------
13318          -- Update Status of _TL_T table for failed members
13319          ----------------------------------------------------------
13320          FORALL i IN 1..v_mbr_last_row
13321             EXECUTE IMMEDIATE x_update_tl_status_stmt
13322             USING 'INVALID_MEMBER'
13323                  ,t_cal_period_number(i)
13324                  ,t_end_date(i)
13325                  ,t_calendar_dc(i)
13326                  ,t_dimension_group_dc(i)
13327                  ,t_overlap_flag(i);
13328 
13329             v_bulk_rows_rejected := SQL%ROWCOUNT;
13330             v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
13331          ----------------------------------------------------------
13332          -- Update Status of other (non START_DATE) attr assignments for the member
13333          -- in the _ATTR_T table
13334          ----------------------------------------------------------
13335          FORALL i IN 1..v_mbr_last_row
13336             EXECUTE IMMEDIATE x_update_attr_status_stmt
13337             USING 'INVALID_MEMBER'
13338                  ,t_cal_period_number(i)
13339                  ,t_end_date(i)
13340                  ,t_calendar_dc(i)
13341                  ,t_dimension_group_dc(i)
13342                  ,t_overlap_flag(i);
13343 
13344             v_bulk_rows_rejected := SQL%ROWCOUNT;
13345             v_rows_rejected := v_rows_rejected + v_bulk_rows_rejected;
13346 
13347       END IF;
13348 
13349       ----------------------------------------------------------
13350       -- Update Status of Attr Collection for failed START_DATE records
13351       -- this update applies to both NEW_MEMBERS and ATTR_ASSIGN_UPDATE
13352       -- modes
13353       -- We do this last since we are overwriting the previous
13354       -- status update for the single record where attribute_varchar_label =
13355       -- CAL_PERIOD_START_DATE
13356       ----------------------------------------------------------
13357       FORALL i IN 1..v_mbr_last_row
13358          EXECUTE IMMEDIATE x_update_attrlab_status_stmt
13359          USING 'OVERLAP_START_DATE_IN_LOAD'
13360               ,t_cal_period_number(i)
13361               ,t_end_date(i)
13362               ,t_calendar_dc(i)
13363               ,t_dimension_group_dc(i)
13364               ,t_overlap_flag(i);
13365       -- NOTE:  We do not count the error rows for this particular
13366       --        status update because we have already counted the
13367       --        row in the previous ATTR_T update (i.e., we don't want
13368       --        to double-count)
13369 
13370 
13371       --------------------------------------------
13372       -- Delete CAL_PERIOD Collection for Next Bulk Fetch --
13373       --------------------------------------------
13374       t_rowid.DELETE;
13375       t_cal_period_id.DELETE;
13376       t_calendar_id.DELETE;
13377       t_dimension_group_id.DELETE;
13378       t_start_date.DELETE;
13379       t_end_date.DELETE;
13380       t_overlap_flag.DELETE;
13381       t_cal_period_number.DELETE;
13382       t_calendar_dc.DELETE;
13383       t_dimension_group_dc.DELETE;
13384 
13385     --COMMIT;
13386    END LOOP; -- main bulk collect
13387    CLOSE cv_get_rows;
13388    x_rows_rejected := v_rows_rejected;
13389 
13390    FEM_ENGINES_PKG.TECH_MESSAGE
13391     (c_log_level_2,c_block||'.'||'calp_date_overlap_check','End Date Overlap Check for CAL_PERIOD load');
13392 
13393 
13394 END calp_date_overlap_check;
13395 
13396 
13397 ----------------------------------------------------------------------
13398 -- Post Dimension Status (called by Main)
13399 --
13400 --   This procedure puts an entry into FEM_DIM_LOAD_STATUS
13401 --   for each source system code in the load
13402 --
13403 --   If # of records in source attr table =0, the entry is 'INCOMPLETE'
13404 --   Otherwise, it is 'INCOMPLETE'
13405 ------------------------------------------------------------------------
13406    PROCEDURE Post_dim_status (p_dimension_id   IN  VARCHAR2
13407                              ,p_source_system_dc IN VARCHAR2
13408                              ,p_source_attr_table IN VARCHAR2)
13409    IS
13410       v_src_sys_select_stmt VARCHAR2(4000);
13411       v_src_sys_status VARCHAR2(30);
13412       v_status_count NUMBER;
13413       v_attr_count NUMBER;
13414       v_dim_load_status VARCHAR2(30);
13415       v_source_system_code NUMBER;
13416       v_sql_stmt VARCHAR2(4000);
13417       c_proc_name VARCHAR2(30) := 'Post_dim_status';
13418 
13419       e_invalid_src_sys EXCEPTION;
13420 
13421    BEGIN
13422       -- Get the source_system_code for the input source_system_dc
13423       BEGIN
13424          FEM_ENGINES_PKG.TECH_MESSAGE
13425           (c_log_level_3,c_block||'.'||c_proc_name,'Begin');
13426 
13427       SELECT source_system_code
13428       INTO v_source_system_code
13429       FROM fem_source_systems_b
13430       WHERE source_system_display_code = p_source_system_dc;
13431 
13432       EXCEPTION
13433          WHEN no_data_found THEN
13434             RAISE e_invalid_src_sys;
13435       END;
13436 
13437       -- Is there an existing status row in FEM_DIM_LOAD_STATUS
13438       -- for the Source System Code and Dimension combination?
13439       SELECT count(*)
13440       INTO v_status_count
13441       FROM fem_dim_load_status
13442       WHERE dimension_id = p_dimension_id
13443       AND source_system_code = v_source_system_code;
13444 
13445       -- Check the record count in the source ATTR_T table
13446       -- This is the only table we check for error rows, since it is the
13447       -- only table that has a source system context
13448       v_src_sys_select_stmt := 'SELECT count(*) FROM '||p_source_attr_table||
13449                                ' WHERE attribute_varchar_label = ''SOURCE_SYSTEM_CODE'''||
13450                                ' AND attribute_assign_value = '''||p_source_system_dc||''''||
13451                                ' AND rownum=1';
13452 
13453       EXECUTE IMMEDIATE v_src_sys_select_stmt
13454       INTO v_attr_count;
13455 
13456       IF v_attr_count = 0 THEN
13457          v_dim_load_status := 'COMPLETE';
13458       ELSE v_dim_load_status := 'INCOMPLETE';
13459       END IF;
13460 
13461       IF v_status_count = 0 THEN
13462          INSERT INTO fem_dim_load_status (DIMENSION_ID
13463                                          ,SOURCE_SYSTEM_CODE
13464                                          ,LOAD_STATUS
13465                                          ,REPROCESS_ERRORS_FLAG
13466                                          ,CREATION_DATE
13467                                          ,CREATED_BY
13468                                          ,LAST_UPDATED_BY
13469                                          ,LAST_UPDATE_DATE
13470                                          ,LAST_UPDATE_LOGIN
13471                                          ,OBJECT_VERSION_NUMBER)
13472          SELECT p_dimension_id
13473                ,v_source_system_code
13474                ,v_dim_load_status
13475                ,'N'
13476                ,sysdate
13477                ,gv_apps_user_id
13478                ,gv_apps_user_id
13479                ,sysdate
13480                ,gv_login_id
13481                ,1
13482          FROM dual;
13483       ELSE
13484          UPDATE fem_dim_load_status
13485          SET load_status = v_dim_load_status,
13486          last_updated_by = gv_apps_user_id,
13487          last_update_date = sysdate,
13488          last_update_login = gv_login_id
13489          WHERE dimension_id = p_dimension_id
13490          AND source_system_code = v_source_system_code;
13491       END IF;
13492 
13493       FEM_ENGINES_PKG.TECH_MESSAGE
13494        (c_log_level_3,c_block||'.'||c_proc_name,'End');
13495 
13496    EXCEPTION
13497       WHEN e_invalid_src_sys THEN
13498          null;
13499 
13500    END Post_dim_status;
13501 
13502     --------------------------------------------------------------------------
13503     -- This Procedure is to intialize the TABLE TYPE variable which stores
13504     -- the flex field information of the Activity and Cost Objects
13505 
13506 
13507     -- The TABLE TYPE variable holds the following values for each
13508     -- component Dimension
13509 
13510     --   ATTRIBUTE                      VALUE
13511 
13512 	--   dimension_varchar_label         Component Dimension varchar label
13513     --   dimension_id                    -999
13514     --   member_col                      null
13515     --   member_display_code_col         null
13516     --   member_b_table_name             null
13517     --   value_set_required_flag         null
13518     --   member_sql                      null
13519 
13520 
13521     -- PARAMETER Information
13522 
13523     -- p_dimension_varchar_label     The Varchar Label of Composite Dimension
13524 
13525     -- MODIFICATION HISTORY
13526     --  sshanmug     11-May-05       Created.
13527     ----------------------------------------------------------------------------
13528 
13529  /* PROCEDURE Metadata_Initialize(p_dimension_varchar_label IN VARCHAR2)
13530 
13531     IS
13532 
13533     c_proc_name CONSTANT VARCHAR2(20) := 'Metadata_Initialize';
13534     i NUMBER; -- counting variable for no:of segments of Flex Field
13535 
13536     BEGIN
13537 
13538      fem_engines_pkg.tech_message (
13539              p_severity  => c_log_level_1
13540 	         ,p_module   => c_block||'.'||c_proc_name||'.Begin'
13541              ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13542 
13543     ----------------------------------------------------------------------------
13544     --Clean the previous Values
13545     ----------------------------------------------------------------------------
13546 
13547      t_component_dim_dc.DELETE;
13548 
13549     ----------------------------------------------------------------------------
13550     -- "t_component_dim_dc" is a TABLE TYPE which holds the display code
13551     -- values of all the component dimension members of Activity/Cost Object
13552     ----------------------------------------------------------------------------
13553 
13554 	 IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13555 
13556       t_component_dim_dc(1)  := 'FINANCIAL_ELEM_DISPLAY_CODE';
13557       t_component_dim_dc(2)  := 'LEDGER_DISPLAY_CODE';
13558       t_component_dim_dc(3)  := 'PRODUCT_DISPLAY_CODE';
13559       t_component_dim_dc(4)  := 'CCTR_ORG_DISPLAY_CODE';
13560       t_component_dim_dc(5)  := 'CUSTOMER_DISPLAY_CODE';
13561       t_component_dim_dc(6)  := 'CHANNEL_DISPLAY_CODE';
13562       t_component_dim_dc(7)  := 'PROJECT_DISPLAY_CODE';
13563       t_component_dim_dc(8)  := 'USER_DIM1_DISPLAY_CODE';
13564       t_component_dim_dc(9)  := 'USER_DIM2_DISPLAY_CODE';
13565       t_component_dim_dc(10) := 'USER_DIM3_DISPLAY_CODE';
13566       t_component_dim_dc(11) := 'USER_DIM4_DISPLAY_CODE';
13567       t_component_dim_dc(12) := 'USER_DIM5_DISPLAY_CODE';
13568       t_component_dim_dc(13) := 'USER_DIM6_DISPLAY_CODE';
13569       t_component_dim_dc(14) := 'USER_DIM7_DISPLAY_CODE';
13570       t_component_dim_dc(15) := 'USER_DIM8_DISPLAY_CODE';
13571       t_component_dim_dc(16) := 'USER_DIM9_DISPLAY_CODE';
13572       t_component_dim_dc(17) := 'USER_DIM10_DISPLAY_CODE';
13573 
13574 	  --------------------------------------------------------------------------
13575 	  --As per Cost Object HLD, the Cost Object FF can have 17 segments and
13576 	  --hence initializing it to 17
13577 	  --------------------------------------------------------------------------
13578 	  i := 17;
13579 
13580 
13581      ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
13582 
13583       t_component_dim_dc(1)  := 'TASK_DISPLAY_CODE';
13584       t_component_dim_dc(2)  := 'CCTR_ORG_DISPLAY_CODE';
13585       t_component_dim_dc(3)  := 'CUSTOMER_DISPLAY_CODE';
13586       t_component_dim_dc(4)  := 'CHANNEL_DISPLAY_CODE';
13587       t_component_dim_dc(5)  := 'PRODUCT_DISPLAY_CODE';
13588       t_component_dim_dc(6)  := 'PROJECT_DISPLAY_CODE';
13589       t_component_dim_dc(7)  := 'USER_DIM1_DISPLAY_CODE';
13590       t_component_dim_dc(8)  := 'USER_DIM2_DISPLAY_CODE';
13591       t_component_dim_dc(9)  := 'USER_DIM3_DISPLAY_CODE';
13592       t_component_dim_dc(10) := 'USER_DIM4_DISPLAY_CODE';
13593       t_component_dim_dc(11) := 'USER_DIM5_DISPLAY_CODE';
13594       t_component_dim_dc(12) := 'USER_DIM6_DISPLAY_CODE';
13595       t_component_dim_dc(13) := 'USER_DIM7_DISPLAY_CODE';
13596       t_component_dim_dc(14) := 'USER_DIM8_DISPLAY_CODE';
13597       t_component_dim_dc(15) := 'USER_DIM9_DISPLAY_CODE';
13598       t_component_dim_dc(16) := 'USER_DIM10_DISPLAY_CODE';
13599 
13600 	  --------------------------------------------------------------------------
13601 	  --As per Activity HLD, the Cost Object FF can have 16 segments and
13602 	  --hence initializing it to 16
13603 	  --------------------------------------------------------------------------
13604        i := 16;
13605 
13606      END IF;
13607 
13608      ---------------------------------------------------------------------------
13609      --Initialize the TABLE TYPE variable 't_metadata' with default values.
13610      ---------------------------------------------------------------------------
13611 
13612     FOR j IN 1 .. i LOOP
13613 
13614          t_metadata(j).dimension_varchar_label := NULL;
13615          t_metadata(j).member_display_code_col := t_component_dim_dc(j);
13616          t_metadata(j).dimension_id := -999;
13617          t_metadata(j).member_col := NULL;
13618          t_metadata(j).member_b_table_name := NULL;
13619          t_metadata(j).value_set_required_flag := NULL;
13620          t_metadata(j).member_sql := NULL;
13621 
13622      END LOOP;
13623 
13624 	 fem_engines_pkg.tech_message (
13625              p_severity  => c_log_level_1
13626 	         ,p_module   => c_block||'.'||c_proc_name||'.End'
13627              ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13628 
13629      EXCEPTION
13630 
13631      WHEN others THEN
13632 
13633       fem_engines_pkg.tech_message (
13634              p_severity  => c_log_level_4
13635 	         ,p_module   => c_block||'.'||c_proc_name||'.Exception'
13636              ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
13637 							'Code'||SQLCODE||'Err'||SQLERRM);
13638 
13639       RAISE e_terminate;
13640 
13641     END Metadata_Initialize;
13642 
13643 
13644 /*===========================================================================+
13645  | PROCEDURE
13646  |              Get_Display_Code
13647  |
13648  | DESCRIPTION
13649  |    This procedure concatenates the individual component dimension members
13650  |   of the Composite Dimensions(Activity and Cost Objects).
13651  |
13652  |     The component dimension members are concatenated to form a
13653  |   single Composite Dimension Member.The component dimension members
13654  |   are separated by the delimiter of the corresponding flex filed.
13655  |
13656  |ARGUMENTS  : IN:
13657  |
13658  |  p_dimension_varchar_label - Composite Dimension Name
13659  |  p_structure_id            - FF structure Code
13660  |
13661  | MODIFICATION HISTORY
13662  |    Aturlapa     06-APR-05  Created
13663  |    sshanmug     11-May-05  Generalised the common piece of code both AC/CO.
13664  +===========================================================================*/
13665 
13666  /* PROCEDURE Get_Display_Codes (p_dimension_varchar_label IN VARCHAR2,
13667                                p_structure_id            IN NUMBER)
13668 
13669    IS
13670 
13671      c_proc_name CONSTANT VARCHAR2(20) := 'Get_Display_Codes';
13672 
13673      -- FF Details
13674      l_segment_delimiter VARCHAR2(1);
13675      p_ff_code_activity  VARCHAR2(4) := 'FEAC';
13676      p_ff_code_cost VARCHAR2(4) := 'FECO';
13677 
13678      --Counting Variable
13679      v_last_row NUMBER;
13680 
13681    BEGIN
13682 
13683     fem_engines_pkg.tech_message (
13684              p_severity  => c_log_level_1
13685 	         ,p_module   => c_block||'.'||c_proc_name||'.Begin'
13686              ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13687 
13688     ----------------------------------------------------------------------------
13689     --Get the count of records in the interface table (this fetch)
13690     ----------------------------------------------------------------------------
13691 
13692     v_last_row := t_status.COUNT;
13693 
13694     ----------------------------------------------------------------------------
13695     --Clean the previous Values
13696     ----------------------------------------------------------------------------
13697 
13698     t_display_code.DELETE;
13699 
13700     ----------------------------------------------------------------------
13701     --Get the segment delimiter
13702     ----------------------------------------------------------------------
13703 
13704     IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13705 
13706 	  l_segment_delimiter := FND_FLEX_EXT.GET_DELIMITER('FEM',p_ff_code_cost,
13707                                                     p_structure_id);
13708     ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
13709 
13710 	  l_segment_delimiter := FND_FLEX_EXT.GET_DELIMITER('FEM',p_ff_code_activity,
13711                                                     p_structure_id);
13712     END IF;
13713 
13714 
13715 
13716     FOR i IN 1..v_last_row LOOP
13717 
13718       --------------------------------------------------------------------------
13719       -- Concatenate only rows with STATUS = 'LOAD'
13720       --------------------------------------------------------------------------
13721 
13722       IF t_status(i) = 'LOAD' THEN
13723 
13724         IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13725 
13726           ----------------------------------------------------------------------
13727           --Fin Elem and Ledger are mandatory for CO hence it is concatenated
13728           ----------------------------------------------------------------------
13729 
13730           t_display_code(i) := t_fin_elem_dc(i) || l_segment_delimiter;
13731           t_display_code(i) := t_display_code(i) || t_ledger_dc(i);
13732 
13733           ----------------------------------------------------------------------
13734           --Concatenate other segments only if they are not null.
13735           ----------------------------------------------------------------------
13736 
13737           IF t_product_dc(i) IS NOT NULL THEN
13738           t_display_code(i) := t_display_code(i) ||
13739                              l_segment_delimiter||t_product_dc(i);
13740           END IF;
13741           IF t_cctr_org_dc(i) IS NOT NULL THEN
13742           t_display_code(i) := t_display_code(i) ||
13743                              l_segment_delimiter||t_cctr_org_dc(i);
13744           END IF;
13745           IF t_customer_dc(i) IS NOT NULL THEN
13746           t_display_code(i) := t_display_code(i) ||
13747                              l_segment_delimiter||t_customer_dc(i);
13748           END IF;
13749 		  IF t_channel_dc(i) IS NOT NULL THEN
13750           t_display_code(i) := t_display_code(i) ||
13751                              l_segment_delimiter||t_channel_dc(i);
13752           END IF;
13753           IF t_project_dc(i) IS NOT NULL THEN
13754           t_display_code(i) := t_display_code(i) ||
13755                              l_segment_delimiter||t_project_dc(i);
13756           END IF;
13757 
13758         ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
13759 
13760           ----------------------------------------------------------------------
13761           --Task is mandatory for Activity hence it is concatenated
13762           ----------------------------------------------------------------------
13763 
13764           t_display_code(i) := t_task_dc(i);
13765 
13766          -----------------------------------------------------------------------
13767          --Concatenate other segments only if they are not null.
13768          -----------------------------------------------------------------------
13769 
13770          IF t_cctr_org_dc(i) IS NOT NULL THEN
13771             t_display_code(i) := t_display_code(i) ||
13772                              l_segment_delimiter||t_cctr_org_dc(i);
13773          END IF;
13774          IF t_customer_dc(i) IS NOT NULL THEN
13775             t_display_code(i) := t_display_code(i) ||
13776                              l_segment_delimiter||t_customer_dc(i);
13777          END IF;
13778          IF t_channel_dc(i) IS NOT NULL THEN
13779             t_display_code(i) := t_display_code(i) ||
13780                              l_segment_delimiter||t_channel_dc(i);
13781          END IF;
13782          IF t_product_dc(i) IS NOT NULL THEN
13783            t_display_code(i) := t_display_code(i) ||
13784                              l_segment_delimiter||t_product_dc(i);
13785          END IF;
13786          IF t_project_dc(i) IS NOT NULL THEN
13787             t_display_code(i) := t_display_code(i) ||
13788                              l_segment_delimiter||t_project_dc(i);
13789          END IF;
13790 
13791         END IF;
13792 
13793         ------------------------------------------------------------------------
13794         -- The following component Dimensions are common for both Activity and
13795         -- Cost Object. Hence it will be common code for both dimensions.
13796         ------------------------------------------------------------------------
13797 
13798          IF t_user_dim1_dc(i) IS NOT NULL THEN
13799             t_display_code(i) := t_display_code(i) ||
13800                              l_segment_delimiter||t_user_dim1_dc(i);
13801          END IF;
13802          IF t_user_dim2_dc(i) IS NOT NULL THEN
13803             t_display_code(i) := t_display_code(i) ||
13804                              l_segment_delimiter||t_user_dim2_dc(i);
13805          END IF;
13806          IF t_user_dim3_dc(i) IS NOT NULL THEN
13807             t_display_code(i) := t_display_code(i) ||
13808                              l_segment_delimiter||t_user_dim3_dc(i);
13809          END IF;
13810          IF t_user_dim4_dc(i) IS NOT NULL THEN
13811             t_display_code(i) := t_display_code(i) ||
13812                              l_segment_delimiter||t_user_dim4_dc(i);
13813          END IF;
13814          IF t_user_dim5_dc(i) IS NOT NULL THEN
13815             t_display_code(i) := t_display_code(i) ||
13816                              l_segment_delimiter||t_user_dim5_dc(i);
13817          END IF;
13818          IF t_user_dim6_dc(i) IS NOT NULL THEN
13819            t_display_code(i) := t_display_code(i) ||
13820                                l_segment_delimiter||t_user_dim6_dc(i);
13821          END IF;
13822          IF t_user_dim7_dc(i) IS NOT NULL THEN
13823              t_display_code(i) := t_display_code(i) ||
13824                              l_segment_delimiter||t_user_dim7_dc(i);
13825          END IF;
13826          IF t_user_dim8_dc(i) IS NOT NULL THEN
13827            t_display_code(i) := t_display_code(i) ||
13828                              l_segment_delimiter||t_user_dim8_dc(i);
13829          END IF;
13830          IF t_user_dim9_dc(i) IS NOT NULL THEN
13831             t_display_code(i) := t_display_code(i) ||
13832                              l_segment_delimiter||t_user_dim9_dc(i);
13833          END IF;
13834          IF t_user_dim10_dc(i) IS NOT NULL THEN
13835             t_display_code(i) := t_display_code(i) ||
13836                              l_segment_delimiter||t_user_dim10_dc(i);
13837          END IF;
13838 
13839       ELSE
13840 
13841        t_display_code(i) := NULL;
13842 
13843       END IF; -- STATUS = 'LOAD'
13844 
13845     END LOOP;
13846 
13847    -----------------------------------------------------------------------------
13848    ---End Concatenate the segments
13849    -----------------------------------------------------------------------------
13850 
13851        fem_engines_pkg.tech_message (
13852              p_severity  => c_log_level_1
13853 	         ,p_module   => c_block||'.'||c_proc_name||'.End'
13854              ,p_msg_text => 'Dimension'||p_dimension_varchar_label);
13855 
13856   EXCEPTION
13857 
13858     WHEN others THEN
13859       fem_engines_pkg.tech_message (
13860              p_severity  => c_log_level_4
13861 	         ,p_module   => c_block||'.'||c_proc_name||'.Exception'
13862              ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
13863 							'Code'||SQLCODE||'Err'||SQLERRM);
13864 
13865       RAISE e_terminate;
13866 
13867   END Get_Display_Codes;
13868 
13869 /*===========================================================================+
13870  | PROCEDURE
13871  |              pre_process
13872  |
13873  | DESCRIPTION
13874  |
13875  |     This Procedure is used to get the flexfield information of the composite
13876  | Dimensions (Activity and Cost Object).It populates the component dimension
13877  | information into a TABLE TYPE variable.
13878  |
13879  | SCOPE - PRIVATE
13880  |
13881  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
13882  |
13883  | ARGUMENTS  : IN:
13884  |
13885  |              p_execution_mode - 'S'(Snapshot) / 'E'(Error Reprocessing) Mode.
13886  |              p_dimension_varchar_label - Indicates the Dimension
13887  |
13888  |              OUT:
13889  |
13890  |              x_pre_process_status - Status of the Procedure.
13891  |
13892  | RETURNS    : NONE
13893  |
13894  | NOTES
13895  |
13896  |
13897  | MODIFICATION HISTORY
13898  |    Aturlapa        31-MAR-05  Created
13899  |    sshanmug        10-May-05  Incorporated the comments from Nico.
13900  +===========================================================================*/
13901 
13902  /* PROCEDURE Pre_Process (x_pre_process_status OUT NOCOPY VARCHAR2
13903                          ,p_execution_mode IN VARCHAR2
13904                          ,p_dimension_varchar_label IN VARCHAR2)
13905    IS
13906 
13907    c_proc_name CONSTANT varchar2(20) := 'Pre_Process';
13908 
13909    -- variable to get the status of AC/CO FF Definition.
13910    l_dim_active_flag VARCHAR2(1);
13911 
13912    BEGIN
13913 
13914      -- Initialize the return status
13915      x_pre_process_status := 'SUCCESS';
13916 
13917      fem_engines_pkg.tech_message (
13918              p_severity  => c_log_level_1
13919 	         ,p_module   => c_block||'.'||c_proc_name||'.Begin'
13920              ,p_msg_text => 'Mode'||p_execution_mode
13921 			                      ||'Dimension'||p_dimension_varchar_label);
13922 
13923      --------------------------------------------------------------------------
13924      -- Check whether the AC/CO structure is defined or not
13925      -- Raise the Exception if the AC / CO Structure is not freezed.
13926      --------------------------------------------------------------------------
13927      BEGIN
13928 
13929        SELECT dimension_active_flag
13930        INTO l_dim_active_flag
13931        FROM Fem_Xdim_Dimensions_VL
13932        WHERE dimension_varchar_label = p_dimension_varchar_label;
13933 
13934      EXCEPTION
13935 
13936 	   WHEN no_data_found THEN
13937 	     fem_engines_pkg.tech_message (
13938              p_severity  => c_log_level_4
13939 	         ,p_module   => c_block||'.'||c_proc_name||'.Freeze_Exception'
13940              ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
13941 							'Code'||SQLCODE||'Err'||SQLERRM);
13942      END;
13943 
13944      IF l_dim_active_flag = 'N' THEN
13945 
13946 	   fem_engines_pkg.tech_message (
13947              p_severity  => c_log_level_5
13948 	         ,p_module   => c_block||'.'||c_proc_name
13949              ,p_msg_text => 'Dimension'||p_dimension_varchar_label||' Flex Field
13950 			  Definition Not Freezed');
13951 
13952 	   RAISE e_no_structure_defined;
13953      END IF;
13954 
13955      ---------------------------------------------------------------------------
13956      --Clean up the MetaData Variable
13957      ---------------------------------------------------------------------------
13958 
13959      t_metadata.DELETE;
13960 
13961      ---------------------------------------------------------------------------
13962      --Initialize the TABLE TYPE Variable which holds the metadata information
13963      ---------------------------------------------------------------------------
13964      Metadata_Initialize(p_dimension_varchar_label);
13965 
13966      fem_engines_pkg.tech_message (
13967              p_severity  => c_log_level_1
13968 	         ,p_module   => c_block||'.'||c_proc_name
13969              ,p_msg_text => 'After Metadata_Initialize');
13970 
13971      IF p_dimension_varchar_label = 'COST_OBJECT' THEN
13972 
13973 	  -------------------------------------------------------------------------
13974        --This loop runs for all the component Dimension members of
13975        --the Cost Object Dimension and populates their details into
13976        --'t_metadata' variable
13977        -------------------------------------------------------------------------
13978 
13979         FOR c_metadata_cost IN (
13980           SELECT x.dimension_id
13981           ,x.dimension_varchar_label
13982           ,x.member_col
13983           ,x.member_display_code_col
13984           ,x.member_b_table_name
13985           ,x.value_set_required_flag
13986           FROM FEM_COLUMN_REQUIREMNT_VL c
13987           ,FEM_XDIM_DIMENSIONS_VL x
13988           WHERE c.dimension_id = x.dimension_id
13989           AND c.cost_obj_dim_component_flag = 'Y'
13990           ORDER BY 1 )
13991           LOOP
13992             FOR i IN 1 .. t_metadata.COUNT LOOP
13993        	    IF c_metadata_cost.member_display_code_col = t_component_dim_dc(i) THEN
13994               t_metadata(i).dimension_id := c_metadata_cost.dimension_id;
13995               t_metadata(i).dimension_varchar_label :=
13996 			                       c_metadata_cost.dimension_varchar_label;
13997               t_metadata(i).member_col := c_metadata_cost.member_col;
13998               t_metadata(i).member_b_table_name :=
13999                                             c_metadata_cost.member_b_table_name;
14000               t_metadata(i).value_set_required_flag :=
14001                               c_metadata_cost.value_set_required_flag;
14002               t_metadata(i).member_sql :=
14003               ' SELECT '||c_metadata_cost.member_col||
14004               ' FROM '||c_metadata_cost.member_b_table_name||
14005               ' WHERE enabled_flag = ''Y'''||
14006               ' AND '||c_metadata_cost.member_display_code_col||' = :b_dc_val';
14007 
14008               IF (c_metadata_cost.value_set_required_flag = 'Y') THEN
14009                 t_metadata(i).member_sql := t_metadata(i).member_sql||
14010 				                         ' AND value_set_id = :b_value_set_id';
14011               END IF;
14012        	    END IF;
14013             END LOOP;
14014           END LOOP;
14015 
14016         -------------------------------------------------------------------------
14017         -- Build Engine SQL --
14018         -------------------------------------------------------------------------
14019 
14020         g_select_statement :=
14021          'SELECT rowid,'||
14022          ' GLOBAL_VS_COMBO_DISPLAY_CODE,'||
14023          ' financial_elem_display_code,'||
14024          ' ledger_display_code,'||
14025          ' product_display_code,'||
14026          ' CCTR_ORG_DISPLAY_CODE,'||
14027          ' customer_display_code,'||
14028          ' channel_display_code,'||
14029          ' project_display_code,'||
14030          ' user_dim1_display_code,'||
14031          ' user_dim2_display_code,'||
14032          ' user_dim3_display_code,'||
14033          ' user_dim4_display_code,'||
14034          ' user_dim5_display_code,'||
14035          ' user_dim6_display_code,'||
14036          ' user_dim7_display_code,'||
14037          ' user_dim8_display_code,'||
14038          ' user_dim9_display_code,'||
14039          ' user_dim10_display_code,'||
14040          ' status'||
14041          ' FROM FEM_COST_OBJECTS_T '||
14042          ' WHERE {{data_slice}} ';
14043 
14044      ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
14045 
14046        -------------------------------------------------------------------------
14047        --Initialize the TABLE TYPE Variable which holds the metadata information
14048        -------------------------------------------------------------------------
14049 
14050        Metadata_Initialize(p_dimension_varchar_label);
14051 
14052        -------------------------------------------------------------------------
14053        --Thid loop runs for all the component Dimension members of
14054        --the Activity Dimension and populates their details into
14055        --'t_metadata' variable
14056        -------------------------------------------------------------------------
14057 
14058        FOR c_metadata_activity IN (
14059          SELECT x.dimension_id
14060          ,x.dimension_varchar_label
14061          ,x.member_col
14062          ,x.member_display_code_col
14063          ,x.member_b_table_name
14064          ,x.value_set_required_flag
14065          FROM FEM_COLUMN_REQUIREMNT_VL c
14066          ,FEM_XDIM_DIMENSIONS_VL x
14067          WHERE c.dimension_id = x.dimension_id
14068          AND c.activity_dim_component_flag = 'Y'
14069          ORDER BY 1 )
14070         LOOP
14071            FOR i IN 1 .. t_metadata.COUNT LOOP
14072              IF c_metadata_activity.member_display_code_col
14073 			                                       = t_component_dim_dc(i) THEN
14074              t_metadata(i).dimension_id := c_metadata_activity.dimension_id;
14075              t_metadata(i).dimension_varchar_label :=
14076 			                       c_metadata_activity.dimension_varchar_label;
14077              t_metadata(i).member_col := c_metadata_activity.member_col;
14078              t_metadata(i).member_b_table_name :=
14079                                       c_metadata_activity.member_b_table_name;
14080              t_metadata(i).value_set_required_flag :=
14081                                     c_metadata_activity.value_set_required_flag;
14082              t_metadata(i).member_sql :=
14083              ' SELECT '||c_metadata_activity.member_col||
14084              ' FROM '||c_metadata_activity.member_b_table_name||
14085              ' WHERE enabled_flag = ''Y'''||
14086              ' AND '||c_metadata_activity.member_display_code_col||' = :b_dc_val';
14087 
14088                IF (c_metadata_activity.value_set_required_flag = 'Y') THEN
14089                  t_metadata(i).member_sql := t_metadata(i).member_sql||
14090 				                          ' AND value_set_id = :b_value_set_id';
14091                END IF;
14092              END IF;
14093            END LOOP;
14094          END LOOP;
14095 
14096        -------------------------------------------------------------------------
14097        -- Build Engine SQL --
14098        -------------------------------------------------------------------------
14099 
14100        g_select_statement :=
14101          'SELECT rowid,'||
14102          ' GLOBAL_VS_COMBO_DISPLAY_CODE,'||
14103          ' TASK_DISPLAY_CODE,'||
14104          ' CCTR_ORG_DISPLAY_CODE,'||
14105          ' customer_display_code,'||
14106          ' channel_display_code,'||
14107          ' product_display_code,'||
14108          ' project_display_code,'||
14109          ' user_dim1_display_code,'||
14110          ' user_dim2_display_code,'||
14111          ' user_dim3_display_code,'||
14112          ' user_dim4_display_code,'||
14113          ' user_dim5_display_code,'||
14114          ' user_dim6_display_code,'||
14115          ' user_dim7_display_code,'||
14116          ' user_dim8_display_code,'||
14117          ' user_dim9_display_code,'||
14118          ' user_dim10_display_code,'||
14119          ' status'||
14120          ' FROM FEM_ACTIVITIES_T '||
14121          ' WHERE {{data_slice}} ';
14122 	 END IF;
14123 
14124 
14125 
14126      fem_engines_pkg.tech_message (
14127        p_severity  => c_log_level_1
14128 	   ,p_module   => c_block||'.'||c_proc_name||'.End'
14129        ,p_msg_text => 'Mode'||p_execution_mode
14130 	                     ||'Dimension'||p_dimension_varchar_label);
14131 
14132    EXCEPTION
14133 
14134      WHEN e_no_structure_defined THEN
14135 
14136        fem_engines_pkg.tech_message (
14137           p_severity => c_log_level_4
14138           ,p_module => c_block||'.'||c_proc_name||'.Exception'
14139           ,p_app_name => c_fem
14140           ,p_msg_name => G_NO_STRUCTURE_DEFINED
14141           ,P_TOKEN1 => 'OPERATION'
14142           ,P_VALUE1 => p_dimension_varchar_label);
14143 
14144        x_pre_process_status := 'ERROR';
14145 
14146       WHEN others THEN
14147 
14148        fem_engines_pkg.tech_message (
14149              p_severity  => c_log_level_4
14150 	         ,p_module   => c_block||'.'||c_proc_name||'.Exception'
14151              ,p_msg_text => 'Mode'||p_execution_mode||
14152                             'Dimension'||p_dimension_varchar_label||
14153 							'Code'||SQLCODE||'Err'||SQLERRM);
14154 
14155        x_pre_process_status := 'ERROR';
14156 
14157    END Pre_Process;
14158 
14159  /*===========================================================================+
14160  | PROCEDURE
14161  |              process_rows
14162  |
14163  | DESCRIPTION
14164  |
14165  |             This procedure is used to process all the rows in the interface
14166  |  table of composite dimensions (FEM_ACTIVITIES_T/FEM_COST_OBJECTS_T) and
14167  |  performs various validations on these records,concatenate the component
14168  |  dimension members and inserts only the valid records into the member table
14169  |  of Composite Dimensions.The invalid records will be processed in
14170  |  'Error Reproceesing' Mode.
14171  |
14172  | SCOPE - PRIVATE
14173  |
14174  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
14175  |
14176  | ARGUMENTS  :
14177  |
14178  | RETURNS    : NONE
14179  |
14180  | NOTES
14181  |
14182  |
14183  | MODIFICATION HISTORY
14184  |    Aturlapa    31-MAR-05  Created
14185  |    sshanmug    17-MAY-05  Incorporated comments from Nico
14186  |
14187  +===========================================================================*/
14188 
14189 /*  procedure Process_Rows (x_status OUT NOCOPY NUMBER
14190                       ,x_message OUT NOCOPY VARCHAR2
14191                       ,x_rows_processed OUT NOCOPY NUMBER
14192                       ,x_rows_loaded OUT NOCOPY NUMBER
14193                       ,x_rows_rejected OUT NOCOPY NUMBER
14194                       ,p_eng_sql IN VARCHAR2
14195                       ,p_data_slc IN VARCHAR2
14196                       ,p_proc_num IN VARCHAR2
14197                       ,p_slice_id IN VARCHAR2
14198                       ,p_fetch_limit IN NUMBER
14199                       ,p_load_type IN VARCHAR2
14200                       ,p_dimension_varchar_label IN VARCHAR2
14201                       ,p_execution_mode IN VARCHAR2
14202                       ,p_structure_id IN NUMBER)
14203    IS
14204 
14205    c_proc_name CONSTANT varchar2(20) := 'Process_Rows';
14206 
14207    lv_status VARCHAR2(200);
14208 
14209    v_fetch_limit NUMBER;
14210    v_rows_processed NUMBER;
14211    v_rows_rejected NUMBER;
14212    v_rows_loaded NUMBER;
14213 
14214    v_cost_object_dc FEM_COST_OBJECTS.cost_object_display_code%TYPE;
14215    v_activity_dc FEM_ACTIVITIES.activity_display_code%TYPE;
14216 
14217    -- Follwoing 3 params are needed for FEM_DIM_UTILS_PVT.Check_Unique_Member
14218 
14219    v_return_status  VARCHAR2(20);
14220    v_msg_count NUMBER;
14221    v_msg_data VARCHAR2(200);
14222 
14223    v_cost_structure_id NUMBER;
14224    v_activity_structure_id NUMBER;
14225 
14226    v_select_stmt LONG;
14227    v_data_slc VARCHAR2(4000);
14228 
14229    v_update_stmt VARCHAR2(4000);
14230    v_delete_stmt VARCHAR2(4000);
14231    v_member_table_name VARCHAR2(200);
14232 
14233    v_CREATED_BY        NUMBER := fnd_global.user_id;
14234    v_LAST_UPDATED_BY   NUMBER := fnd_global.user_id;
14235    v_LAST_UPDATE_LOGIN NUMBER := fnd_global.login_id;
14236 
14237    v_last_row   NUMBER;
14238    v_mbr_last_row NUMBER;
14239 
14240    x_pre_process_status VARCHAR2(30);
14241 
14242    l_count NUMBER;-- var to keep track of inavlid values for each validation
14243 
14244   ------------------------------------------
14245   -- DML Statements used in the procedure --
14246   -------------------------------------------
14247 
14248    v_insert_cost_stmt CONSTANT LONG :=
14249    'INSERT INTO FEM_COST_OBJECTS ('||
14250    ' COST_OBJECT_ID, '||
14251    ' COST_OBJECT_DISPLAY_CODE, '||
14252    ' SUMMARY_FLAG, '||
14253    ' START_DATE_ACTIVE, '||
14254    ' END_DATE_ACTIVE, '||
14255    ' COST_OBJECT_STRUCTURE_ID, '||
14256    ' LOCAL_VS_COMBO_ID, '||
14257    ' UOM_CODE, '||
14258    ' FINANCIAL_ELEM_ID, '||
14259    ' LEDGER_ID, '||
14260    ' PRODUCT_ID, '||
14261    ' COMPANY_COST_CENTER_ORG_ID, '||
14262    ' CUSTOMER_ID, '||
14263    ' CHANNEL_ID, '||
14264    ' PROJECT_ID, '||
14265    ' USER_DIM1_ID, '||
14266    ' USER_DIM2_ID, '||
14267    ' USER_DIM3_ID, '||
14268    ' USER_DIM4_ID, '||
14269    ' USER_DIM5_ID, '||
14270    ' USER_DIM6_ID, '||
14271    ' USER_DIM7_ID, '||
14272    ' USER_DIM8_ID, '||
14273    ' USER_DIM9_ID, '||
14274    ' USER_DIM10_ID, '||
14275    ' SEGMENT1, '||
14276    ' SEGMENT2, '||
14277    ' SEGMENT3, '||
14278    ' SEGMENT4, '||
14279    ' SEGMENT5, '||
14280    ' SEGMENT6, '||
14281    ' SEGMENT7, '||
14282    ' SEGMENT8, '||
14283    ' SEGMENT9, '||
14284    ' SEGMENT10, '||
14285    ' SEGMENT11, '||
14286    ' SEGMENT12, '||
14287    ' SEGMENT13, '||
14288    ' SEGMENT14, '||
14289    ' SEGMENT15, '||
14290    ' SEGMENT16, '||
14291    ' SEGMENT17, '||
14292    ' SEGMENT18, '||
14293    ' SEGMENT19, '||
14294    ' SEGMENT20, '||
14295    ' SEGMENT21, '||
14296    ' SEGMENT22, '||
14297    ' SEGMENT23, '||
14298    ' SEGMENT24, '||
14299    ' SEGMENT25, '||
14300    ' SEGMENT26, '||
14301    ' SEGMENT27, '||
14302    ' SEGMENT28, '||
14303    ' SEGMENT29, '||
14304    ' SEGMENT30, '||
14305    ' CREATION_DATE, '||
14306    ' CREATED_BY, '||
14307    ' LAST_UPDATED_BY, '||
14308    ' LAST_UPDATE_DATE, '||
14309    ' LAST_UPDATE_LOGIN, '||
14310    ' OBJECT_VERSION_NUMBER, '||
14311    ' ENABLED_FLAG, '||
14312    ' PERSONAL_FLAG, '||
14313    ' READ_ONLY_FLAG )'||
14314    ' SELECT fem_cost_objects_s.nextval,'||
14315           ' :b_COST_OBJECT_DISPLAY_CODE, '||
14316           ' :b_SUMMARY_FLAG, '||
14317           ' :b_START_DATE_ACTIVE, '||
14318           ' :b_END_DATE_ACTIVE, '||
14319           ' :b_COST_OBJECT_STRUCTURE_ID, '||
14320           ' :b_LOCAL_VS_COMBO_ID, '||
14321           ' :b_UOM_CODE, '||
14322           ' :b_FINANCIAL_ELEM_ID, '||
14323           ' :b_LEDGER_ID, '||
14324           ' :b_PRODUCT_ID, '||
14325           ' :b_COMPANY_COST_CENTER_ORG_ID, '||
14326           ' :b_CUSTOMER_ID, '||
14327           ' :b_CHANNEL_ID, '||
14328           ' :b_PROJECT_ID, '||
14329           ' :b_USER_DIM1_ID, '||
14330           ' :b_USER_DIM2_ID, '||
14331           ' :b_USER_DIM3_ID, '||
14332           ' :b_USER_DIM4_ID, '||
14333           ' :b_USER_DIM5_ID, '||
14334           ' :b_USER_DIM6_ID, '||
14335           ' :b_USER_DIM7_ID, '||
14336           ' :b_USER_DIM8_ID, '||
14337           ' :b_USER_DIM9_ID, '||
14338           ' :b_USER_DIM10_ID, '||
14339           ' :b_SEGMENT1, '||
14340           ' :b_SEGMENT2, '||
14341           ' :b_SEGMENT3, '||
14342           ' :b_SEGMENT4, '||
14343           ' :b_SEGMENT5, '||
14344           ' :b_SEGMENT6, '||
14345           ' :b_SEGMENT7, '||
14346           ' :b_SEGMENT8, '||
14347           ' :b_SEGMENT9, '||
14348           ' :b_SEGMENT10, '||
14349           ' :b_SEGMENT11, '||
14350           ' :b_SEGMENT12, '||
14351           ' :b_SEGMENT13, '||
14352           ' :b_SEGMENT14, '||
14353           ' :b_SEGMENT15, '||
14354           ' :b_SEGMENT16, '||
14355           ' :b_SEGMENT17, '||
14356           ' :b_SEGMENT18, '||
14357           ' :b_SEGMENT19, '||
14358           ' :b_SEGMENT20, '||
14359           ' :b_SEGMENT21, '||
14360           ' :b_SEGMENT22, '||
14361           ' :b_SEGMENT23, '||
14362           ' :b_SEGMENT24, '||
14363           ' :b_SEGMENT25, '||
14364           ' :b_SEGMENT26, '||
14365           ' :b_SEGMENT27, '||
14366           ' :b_SEGMENT28, '||
14367           ' :b_SEGMENT29, '||
14368           ' :b_SEGMENT30, '||
14369           ' :b_CREATION_DATE, '||
14370           ' :b_CREATED_BY, '||
14371           ' :b_LAST_UPDATED_BY, '||
14372           ' :b_LAST_UPDATE_DATE, '||
14373           ' :b_LAST_UPDATE_LOGIN, '||
14374           ' :b_OBJECT_VERSION_NUMBER, '||
14375           ' :b_ENABLED_FLAG, '||
14376           ' :b_PERSONAL_FLAG, '||
14377           ' :b_read_only_flag '||
14378           ' FROM dual'||
14379           ' WHERE :b_status = ''LOAD''';
14380 
14381   v_insert_activity_stmt CONSTANT LONG :=
14382    'INSERT INTO FEM_ACTIVITIES ('||
14383    ' ACTIVITY_ID, '||
14384    ' ACTIVITY_DISPLAY_CODE, '||
14385    ' SUMMARY_FLAG, '||
14386    ' START_DATE_ACTIVE, '||
14387    ' END_DATE_ACTIVE, '||
14388    ' ACTIVITY_STRUCTURE_ID, '||
14389    ' LOCAL_VS_COMBO_ID, '||
14390    ' TASK_ID, '||
14391    ' COMPANY_COST_CENTER_ORG_ID, '||
14392    ' CUSTOMER_ID, '||
14393    ' CHANNEL_ID, '||
14394    ' PRODUCT_ID, '||
14395    ' PROJECT_ID, '||
14396    ' USER_DIM1_ID, '||
14397    ' USER_DIM2_ID, '||
14398    ' USER_DIM3_ID, '||
14399    ' USER_DIM4_ID, '||
14400    ' USER_DIM5_ID, '||
14401    ' USER_DIM6_ID, '||
14402    ' USER_DIM7_ID, '||
14403    ' USER_DIM8_ID, '||
14404    ' USER_DIM9_ID, '||
14405    ' USER_DIM10_ID, '||
14406    ' SEGMENT1, '||
14407    ' SEGMENT2, '||
14408    ' SEGMENT3, '||
14409    ' SEGMENT4, '||
14410    ' SEGMENT5, '||
14411    ' SEGMENT6, '||
14412    ' SEGMENT7, '||
14413    ' SEGMENT8, '||
14414    ' SEGMENT9, '||
14415    ' SEGMENT10, '||
14416    ' SEGMENT11, '||
14417    ' SEGMENT12, '||
14418    ' SEGMENT13, '||
14419    ' SEGMENT14, '||
14420    ' SEGMENT15, '||
14421    ' SEGMENT16, '||
14422    ' SEGMENT17, '||
14423    ' SEGMENT18, '||
14424    ' SEGMENT19, '||
14425    ' SEGMENT20, '||
14426    ' SEGMENT21, '||
14427    ' SEGMENT22, '||
14428    ' SEGMENT23, '||
14429    ' SEGMENT24, '||
14430    ' SEGMENT25, '||
14431    ' SEGMENT26, '||
14432    ' SEGMENT27, '||
14433    ' SEGMENT28, '||
14434    ' SEGMENT29, '||
14435    ' SEGMENT30, '||
14436    ' CREATION_DATE, '||
14437    ' CREATED_BY, '||
14438    ' LAST_UPDATED_BY, '||
14439    ' LAST_UPDATE_DATE, '||
14440    ' LAST_UPDATE_LOGIN, '||
14441    ' OBJECT_VERSION_NUMBER, '||
14442    ' ENABLED_FLAG, '||
14443    ' PERSONAL_FLAG, '||
14444    ' READ_ONLY_FLAG )'||
14445    ' SELECT fem_activities_s.nextval,'||
14446           ' :b_ACTIVITY_DISPLAY_CODE, '||
14447           ' :b_SUMMARY_FLAG, '||
14448           ' :b_START_DATE_ACTIVE, '||
14449           ' :b_END_DATE_ACTIVE, '||
14450           ' :b_ACTIVITY_STRUCTURE_ID, '||
14451           ' :b_LOCAL_VS_COMBO_ID, '||
14452           ' :b_TASK_ID, '||
14453           ' :b_COMPANY_COST_CENTER_ORG_ID, '||
14454           ' :b_CUSTOMER_ID, '||
14455           ' :b_CHANNEL_ID, '||
14456           ' :b_PRODUCT_ID, '||
14457           ' :b_PROJECT_ID, '||
14458           ' :b_USER_DIM1_ID, '||
14459           ' :b_USER_DIM2_ID, '||
14460           ' :b_USER_DIM3_ID, '||
14461           ' :b_USER_DIM4_ID, '||
14462           ' :b_USER_DIM5_ID, '||
14463           ' :b_USER_DIM6_ID, '||
14464           ' :b_USER_DIM7_ID, '||
14465           ' :b_USER_DIM8_ID, '||
14466           ' :b_USER_DIM9_ID, '||
14467           ' :b_USER_DIM10_ID, '||
14468           ' :b_SEGMENT1, '||
14469           ' :b_SEGMENT2, '||
14470           ' :b_SEGMENT3, '||
14471           ' :b_SEGMENT4, '||
14472           ' :b_SEGMENT5, '||
14473           ' :b_SEGMENT6, '||
14474           ' :b_SEGMENT7, '||
14475           ' :b_SEGMENT8, '||
14476           ' :b_SEGMENT9, '||
14477           ' :b_SEGMENT10, '||
14478           ' :b_SEGMENT11, '||
14479           ' :b_SEGMENT12, '||
14480           ' :b_SEGMENT13, '||
14481           ' :b_SEGMENT14, '||
14482           ' :b_SEGMENT15, '||
14483           ' :b_SEGMENT16, '||
14484           ' :b_SEGMENT17, '||
14485           ' :b_SEGMENT18, '||
14486           ' :b_SEGMENT19, '||
14487           ' :b_SEGMENT20, '||
14488           ' :b_SEGMENT21, '||
14489           ' :b_SEGMENT22, '||
14490           ' :b_SEGMENT23, '||
14491           ' :b_SEGMENT24, '||
14492           ' :b_SEGMENT25, '||
14493           ' :b_SEGMENT26, '||
14494           ' :b_SEGMENT27, '||
14495           ' :b_SEGMENT28, '||
14496           ' :b_SEGMENT29, '||
14497           ' :b_SEGMENT30, '||
14498           ' :b_CREATION_DATE, '||
14499           ' :b_CREATED_BY, '||
14500           ' :b_LAST_UPDATED_BY, '||
14501           ' :b_LAST_UPDATE_DATE, '||
14502           ' :b_LAST_UPDATE_LOGIN, '||
14503           ' :b_OBJECT_VERSION_NUMBER, '||
14504           ' :b_ENABLED_FLAG, '||
14505           ' :b_PERSONAL_FLAG, '||
14506           ' :b_read_only_flag '||
14507           ' FROM dual'||
14508           ' WHERE :b_status = ''LOAD''';
14509 
14510   v_update_cost_stmt CONSTANT VARCHAR2(4000) :=
14511   'UPDATE FEM_COST_OBJECTS_T '||
14512   ' SET status = :b_status'||
14513   ' WHERE rowid = :b_rowid';
14514 
14515   v_update_activity_stmt CONSTANT VARCHAR2(4000) :=
14516   'UPDATE FEM_ACTIVITIES_T '||
14517   ' SET status = :b_status'||
14518   ' WHERE rowid = :b_rowid';
14519 
14520   v_delete_cost_stmt CONSTANT VARCHAR2(4000) :=
14521   'DELETE FROM FEM_COST_OBJECTS_T '||
14522   ' WHERE rowid = :b_rowid'||
14523   ' AND   :b_status = ''LOAD''';
14524 
14525   v_delete_activity_stmt CONSTANT VARCHAR2(4000) :=
14526   'DELETE FROM FEM_ACTIVITIES_T '||
14527   ' WHERE rowid = :b_rowid'||
14528   ' AND   :b_status = ''LOAD''';
14529 
14530   -------------------------------------
14531   -- Declare bulk collection columns --
14532   -------------------------------------
14533 
14534   TYPE rowid_type IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
14535    t_rowid rowid_type;
14536 
14537   TYPE number_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
14538    t_global_vs_combo_id    number_type;
14539    t_fin_elem_id    number_type;
14540    t_ledger_id    number_type;
14541    t_cctr_org_id    number_type;
14542    t_product_id     number_type;
14543    t_channel_id     number_type;
14544    t_project_id     number_type;
14545    t_customer_id    number_type;
14546    t_task_id        number_type;
14547    t_user_dim1_id   number_type;
14548    t_user_dim2_id   number_type;
14549    t_user_dim3_id   number_type;
14550    t_user_dim4_id   number_type;
14551    t_user_dim5_id   number_type;
14552    t_user_dim6_id   number_type;
14553    t_user_dim7_id   number_type;
14554    t_user_dim8_id   number_type;
14555    t_user_dim9_id   number_type;
14556    t_user_dim10_id  number_type;
14557 
14558   ----------------------------------------
14559   -- Ref cursors used in this Procedure --
14560   ----------------------------------------
14561 
14562    TYPE cv_curs IS REF CURSOR;
14563    cv_get_rows cv_curs;
14564    cv_get_invalid_fin_elems cv_curs;
14565    cv_get_invalid_ledgers cv_curs;
14566    cv_get_invalid_gvscs cv_curs;
14567    cv_get_invalid_comp_dims cv_curs;
14568 
14569 
14570    BEGIN
14571 
14572    fem_engines_pkg.tech_message(
14573              p_severity  => c_log_level_2
14574              ,p_module   => c_block||'.'||c_proc_name||'.Begin'
14575              ,p_msg_text => 'Execution Mode' || p_execution_mode||
14576 			                'Dimension' || p_dimension_varchar_label);
14577 
14578 
14579    --------------------------------------------------------------------------
14580    -- Initialize all OUT params
14581    --------------------------------------------------------------------------
14582    x_status  := 0;
14583    x_message := 'COMPLETE:NORMAL';
14584    --Need to initialize X_rows_processed,X_rows_loaded and x_rows_rejected
14585 
14586    --------------------------------------------------------------------------
14587    -- This procedure gets the flexfield info of the Composite Dimension
14588    -- and populates the TABLE Type variable
14589    --------------------------------------------------------------------------
14590 
14591    pre_process (x_pre_process_status
14592                 ,p_execution_mode
14593                 ,p_dimension_varchar_label);
14594 
14595 
14596 
14597    fem_engines_pkg.tech_message(
14598              p_severity  => c_log_level_5
14599              ,p_module   => c_block||'.'||c_proc_name||'.After Pre_Process'
14600              ,p_msg_text => 'Pre_Process Error '||x_pre_process_status);
14601 
14602 
14603    --------------------------------------------------------------------------
14604    -- Check for the error message from procedure pre-process
14605    --------------------------------------------------------------------------
14606 
14607 
14608    IF x_pre_process_status = 'ERROR' THEN
14609 
14610 	 fem_engines_pkg.tech_message (
14611              p_severity  => c_log_level_4
14612 	         ,p_module   => c_block||'.'||c_proc_name||'Pre_Process Error'
14613              ,p_msg_text => 'Code'||SQLCODE||'Err'||SQLERRM);
14614 
14615      RAISE e_terminate;
14616 
14617    END IF;
14618 
14619    -----------------------------------------------------------------------------
14620    --Initialize MultiProcessing variables
14621    -----------------------------------------------------------------------------
14622 
14623    v_data_slc := p_data_slc;
14624 
14625    IF v_data_slc IS NULL THEN
14626      v_data_slc := '1=1';
14627    END IF;
14628 
14629    IF (p_fetch_limit IS NOT NULL) THEN
14630      v_fetch_limit := p_fetch_limit;
14631    ELSE
14632      v_fetch_limit := c_fetch_limit;
14633    END IF;
14634 
14635    -----------------------------------------------------------------------------
14636    -- Add data slice to select statement
14637    -----------------------------------------------------------------------------
14638 
14639      v_select_stmt := REPLACE(p_eng_sql,'{{data_slice}}',v_data_slc);
14640   -- v_select_stmt := REPLACE(g_select_statement,'{{data_slice}}',v_data_slc);
14641 
14642    -----------------------------------------------------------------------------
14643    --Assign the update/delete statement according to the dimension
14644    -----------------------------------------------------------------------------
14645 
14646 
14647    IF (p_dimension_varchar_label = 'COST_OBJECT') THEN
14648      v_update_stmt := v_update_cost_stmt;
14649      v_delete_stmt := v_delete_cost_stmt;
14650      v_member_table_name := 'fem_cost_objects_t';
14651 
14652    ELSIF (p_dimension_varchar_label = 'ACTIVITY') THEN
14653      v_update_stmt := v_update_activity_stmt;
14654      v_delete_stmt := v_delete_activity_stmt;
14655      v_member_table_name := 'fem_activities_t';
14656 
14657    END IF;
14658 
14659 
14660    fem_engines_pkg.tech_message (
14661              p_severity  => c_log_level_1
14662 	         ,p_module   => c_block||'.'||c_proc_name
14663              ,p_msg_text => 'v_update_stmt '||v_update_stmt||
14664 			                'v_member_table_name'||v_member_table_name);
14665 
14666 
14667    fem_engines_pkg.tech_message (
14668              p_severity  => c_log_level_1
14669 	         ,p_module   => c_block||'.'||c_proc_name
14670              ,p_msg_text => 'v_delete_stmt '||v_delete_stmt||
14671 		                    'v_member_table_name'||v_member_table_name);
14672 
14673    -----------------------------------------------------------------------------
14674    -- In Error Reprocessing mode, update status to LOAD
14675    -----------------------------------------------------------------------------
14676 
14677    IF (p_execution_mode = 'E') THEN
14678      EXECUTE IMMEDIATE
14679      ' UPDATE '||v_member_table_name||' b'||
14680      ' SET status = ''LOAD'''||
14681      ' WHERE status <> ''LOAD'''||
14682      ' AND '||v_data_slc;
14683 
14684      fem_engines_pkg.tech_message (
14685              p_severity  => c_log_level_1
14686 	         ,p_module   => c_block||'.'||c_proc_name||'.Error Reproceesing Mode'
14687              ,p_msg_text => 'v_data_slc '||v_data_slc||
14688 		                    'v_member_table_name'||v_member_table_name);
14689    END IF;
14690 
14691 
14692 /*------------------------------------------------------------------------------
14693     VALIDATION#1
14694 
14695     This validation checks whether the values in GLOBAL_VS_COMBO_DISPLAY_CODE
14696     column of interface table is valid.
14697 -------------------------------------------------------------------------------*/
14698 
14699 /*   l_count :=0 ;
14700 
14701    OPEN cv_get_invalid_gvscs FOR
14702      ' SELECT a.rowid '||
14703 	 ' FROM '||v_member_table_name||' a'||
14704 	 ' WHERE not exists '||
14705      ' (SELECT 1 FROM fem_global_vs_combos_b b '||
14706 	 ' WHERE a.global_vs_combo_display_code= b.global_vs_combo_display_code)'||
14707      ' AND a.status = ''LOAD'''||
14708      ' AND '||v_data_slc;
14709 
14710    LOOP
14711      EXIT WHEN cv_get_invalid_gvscs%NOTFOUND;
14712      FETCH cv_get_invalid_gvscs BULK COLLECT
14713      INTO t_rowid
14714      LIMIT v_fetch_limit;
14715 
14716      -- local var which holds the no : of invalid values
14717 
14718      l_count := l_count + t_rowid.COUNT;
14719 
14720      --Get the count of no : of records this fetch
14721 	 v_last_row := t_rowid.COUNT;
14722 
14723 	 IF (v_last_row IS NOT NULL) THEN
14724        lv_status := 'INVALID_GVSC';
14725 
14726 	   FORALL i IN 1..v_last_row
14727          EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14728        t_rowid.DELETE;
14729        COMMIT;
14730 
14731 	 END IF; -- v_last_row
14732 
14733    END LOOP;
14734 
14735    fem_engines_pkg.tech_message (
14736           p_severity  => c_log_level_1
14737           ,p_module   => c_block||'.'||c_proc_name||'.Validation#1'
14738           ,p_msg_text => 'v_data_slc '||v_data_slc||
14739                          'v_member_table_name'||v_member_table_name||
14740 						 'No:of Invalid Records'|| l_count);
14741 
14742 
14743    CLOSE cv_get_invalid_gvscs;
14744 
14745 /*------------------------------------------------------------------------------
14746 VALIDATION#2:
14747 
14748             ***This is only for Cost Object Dimension ***
14749 
14750 1. The members of the Financial Element should have the value of
14751 COST_OBJECT_UNIT_FLAG attribute as 'Y' and  'DATA_TYPE_CODE' attribute
14752 as 'RATE"
14753 
14754 2.The Members of Ledger Dimension and Global_VS_Combo Column should be in sync.
14755 -------------------------------------------------------------------------------*/
14756 
14757 /*   IF p_dimension_varchar_label = 'COST_OBJECT' THEN
14758 
14759      FOR c_attr IN (
14760        SELECT a.attribute_id
14761        ,v.version_id
14762        ,a.attribute_varchar_label
14763        ,a.dimension_id
14764        FROM fem_dim_attributes_vl a
14765        ,fem_dim_attr_versions_vl v
14766        WHERE a.attribute_id = v.attribute_id
14767        AND v.default_version_flag = 'Y'
14768        AND (
14769        (a.attribute_varchar_label IN ('COST_OBJECT_UNIT_FLAG','DATA_TYPE_CODE')
14770         AND a.dimension_id = 12) -- Financial Element
14771        OR
14772        (a.attribute_varchar_label IN ('GLOBAL_VS_COMBO')
14773         AND a.dimension_id = 7) -- Ledger
14774        )
14775        AND v.default_version_flag = 'Y' )
14776        LOOP
14777          IF c_attr.dimension_id = 12 THEN -- Financial Element
14778 
14779 		   IF c_attr.attribute_varchar_label = 'COST_OBJECT_UNIT_FLAG' THEN
14780 
14781 		     l_count :=0 ;
14782 
14783 			 OPEN cv_get_invalid_fin_elems FOR
14784 			 ' SELECT b.rowid'||
14785 			 ' FROM fem_cost_objects_t b'||
14786 			 ' ,fem_fin_elems_attr a'||
14787 			 ' ,fem_fin_elems_vl m'||
14788 			 ' WHERE a.financial_elem_id = m.financial_elem_id'||
14789 			 ' AND m.financial_elem_display_code = b.financial_elem_display_code'||
14790 			 ' AND a.attribute_id = '||c_attr.attribute_id||
14791 			 ' AND a.version_id = '||c_attr.version_id||
14792 			 ' AND a.dim_attribute_varchar_member <> ''Y'''||
14793 			 ' AND b.status = ''LOAD'''||
14794 			 ' AND '||v_data_slc;
14795              LOOP
14796 
14797 			 EXIT WHEN cv_get_invalid_fin_elems%NOTFOUND;
14798 			 FETCH cv_get_invalid_fin_elems BULK COLLECT
14799 			 INTO  t_rowid
14800 			 LIMIT v_fetch_limit;
14801 
14802 	         -- local var which holds the no : of invalid values
14803 
14804              l_count := l_count + t_rowid.COUNT;
14805 
14806 			 v_last_row := t_rowid.COUNT;
14807 
14808 			 IF (v_last_row IS NOT NULL) THEN
14809 	           lv_status := 'INVALID_FIN_ELEMS_NOT_COUC_FLAG';
14810                FORALL i IN 1..v_last_row
14811                EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14812 			 END IF; -- v_last_row
14813 
14814              END LOOP;
14815 
14816              CLOSE cv_get_invalid_fin_elems;
14817 
14818              fem_engines_pkg.tech_message (
14819                         p_severity  => c_log_level_1
14820                         ,p_module => c_block||'.'||c_proc_name||'.Validation#2.1'
14821                         ,p_msg_text => 'v_data_slc '||v_data_slc||
14822                         'v_member_table_name'||v_member_table_name||
14823 						'No:of Invalid Records'|| l_count);
14824 
14825 		   ELSE  -- DATA_TYPE_CODE = 'RATE'
14826 
14827 		     l_count :=0 ;
14828 
14829              OPEN cv_get_invalid_fin_elems FOR
14830     		 ' SELECT b.rowid'||
14831              ' FROM fem_cost_objects_t b'||
14832              ' ,fem_fin_elems_attr a'||
14833              ' ,fem_fin_elems_vl m'||
14834              ' WHERE a.financial_elem_id = m.financial_elem_id'||
14835              ' AND m.financial_elem_display_code = b.financial_elem_display_code'||
14836              ' AND a.attribute_id = '||c_attr.attribute_id||
14837              ' AND a.version_id = '||c_attr.version_id||
14838              ' AND a.dim_attribute_varchar_member <> ''RATE'''||
14839              ' AND b.status = ''LOAD'''||
14840              ' AND '||v_data_slc;
14841 
14842 			 LOOP
14843 
14844 		     EXIT WHEN cv_get_invalid_fin_elems%NOTFOUND;
14845              FETCH cv_get_invalid_fin_elems BULK COLLECT
14846 			 INTO t_rowid
14847 			 LIMIT v_fetch_limit;
14848 
14849 			 -- local var which holds the no : of invalid values
14850 
14851              l_count := l_count + t_rowid.COUNT;
14852 
14853              v_last_row := t_rowid.COUNT;
14854              IF (v_last_row IS NOT NULL) THEN
14855                lv_status := 'INVALID_FIN_ELEMS_NOT_RATE_DATA_TYPE';
14856                FORALL i IN 1..v_last_row
14857                  EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14858              END IF; -- v_last_row
14859 
14860 			 END LOOP;
14861 
14862              CLOSE cv_get_invalid_fin_elems;
14863 
14864              fem_engines_pkg.tech_message (
14865                         p_severity  => c_log_level_1
14866                         ,p_module => c_block||'.'||c_proc_name||'.Validation#2.2'
14867                         ,p_msg_text => 'v_data_slc '||v_data_slc||
14868                         'v_member_table_name'||v_member_table_name||
14869 						'No:of Invalid Records'|| l_count);
14870 
14871 		   END IF; -- attribute_varchar_label = 'COST_OBJECT_UNIT_FLAG'
14872 
14873          ELSE --- if the dimension_id = 7(ledger)
14874 
14875            l_count :=0 ;
14876 
14877            OPEN cv_get_invalid_ledgers FOR
14878            ' SELECT b.rowid'||
14879            ' FROM fem_cost_objects_t b'||
14880            ' WHERE NOT EXISTS ('||
14881            '  SELECT 1'||
14882            '  FROM fem_ledgers_b l'||
14883            '  ,fem_ledgers_attr a'||
14884            '  ,fem_global_vs_combos_b g'||
14885            '  WHERE l.ledger_display_code = b.ledger_display_code'||
14886            '  AND a.ledger_id = l.ledger_id'||
14887            '  AND a.attribute_id = '||c_attr.attribute_id||
14888            '  AND a.version_id = '||c_attr.version_id||
14889            '  AND a.dim_attribute_numeric_member = g.global_vs_combo_id'||
14890            '  AND g.global_vs_combo_display_code = b.global_vs_combo_display_code'||
14891            ' )'||
14892            ' AND status = ''LOAD'''||
14893            ' AND '||v_data_slc;
14894            LOOP
14895 
14896 		   EXIT WHEN cv_get_invalid_ledgers%NOTFOUND;
14897            FETCH cv_get_invalid_ledgers BULK COLLECT
14898 		   INTO  t_rowid
14899 		   LIMIT v_fetch_limit;
14900 
14901 		   -- local var which holds the no : of invalid values
14902 
14903 		   l_count := l_count + t_rowid.COUNT;
14904 
14905 		   v_last_row := t_rowid.COUNT;
14906 
14907            IF (v_last_row IS NOT NULL) THEN
14908              lv_status := 'INVALID_LEDGER_FOR_GVSC';
14909               FORALL i IN 1..v_last_row
14910                 EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14911            END IF; -- v_last_row
14912 
14913            END LOOP;
14914 
14915 		   CLOSE cv_get_invalid_ledgers;
14916 
14917 		   fem_engines_pkg.tech_message (
14918                        p_severity  => c_log_level_1
14919                        ,p_module=> c_block||'.'||c_proc_name||'.Validation#2.3'
14920                        ,p_msg_text => 'v_data_slc '||v_data_slc||
14921                        'v_member_table_name'||v_member_table_name||
14922 		        	   'No:of Invalid Records'|| l_count);
14923 
14924          END IF; -- dimension_id = 7(ledger)
14925 
14926          t_rowid.DELETE;
14927 
14928        END LOOP; -- c_attr
14929 
14930    END IF; --- p_dimension_varchar_label = 'COST_OBJECT'
14931 
14932    COMMIT;
14933 /*------------------------------------------------------------------------------
14934 VALIDATION#3:
14935 
14936 --This validation ensures that the strucutre of the composite
14937 --dimension flex field is in synch with the records of the interface table.
14938 --(ie) Those component dimensions defined as a part of FlexField should only
14939 --have the 'DISPLAY_CODE' values in the interface table.Other component
14940 --dimension's display code values should be null.Moreover the display code of
14941 --component dimension which is a part of Flex Field Definition should not be
14942 -- null(Inverse of the above scenario).
14943 
14944 ------------------------------------------------------------------------------*/
14945 
14946 /*  l_count := 0;
14947 
14948   FOR i IN 1..t_metadata.COUNT LOOP  -- Loop within the component dimensions
14949 
14950     IF (t_metadata(i).dimension_id <> -999) THEN
14951 
14952       OPEN cv_get_invalid_comp_dims FOR
14953       ' SELECT b.rowid '||
14954       ' FROM '||v_member_table_name||' b'||
14955       ' WHERE '||t_metadata(i).member_display_code_col||' is null'||
14956       ' AND status = ''LOAD'''||
14957       ' AND '||v_data_slc;
14958 
14959     ELSE
14960 
14961       OPEN cv_get_invalid_comp_dims FOR
14962 	  ' SELECT b.rowid '||
14963 	  ' FROM '||v_member_table_name||' b'||
14964 	  ' WHERE '||t_metadata(i).member_display_code_col||' is not null'||
14965 	  ' AND status = ''LOAD'''||
14966 	  ' AND '||v_data_slc;
14967 
14968     END IF;
14969 
14970     LOOP
14971       EXIT WHEN cv_get_invalid_comp_dims%NOTFOUND;
14972       FETCH cv_get_invalid_comp_dims BULK COLLECT
14973       INTO t_rowid
14974       LIMIT v_fetch_limit;
14975 
14976       -- local var which holds the no : of invalid values
14977 
14978       l_count := l_count + t_rowid.COUNT;
14979 
14980       v_last_row := t_rowid.COUNT;
14981 
14982       IF (v_last_row IS NOT NULL) THEN
14983 
14984         lv_status := 'INVALID_STR_'||t_metadata(i).member_display_code_col;
14985 
14986         FORALL i IN 1..v_last_row
14987           EXECUTE IMMEDIATE v_update_stmt USING lv_status,t_rowid(i);
14988           t_rowid.DELETE;
14989 
14990       END IF; -- v_last_row
14991 
14992     END LOOP; -- cursor
14993 
14994     CLOSE cv_get_invalid_comp_dims;
14995 
14996    -- END IF;
14997 
14998   END LOOP; -- FOR LOOP
14999 
15000   COMMIT;
15001 
15002   fem_engines_pkg.tech_message (
15003                   p_severity  => c_log_level_1
15004                   ,p_module=> c_block||'.'||c_proc_name||'.Validation#3'
15005                   ,p_msg_text => 'v_data_slc '||v_data_slc||
15006                   'v_member_table_name'||v_member_table_name||
15007 				  'No:of Invalid Records'|| l_count);
15008 
15009   ------------------------------------------------------------------------------
15010   -- end of Validation # 3
15011   ------------------------------------------------------------------------------
15012 
15013   ------------------------------------------------------------------------------
15014   -- Start processing Rows from Interface table.
15015   -- Open the cursor to get the rows from interface table
15016   ------------------------------------------------------------------------------
15017 
15018   OPEN cv_get_rows FOR v_select_stmt;
15019 
15020   LOOP
15021     EXIT WHEN cv_get_rows%NOTFOUND;
15022     IF p_dimension_varchar_label = 'COST_OBJECT' THEN
15023       FETCH cv_get_rows BULK COLLECT
15024 	  INTO    t_rowid,
15025               t_global_vs_combo_dc,
15026               t_fin_elem_dc,
15027               t_ledger_dc,
15028               t_product_dc,
15029               t_cctr_org_dc,
15030               t_customer_dc,
15031               t_channel_dc,
15032               t_project_dc,
15033               t_user_dim1_dc,
15034               t_user_dim2_dc,
15035               t_user_dim3_dc,
15036               t_user_dim4_dc,
15037               t_user_dim5_dc,
15038               t_user_dim6_dc,
15039               t_user_dim7_dc,
15040               t_user_dim8_dc,
15041               t_user_dim9_dc,
15042               t_user_dim10_dc,
15043               t_status
15044 	  LIMIT v_fetch_limit;
15045 
15046     ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
15047       FETCH cv_get_rows BULK COLLECT
15048 	  INTO    t_rowid,
15049               t_global_vs_combo_dc,
15050               t_task_dc,
15051               t_cctr_org_dc,
15052               t_customer_dc,
15053               t_channel_dc,
15054               t_product_dc,
15055               t_project_dc,
15056               t_user_dim1_dc,
15057               t_user_dim2_dc,
15058               t_user_dim3_dc,
15059               t_user_dim4_dc,
15060               t_user_dim5_dc,
15061               t_user_dim6_dc,
15062               t_user_dim7_dc,
15063               t_user_dim8_dc,
15064               t_user_dim9_dc,
15065               t_user_dim10_dc,
15066               t_status
15067 	  LIMIT v_fetch_limit;
15068 
15069     END IF; -- End of Fetch rows
15070 
15071     -- Get the no:of rows this fetch
15072 	v_mbr_last_row := t_status.COUNT;
15073 
15074     fem_engines_pkg.tech_message (
15075                   p_severity  => c_log_level_1
15076                   ,p_module=> c_block||'.'||c_proc_name||'.Validation#3'
15077                   ,p_msg_text => 'v_data_slc '||v_data_slc||
15078                   'v_member_table_name'||v_member_table_name||
15079 				  'No:of Invalid Records'|| l_count);
15080 
15081      /*  IF (x_rows_loaded IS NULL) THEN
15082            x_rows_loaded := 0;
15083         END IF;
15084 
15085         x_rows_loaded := x_rows_loaded + v_mbr_last_row; */
15086 
15087 
15088 /*------------------------------------------------------------------------------
15089 VALIDATION#4:
15090 -- The Member Ids of component dimension members are populated in the
15091 -- following piece of code.
15092 -- If the member is not present in the component dimension member table
15093 -- that row will be marked as invalid.
15094 ------------------------------------------------------------------------------*/
15095 
15096    -- Loop within the number of records in interface table
15097 /*	FOR j IN 1..v_mbr_last_row   LOOP
15098     -- Initialize the TABLE TYPE Varible
15099       t_channel_id(j)   := NULL;
15100       t_cctr_org_id(j)  := NULL;
15101       t_customer_id(j)  := NULL;
15102       t_fin_elem_id(j)  := NULL;
15103       t_ledger_id(j)    := NULL;
15104       t_product_id(j)   := NULL;
15105       t_project_id(j)   := NULL;
15106       t_task_id(j)      := NULL;
15107       t_user_dim1_id(j) := NULL;
15108       t_user_dim2_id(j) := NULL;
15109       t_user_dim3_id(j) := NULL;
15110       t_user_dim4_id(j) := NULL;
15111       t_user_dim5_id(j) := NULL;
15112       t_user_dim6_id(j) := NULL;
15113       t_user_dim7_id(j) := NULL;
15114       t_user_dim8_id(j) := NULL;
15115       t_user_dim9_id(j) := NULL;
15116       t_user_dim10_id(j):= NULL;
15117 
15118 	  t_global_vs_combo_id(j) := -1;
15119 
15120       FOR i IN 1..t_metadata.COUNT LOOP
15121 
15122         IF (t_metadata(i).dimension_id <> '-999') AND (t_status(j) = 'LOAD')THEN
15123 
15124 		  FOR c_value_set IN (
15125             SELECT g.dimension_id
15126 			       ,g.value_set_id
15127                    ,g.global_vs_combo_id
15128             FROM FEM_GLOBAL_VS_COMBO_DEFS g,
15129                  FEM_GLOBAL_VS_COMBOS_b m
15130             WHERE g.global_vs_combo_id = m.global_vs_combo_id
15131             AND g.dimension_id = t_metadata(i).dimension_id
15132             AND m.global_vs_combo_display_code =  t_global_vs_combo_dc(j)
15133             ORDER BY 1)
15134           LOOP
15135 
15136           t_global_vs_combo_id(j) := c_value_set.global_vs_combo_id;
15137 
15138 		  --Ledger is not handled here as it is non VSR Dimension
15139 
15140           CASE t_metadata(i).member_display_code_col
15141 
15142           WHEN 'FINANCIAL_ELEM_DISPLAY_CODE' THEN
15143 
15144 				BEGIN
15145                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15146                           INTO  t_fin_elem_id(j)
15147                           USING  t_fin_elem_dc(j),c_value_set.value_set_id;
15148 
15149                 EXCEPTION
15150                   WHEN no_data_found THEN
15151                     t_status(j) := 'INAVLID_FIN_ELEM';
15152                 END;
15153 
15154           WHEN 'TASK_DISPLAY_CODE' THEN
15155 
15156 				BEGIN
15157                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15158                             INTO  t_task_id(j)
15159                             USING t_task_dc(j),c_value_set.value_set_id;
15160 
15161                 EXCEPTION
15162                   WHEN no_data_found THEN
15163                     t_status(j) := 'INAVLID_TASK';
15164                 END;
15165 
15166           WHEN 'CHANNEL_DISPLAY_CODE' THEN
15167 
15168  				BEGIN
15169                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15170                           INTO  t_channel_id(j)
15171                           USING t_channel_dc(j), c_value_set.value_set_id;
15172 
15173                 EXCEPTION
15174                   WHEN no_data_found THEN
15175                     t_status(j) := 'INAVLID_CHANNEL';
15176                 END;
15177 
15178           WHEN 'CCTR_ORG_DISPLAY_CODE' THEN
15179 
15180 				BEGIN
15181                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15182                           INTO  t_cctr_org_id(j)
15183                           USING  t_cctr_org_dc(j),c_value_set.value_set_id;
15184 
15185                 EXCEPTION
15186                   WHEN no_data_found THEN
15187                     t_status(j) := 'INAVLID_CCTR_ORG';
15188                 END;
15189 
15190           WHEN 'CUSTOMER_DISPLAY_CODE' THEN
15191 
15192 				BEGIN
15193                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15194                           INTO  t_customer_id(j)
15195                           USING t_customer_dc(j),c_value_set.value_set_id;
15196 
15197                 EXCEPTION
15198                   WHEN no_data_found THEN
15199                     t_status(j) := 'INAVLID_CUSTOMER';
15200                 END;
15201 
15202           WHEN 'PRODUCT_DISPLAY_CODE' THEN
15203 
15204 				BEGIN
15205                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15206                          INTO  t_product_id(j)
15207                          USING t_product_dc(j),c_value_set.value_set_id;
15208 
15209                 EXCEPTION
15210                   WHEN no_data_found THEN
15211                    t_status(j) := 'INAVLID_PRODUCT';
15212                 END;
15213 
15214           WHEN 'PROJECT_DISPLAY_CODE' THEN
15215 
15216 				BEGIN
15217                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15218                            INTO  t_project_id(j)
15219                            USING t_project_dc(j),c_value_set.value_set_id;
15220 
15221                 EXCEPTION
15222                   WHEN no_data_found THEN
15223                     t_status(j) := 'INAVLID_PROJECT';
15224                 END;
15225 
15226           WHEN 'USER_DIM1_DISPLAY_CODE' THEN
15227 
15228 				BEGIN
15229                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15230                           INTO  t_user_dim1_id(j)
15231                           USING t_user_dim1_dc(j),c_value_set.value_set_id;
15232 
15233                 EXCEPTION
15234                   WHEN no_data_found THEN
15235                     t_status(j) := 'INAVLID_USER_DIM1';
15236                 END;
15237 
15238           WHEN 'USER_DIM2_DISPLAY_CODE' THEN
15239 
15240 				BEGIN
15241                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15242                           INTO  t_user_dim2_id(j)
15243                           USING t_user_dim2_dc(j),c_value_set.value_set_id;
15244 
15245                 EXCEPTION
15246                   WHEN no_data_found THEN
15247                     t_status(j) := 'INAVLID_USER_DIM2';
15248                 END;
15249 
15250           WHEN 'USER_DIM3_DISPLAY_CODE' THEN
15251 
15252 				BEGIN
15253                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15254                           INTO  t_user_dim3_id(j)
15255                           USING t_user_dim3_dc(j),c_value_set.value_set_id;
15256 
15257                 EXCEPTION
15258                   WHEN no_data_found THEN
15259                     t_status(j) := 'INAVLID_USER_DIM3';
15260                 END;
15261 
15262           WHEN 'USER_DIM4_DISPLAY_CODE' THEN
15263 
15264 				BEGIN
15265                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15266                           INTO  t_user_dim4_id(j)
15267                           USING t_user_dim4_dc(j),c_value_set.value_set_id;
15268 
15269                 EXCEPTION
15270                   WHEN no_data_found THEN
15271                     t_status(j) := 'INAVLID_USER_DIM4';
15272                 END;
15273 
15274           WHEN 'USER_DIM5_DISPLAY_CODE' THEN
15275 
15276 				BEGIN
15277                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15278                           INTO  t_user_dim5_id(j)
15279                           USING t_user_dim5_dc(j),c_value_set.value_set_id;
15280 
15281                 EXCEPTION
15282                   WHEN no_data_found THEN
15283                     t_status(j) := 'INAVLID_USER_DIM5';
15284                 END;
15285 
15286           WHEN 'USER_DIM6_DISPLAY_CODE' THEN
15287 
15288 				BEGIN
15289                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15290                           INTO  t_user_dim6_id(j)
15291                           USING t_user_dim6_dc(j),c_value_set.value_set_id;
15292 
15293                 EXCEPTION
15294                   WHEN no_data_found THEN
15295                     t_status(j) := 'INAVLID_USER_DIM6';
15296                 END;
15297 
15298           WHEN 'USER_DIM7_DISPLAY_CODE' THEN
15299 
15300 				BEGIN
15301                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15302                           INTO  t_user_dim7_id(j)
15303                           USING t_user_dim7_dc(j),c_value_set.value_set_id;
15304 
15305                 EXCEPTION
15306                   WHEN no_data_found THEN
15307                     t_status(j) := 'INAVLID_USER_DIM7';
15308                 END;
15309 
15310           WHEN 'USER_DIM8_DISPLAY_CODE' THEN
15311 
15312 				BEGIN
15313                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15314                           INTO  t_user_dim8_id(j)
15315                           USING t_user_dim8_dc(j),c_value_set.value_set_id;
15316 
15317                 EXCEPTION
15318                   WHEN no_data_found THEN
15319                     t_status(j) := 'INAVLID_USER_DIM8';
15320                 END;
15321 
15322           WHEN 'USER_DIM9_DISPLAY_CODE' THEN
15323 
15324 				BEGIN
15325                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15326                           INTO  t_user_dim9_id(j)
15327                           USING t_user_dim9_dc(j),c_value_set.value_set_id;
15328 
15329                 EXCEPTION
15330                   WHEN no_data_found THEN
15331                     t_status(j) := 'INAVLID_USER_DIM9';
15332                 END;
15333 
15334           WHEN 'USER_DIM10_DISPLAY_CODE' THEN
15335 
15336 				BEGIN
15337                   EXECUTE IMMEDIATE t_metadata(i).member_sql
15338                           INTO  t_user_dim10_id(j)
15339                           USING t_user_dim10_dc(j),c_value_set.value_set_id;
15340 
15341                 EXCEPTION
15342                   WHEN no_data_found THEN
15343                     t_status(j) := 'INAVLID_USER_DIM10';
15344                 END;
15345 
15346           ELSE NULL;
15347 
15348           END CASE;
15349 
15350           END LOOP; -- c_value_Set
15351 
15352 
15353 
15354          /* IF (t_status(j) <> 'LOAD') THEN
15355             x_rows_rejected := x_rows_rejected + 1;
15356           END IF;*/
15357 
15358         -- This piece of code is not needed as this validation is done already
15359        /* ELSIF p_dimension_varchar_label = 'COST_OBJECT'
15360               AND t_metadata(i).member_display_code_col = 'LEDGER_DISPLAY_CODE'
15361               AND t_status(j) = 'LOAD' THEN
15362 
15363           BEGIN
15364            /* SELECT ledger_id
15365 			INTO t_ledger_id(j)
15366 			FROM fem_ledgers_vl
15367 		    WHERE ledger_display_code = t_ledger_dc(j);
15368 
15369 		     EXECUTE IMMEDIATE t_metadata(i).member_sql
15370                           INTO  t_ledger_id(j)
15371                           USING t_ledger_dc(j);
15372           EXCEPTION
15373             WHEN no_data_found THEN
15374               t_status(j) := 'INAVLID_LEDGER';
15375           END;*/
15376 
15377 /*        END IF; -- if dim_id <> -999
15378 
15379 
15380       END LOOP; --1..17(i)
15381 
15382       --------------------------------------------------------------------------
15383       -- Initialize UOM_CODE column for cost objects
15384       --------------------------------------------------------------------------
15385 
15386       IF p_dimension_varchar_label = 'COST_OBJECT' THEN
15387       --we can use FEM_DIM_UTILS_PVT.Get_UOM_Code as well.
15388         t_uom_code(j) := 'Ea';
15389 
15390         IF t_product_id(j) IS NOT NULL THEN
15391           BEGIN
15392             SELECT prod.dim_attribute_varchar_member AS uom_code
15393             INTO   t_uom_code(j)
15394             FROM   fem_products_attr prod,
15395                    fem_dim_attributes_b attr,
15396                    fem_dim_attr_versions_vl ver
15397             WHERE  prod.product_id = t_product_id(j)
15398 				   AND  prod.attribute_id = attr.attribute_id
15399 				   AND  prod.version_id = ver.version_id
15400 				   AND  attr.attribute_varchar_label = 'PRODUCT_UOM'
15401 				   AND  ver.attribute_id = attr.attribute_id
15402 				   AND  ver.default_version_flag = 'Y';
15403           EXCEPTION
15404             WHEN no_data_found THEN
15405               t_uom_code(j) := 'Ea';
15406           END;
15407         END IF;  -- UOM code
15408 
15409       END IF;  -- Cost Object
15410 
15411 	END LOOP; -- 1...v_member_last_row.(j)
15412 
15413 	fem_engines_pkg.tech_message (
15414                   p_severity  => c_log_level_1
15415                   ,p_module=> c_block||'.'||c_proc_name||'.Validation#4 - End');
15416 
15417 
15418 
15419 	----------------------------------------------------------------------------
15420     -- Get the concatenated display code
15421     -----------------------------------------------------------------------------
15422 
15423      Get_Display_Codes(p_dimension_varchar_label, p_structure_id);
15424 
15425    ----------------------------------------------------------------------------
15426     -- VALIDATION#5
15427     -- check for existence of unique member (eliminate unique records in
15428     -- set of records selected for insertion)
15429 	-- (ie) The following combination must be unique
15430 	--  Display Code + GVSC id
15431     -----------------------------------------------------------------------------
15432 
15433     FOR i IN 1..v_mbr_last_row LOOP
15434       FOR j IN (i+1) .. v_mbr_last_row LOOP
15435         IF  t_display_code(i) =  t_display_code(j)
15436 		              AND t_global_vs_combo_id(i) = t_global_vs_combo_id(j) THEN
15437           t_status(i) := 'MEMBER_EXISTS';
15438         END IF;
15439       END LOOP;
15440     END LOOP;
15441 
15442 
15443     fem_engines_pkg.tech_message (
15444                   p_severity  => c_log_level_1
15445                   ,p_module=> c_block||'.'||c_proc_name||'.Validation#5 - End');
15446 
15447     ----------------------------------------------------------------------------
15448     -- VALIDATION#6
15449     -- Check for uniqueness of records in the interface table and
15450     -- Composite Dimension member table
15451     ----------------------------------------------------------------------------
15452 
15453     FOR i IN 1..v_mbr_last_row LOOP
15454       IF t_status(i) = 'LOAD' THEN
15455 
15456 	    FEM_DIM_UTILS_PVT.Check_Unique_Member( p_api_version => 1.0,
15457                         p_return_status => v_return_status,
15458                         p_msg_count => v_msg_count,
15459                         p_msg_data => v_msg_data,
15460                         p_comp_dim_flag => 'Y',
15461                         p_member_name => NULL,
15462                         p_member_display_code => t_display_code(i),
15463                         p_dimension_varchar_label => p_dimension_varchar_label,
15464                         p_value_set_id => NULL,
15465                         p_global_vs_combo_id => t_global_vs_combo_id(i));
15466 
15467 	    IF v_return_status =  FND_API.G_RET_STS_ERROR THEN
15468 	      t_status(i) := 'MEMBER_EXISTS';
15469 	    END IF;
15470       END IF;
15471     END LOOP;
15472 
15473 
15474     fem_engines_pkg.tech_message (
15475                   p_severity  => c_log_level_1
15476                   ,p_module=> c_block||'.'||c_proc_name||'.Validation#6 - End');
15477 
15478     ----------------------------------------------------------------------------
15479     -- Insert the valid record into composite dimension member table
15480     ----------------------------------------------------------------------------
15481 
15482     IF p_dimension_varchar_label = 'COST_OBJECT' THEN
15483       FORALL i IN 1..v_mbr_last_row
15484         EXECUTE IMMEDIATE v_insert_cost_stmt
15485         USING t_display_code(i),
15486               'N',
15487               sysdate,
15488               sysdate,
15489               p_structure_id,
15490               t_global_vs_combo_id(i),
15491               t_uom_code(i),
15492               t_fin_elem_id(i),
15493               t_ledger_id(i),
15494               t_product_id(i),
15495               t_cctr_org_id(i),
15496               t_customer_id(i),
15497               t_channel_id(i),
15498               t_project_id(i),
15499               t_user_dim1_id(i),
15500               t_user_dim2_id(i),
15501               t_user_dim3_id(i),
15502               t_user_dim4_id(i),
15503               t_user_dim5_id(i),
15504               t_user_dim6_id(i),
15505               t_user_dim7_id(i),
15506               t_user_dim8_id(i),
15507               t_user_dim9_id(i),
15508               t_user_dim10_id(i),
15509               t_fin_elem_dc(i),
15510               t_ledger_dc(i),
15511               t_product_dc(i),
15512               t_cctr_org_dc(i),
15513               t_customer_dc(i),
15514               t_channel_dc(i),
15515               t_project_dc(i),
15516               t_user_dim1_dc(i),
15517               t_user_dim2_dc(i),
15518               t_user_dim3_dc(i),
15519               t_user_dim4_dc(i),
15520               t_user_dim5_dc(i),
15521               t_user_dim6_dc(i),
15522               t_user_dim7_dc(i),
15523               t_user_dim8_dc(i),
15524               t_user_dim9_dc(i),
15525               t_user_dim10_dc(i),
15526               '',
15527               '',
15528               '',
15529               '',
15530               '',
15531               '',
15532               '',
15533               '',
15534               '',
15535               '',
15536               '',
15537               '',
15538               '',
15539               sysdate,
15540               v_CREATED_BY,
15541               v_LAST_UPDATED_BY,
15542               sysdate,
15543               v_LAST_UPDATE_LOGIN,
15544               1,
15545               'Y',
15546               'N',
15547               'N',
15548               t_status(i);
15549 
15550     ELSIF p_dimension_varchar_label = 'ACTIVITY' THEN
15551       FORALL i IN 1..v_mbr_last_row
15552         EXECUTE IMMEDIATE v_insert_activity_stmt
15553         USING t_display_code(i),
15554               'N',
15555               sysdate,
15556               sysdate,
15557               p_structure_id,
15558               t_global_vs_combo_id(i),
15559               t_task_id(i),
15560               t_cctr_org_id(i),
15561               t_customer_id(i),
15562               t_channel_id(i),
15563               t_product_id(i),
15564               t_project_id(i),
15565               t_user_dim1_id(i),
15566               t_user_dim2_id(i),
15567               t_user_dim3_id(i),
15568               t_user_dim4_id(i),
15569               t_user_dim5_id(i),
15570               t_user_dim6_id(i),
15571               t_user_dim7_id(i),
15572               t_user_dim8_id(i),
15573               t_user_dim9_id(i),
15574               t_user_dim10_id(i),
15575               t_task_dc(i),
15576               t_cctr_org_dc(i),
15577               t_customer_dc(i),
15578               t_channel_dc(i),
15579               t_product_dc(i),
15580               t_project_dc(i),
15581               t_user_dim1_dc(i),
15582               t_user_dim2_dc(i),
15583               t_user_dim3_dc(i),
15584               t_user_dim4_dc(i),
15585               t_user_dim5_dc(i),
15586               t_user_dim6_dc(i),
15587               t_user_dim7_dc(i),
15588               t_user_dim8_dc(i),
15589               t_user_dim9_dc(i),
15590               t_user_dim10_dc(i),
15591               '',
15592               '',
15593               '',
15594               '',
15595               '',
15596               '',
15597               '',
15598               '',
15599               '',
15600               '',
15601               '',
15602               '',
15603               '',
15604               '',
15605               sysdate,
15606               v_CREATED_BY,
15607               v_LAST_UPDATED_BY,
15608               sysdate,
15609               v_LAST_UPDATE_LOGIN,
15610               1,
15611               'Y',
15612               'N',
15613               'N',
15614               t_status(i);
15615 
15616     END IF; -- Actvity / Cost Object
15617 
15618     ----------------------------------------------------------------------------
15619     --Populate the parameters for logging
15620     ----------------------------------------------------------------------------
15621     v_rows_loaded := v_rows_loaded + SQL%ROWCOUNT;
15622     v_rows_processed := v_rows_processed  + cv_get_rows%ROWCOUNT;
15623     v_rows_rejected := v_rows_rejected + (v_rows_processed - v_rows_loaded);
15624 
15625     ----------------------------------------------------------------------------
15626     -- This is common for both Activity and Cost Object
15627     -- Update the 'STATUS' column of Interface table
15628     -- Delete the  insertes rows from interface tables ((ie) STATUS = LOAD )
15629     ----------------------------------------------------------------------------
15630 
15631     FORALL i IN 1..v_mbr_last_row
15632       EXECUTE IMMEDIATE v_update_stmt USING t_status(i),t_rowid(i);
15633 
15634     FORALL i IN 1..v_mbr_last_row
15635       EXECUTE IMMEDIATE v_delete_stmt USING t_rowid(i),t_status(i);
15636 
15637   END LOOP; --- Bulk fetch from interface tables.
15638 
15639   CLOSE cv_get_rows;
15640 
15641 
15642   fem_engines_pkg.tech_message (
15643              p_severity  => c_log_level_4
15644 	         ,p_module   => c_block||'.'||c_proc_name
15645              ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
15646                             'Data Slice'||v_data_slc||
15647                             'Rows Processed'||v_rows_processed||
15648                             'Rows Loaded'||v_rows_loaded||
15649                             'Rows Rejected'||v_rows_rejected );
15650 
15651   --x_rows_rejected := get_mp_rows_rejected (x_rows_rejected)
15652 
15653   --------------------------
15654   -- Commit the transaaction
15655   --------------------------
15656 
15657    COMMIT;
15658 
15659    --------------------------------------------
15660    -- Delete Collections for Next Bulk Fetch --
15661    --------------------------------------------
15662 
15663    t_fin_elem_id.DELETE;
15664    t_ledger_id.DELETE;
15665    t_rowid.DELETE;
15666    t_global_vs_combo_id.DELETE;
15667    t_task_id.DELETE;
15668    t_cctr_org_id.DELETE;
15669    t_channel_id.DELETE;
15670    t_customer_id.DELETE;
15671    t_product_id.DELETE;
15672    t_project_id.DELETE;
15673    t_user_dim1_id.DELETE;
15674    t_user_dim2_id.DELETE;
15675    t_user_dim3_id.DELETE;
15676    t_user_dim4_id.DELETE;
15677    t_user_dim5_id.DELETE;
15678    t_user_dim6_id.DELETE;
15679    t_user_dim7_id.DELETE;
15680    t_user_dim8_id.DELETE;
15681    t_user_dim9_id.DELETE;
15682    t_user_dim10_id.DELETE;
15683    t_global_vs_combo_dc.DELETE;
15684    t_task_dc.DELETE;
15685    t_cctr_org_dc.DELETE;
15686    t_channel_dc.DELETE;
15687    t_customer_dc.DELETE;
15688    t_product_dc.DELETE;
15689    t_project_dc.DELETE;
15690    t_fin_elem_dc.DELETE;
15691    t_ledger_dc.DELETE;
15692    t_user_dim1_dc.DELETE;
15693    t_user_dim2_dc.DELETE;
15694    t_user_dim3_dc.DELETE;
15695    t_user_dim4_dc.DELETE;
15696    t_user_dim5_dc.DELETE;
15697    t_user_dim6_dc.DELETE;
15698    t_user_dim7_dc.DELETE;
15699    t_user_dim8_dc.DELETE;
15700    t_user_dim9_dc.DELETE;
15701    t_user_dim10_dc.DELETE;
15702    t_display_code.DELETE;
15703    t_status.DELETE;
15704 
15705    EXCEPTION
15706       WHEN e_terminate THEN
15707 
15708        fem_engines_pkg.tech_message(
15709 	             p_severity  => c_log_level_4
15710 	             ,p_module   => c_block||'.'||c_proc_name||'Exception');
15711 
15712        IF cv_get_rows%ISOPEN THEN
15713          CLOSE cv_get_rows;
15714        END IF;
15715 
15716        IF cv_get_invalid_fin_elems%ISOPEN THEN
15717          CLOSE cv_get_invalid_fin_elems;
15718        END IF;
15719 
15720        IF cv_get_invalid_ledgers%ISOPEN THEN
15721          CLOSE cv_get_invalid_ledgers;
15722        END IF;
15723 
15724        IF cv_get_invalid_gvscs%ISOPEN THEN
15725          CLOSE cv_get_invalid_gvscs;
15726        END IF;
15727 
15728        IF cv_get_invalid_comp_dims%ISOPEN THEN
15729          CLOSE cv_get_invalid_comp_dims;
15730        END IF;
15731 
15732 	   x_status := 2;
15733 	   x_message := 'INCOMPLETE:EXCEPTION';
15734 
15735        RAISE e_main_terminate;
15736 
15737      WHEN OTHERS THEN
15738        fem_engines_pkg.tech_message (
15739              p_severity  => c_log_level_4
15740 	         ,p_module   => c_block||'.'||c_proc_name||'.Exception'
15741              ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
15742 							'Code'||SQLCODE||'Err'||SQLERRM);
15743 
15744        IF cv_get_rows%ISOPEN THEN
15745          CLOSE cv_get_rows;
15746        END IF;
15747 
15748        IF cv_get_invalid_fin_elems%ISOPEN THEN
15749          CLOSE cv_get_invalid_fin_elems;
15750        END IF;
15751 
15752        IF cv_get_invalid_ledgers%ISOPEN THEN
15753          CLOSE cv_get_invalid_ledgers;
15754        END IF;
15755 
15756        IF cv_get_invalid_gvscs%ISOPEN THEN
15757          CLOSE cv_get_invalid_gvscs;
15758        END IF;
15759 
15760        IF cv_get_invalid_comp_dims%ISOPEN THEN
15761          CLOSE cv_get_invalid_comp_dims;
15762        END IF;
15763 
15764 	   x_status := 2;
15765 	   x_message := 'INCOMPLETE:EXCEPTION';
15766 
15767        RAISE e_main_terminate;
15768 
15769    END process_rows;
15770 
15771 
15772 /*===========================================================================+
15773  | PROCEDURE
15774  |                 Load Dimension
15775  |
15776  | DESCRIPTION
15777  |                 Main engine procedure for loading dimension members
15778  |                 and attribute assignments into FEM
15779  |
15780  |
15781  |
15782  | SCOPE - PUBLIC
15783  |
15784  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
15785  |
15786  | ARGUMENTS  : IN:
15787  |                p_dimension_varchar_label (identifies the Dimension being loaded)
15788  |
15789  |              OUT:
15790  |
15791  |              IN/ OUT:
15792  |
15793  | RETURNS    : NONE
15794  |
15795  | NOTES
15796  |
15797  |    The Load_Dimension procedure performs the following:
15798  |       1)  Engine_Master_Prep - gets the metadata for the dimension
15799 
15800  |       2)  Determines the Source System Codes for the load
15801  |       3)  Load Dimension Grps (of that dimension) -
15802  |              Pre-validation - identifies and updates bad records
15803  |              New Members - creates new dimension groups
15804  |              TL Update - updates the name/desc of groups
15805  |              Base Update - updates base properties of the groups
15806  |        4)  Load Dimension Members
15807  |              Pre-validation - identifies and updates bad records
15808  |              New Members - creates new dim members and their req. attr assignments
15809  |              TL Update - updates name/desc of members
15810  |              Base Update - updates base properties of members
15811  |              Pre-valid Attr - identifies bad optional attr records
15812  |              Attr Update - loads new optional attr assignments and updates existing
15813  |                  assignments
15814  |        5)  Engine_Master_Post - post error counts and PL status
15815  |
15816  |   SPECIAL NOTE:  The x_rows_loaded output variable is only populated if a
15817  |                  new member is created.  It does not represent the number of
15818  |                  rows loaded.  Rather, it is just serving as a flag to indicate
15819  |                  that at least one new member was created.  The other procedures
15820  |                  such as TL_UPDATE, BASE_UPDATE and ATTR_ASSIGN_UPDATE do not
15821  |                  populate this output value.
15822  |
15823  |
15824  |
15825  | MODIFICATION HISTORY
15826  |  Rob Flippo  21-OCT-03  Created
15827  |  Rob Flippo  08-SEP-04  Added condition on the MP Master return status so
15828  |                         that if no data slices found on Pre Validation, the
15829  |                         loader continues rather than terminating
15830  |  sshanmug    28-APR-05  Added Logic for Composite_dimension_loader
15831  |  Rob Flippo  31-MAY-05  Bug#3923485  Removed p_date_format_mask input parm
15832  |                         now using ICX: Date Format Mask profile option
15833  |  navekuma   26-APR-06  Bug#4736810. Added the call to get_mp_rows_rejected
15834  |                        after the call to MP engine for composite dimensions.
15835  +===========================================================================*/
15836 
15837 PROCEDURE Load_Dimension (
15838   x_rows_rejected_accum        OUT NOCOPY NUMBER
15839   ,x_rows_to_load               OUT NOCOPY NUMBER
15840   ,p_execution_mode             IN       VARCHAR2
15841   ,p_object_id                 IN       NUMBER
15842   ,p_object_definition_id       IN       NUMBER
15843   ,p_dimension_varchar_label    IN       VARCHAR2
15844   ,p_master_request_id          IN       NUMBER
15845 )
15846 
15847 IS
15848 
15849 -----------------------
15850 -- Declare constants --
15851 -----------------------
15852    c_proc_name                       VARCHAR2(30) := 'load_dimension_members';
15853 
15854    -- Constants for Dimension Group loading
15855    c_dimgrp_tbl_handler              VARCHAR2(30) := 'FEM_DIMENSION_GRPS_PKG';
15856    c_dimgrp_b_t_table                VARCHAR2(30) := 'FEM_DIMENSION_GRPS_B_T';
15857    c_dimgrp_tl_t_table               VARCHAR2(30) := 'FEM_DIMENSION_GRPS_TL_T';
15858    c_dimgrp_b_table                  VARCHAR2(30) := 'FEM_DIMENSION_GRPS_B';
15859    c_dimgrp_tl_table                 VARCHAR2(30) := 'FEM_DIMENSION_GRPS_TL';
15860    c_dimgrp_label                    VARCHAR2(30) := 'DIMENSION_GROUP';
15861    c_dimgrp_dc_col                   VARCHAR2(30) := 'DIMENSION_GROUP_DISPLAY_CODE';
15862    c_dimgrp_col                      VARCHAR2(30) := 'DIMENSION_GROUP_ID';
15863    c_dimgrp_name_col                 VARCHAR2(30) := 'DIMENSION_GROUP_NAME';
15864    c_dimgrp_desc_col                 VARCHAR2(30) := 'DESCRIPTION';
15865 -----------------------
15866 -- Declare variables --
15867 -----------------------
15868 
15869 ----------------------------------------------------------
15870 --  Variables for Object ID and Proces Locks Processing architecture
15871    v_object_id       NUMBER;
15872    v_object_definition_id NUMBER;
15873    v_num_msg         NUMBER; -- number of error messages on the stack
15874    v_completion_status VARCHAR2(30); -- return code for PL registration
15875                                  -- values are 'SUCCESS' and 'ERROR'
15876    v_eng_master_prep_status VARCHAR2(30) := 'SUCCESS';  -- return code for Engine Master Prep
15877                                                         -- values are 'SUCCESS' and 'ERROR'
15878 
15879    v_mp_prg_status VARCHAR2(30);
15880    v_mp_exception_code VARCHAR2(240);
15881    i                 NUMBER; -- counting variable for loops
15882 
15883    v_date_format_mask VARCHAR2(100);  -- result from FEM_INTF_ATTR_DATE_FORMAT_MASK for site
15884 
15885 -- Common abbreviations:  dc = display_code
15886 --                        _t = interface table
15887 --                        mbr = member
15888 --                        attr = attribute
15889 --                        source = interface table
15890 --                        target = FEM table
15891 
15892 -- Variable designating whether we are loading Dimension Groups or Members
15893    v_load_type                       VARCHAR2(30);
15894 
15895 -- These variables are retrieved as part of GET_DIMENSION_INFO
15896    v_dimension_id                    NUMBER;
15897    v_get_dim_status                  VARCHAR2(30);
15898    v_target_b_table                  VARCHAR2(30);
15899    v_target_tl_table                 VARCHAR2(30);
15900    v_target_attr_table               VARCHAR2(30);
15901    v_source_b_table                  VARCHAR2(30);
15902    v_source_tl_table                 VARCHAR2(30);
15903    v_source_attr_table               VARCHAR2(30);
15904    v_member_col                      VARCHAR2(30);
15905    v_member_dc_col                   VARCHAR2(30);
15906    v_member_t_dc_col                 VARCHAR2(30);
15907    v_member_name_col                 VARCHAR2(30);
15908    v_member_t_name_col               VARCHAR2(30);
15909    v_member_description_col          VARCHAR2(30);
15910    v_value_set_required_flag         VARCHAR2(1);
15911    v_simple_dimension_flag           VARCHAR2(1);
15912    v_shared_dimension_flag           VARCHAR2(1);
15913    v_hier_table_name                 VARCHAR2(30);
15914    v_hier_dimension_flag             VARCHAR2(1);
15915    v_member_id_method_code           VARCHAR2(30);
15916    v_user_defined_flag               VARCHAR2(1);
15917    v_table_handler_name              VARCHAR2(30);
15918 
15919 -- These variables are needed for Composite Dimension Loader
15920    v_composite_dimension_flag        VARCHAR2(1);
15921    v_structure_id                    NUMBER;
15922 
15923 -- variables storing temporary state information
15924    v_attr_success                    VARCHAR2(1);
15925    v_temp_member                     VARCHAR2(100);
15926    v_status                          NUMBER;
15927    v_message                         VARCHAR2(4000);
15928    v_rows_processed                  NUMBER :=0;
15929    v_rows_processed_accum            NUMBER :=0; -- running total
15930    v_rows_loaded                     NUMBER :=0; -- used as a placeholder for when
15931                                                  -- calling get_mp_rows_rejected;  The value
15932                                                  -- is only meaningful for identifying if
15933                                                  -- >0 new members were created - otherwise
15934                                                  -- it is ignored
15935    v_rows_loaded_accum               NUMBER :=0; -- running total
15936    v_rows_rejected                   NUMBER :=0;
15937    v_rows_rejected_accum             NUMBER :=0; -- running total
15938 
15939 -- Dynamic SQL statement variables
15940    x_src_sys_select_stmt             VARCHAR2(4000);
15941 
15942 -- Count variables for manipulating the member and attribute arrays
15943    v_src_sys_last_row                NUMBER;
15944 
15945 -- STATUS clause for all WHERE conditions
15946    v_exec_mode_clause VARCHAR2(100);
15947 
15948 ---------------------
15949 -- Declare cursors --
15950 ---------------------
15951    cv_get_src_sys        cv_curs;  -- Retreives Source System Codes for the load
15952 
15953 
15954 /**************************************************************************
15955 *                                                                         *
15956 *                          Load Dimension                                 *
15957 *                          Execution Block                                *
15958 *                                                                         *
15959 **************************************************************************/
15960 
15961 BEGIN
15962    v_object_definition_id := p_object_definition_id;
15963    IF v_object_definition_id IS NULL THEN
15964       v_object_definition_id := 1200;
15965    END IF;
15966 
15967    -- initialize the dimension group error count
15968    gv_dimgrp_rows_rejected := 0;
15969 
15970    -----------------------------------------------------------------------------
15971    -- populate the composite dimension information
15972    -- Needed for composite dimension loader
15973    -----------------------------------------------------------------------------
15974 
15975    IF p_dimension_varchar_label IN ('ACTIVITY','COST_OBJECT') THEN
15976      BEGIN
15977 
15978        SELECT composite_dimension_flag,id_flex_num
15979        INTO  v_composite_dimension_flag,v_structure_id
15980        FROM Fem_XDim_Dimensions_VL
15981        WHERE dimension_varchar_label = p_dimension_varchar_label;
15982 
15983      EXCEPTION
15984 
15985        WHEN no_data_found THEN
15986 	     fem_engines_pkg.tech_message (
15987              p_severity  => c_log_level_4
15988 	         ,p_module   => c_block||'.'||c_proc_name||'.Comp Dim Params not found'
15989              ,p_msg_text => 'Dimension'||p_dimension_varchar_label||
15990 							'Code'||SQLCODE||'Err'||SQLERRM);
15991 	     RAISE e_main_terminate;
15992      END;
15993    END IF;
15994 
15995 
15996 
15997    FEM_ENGINES_PKG.TECH_MESSAGE
15998     (c_log_level_3,c_block||'.'||c_proc_name||'.Preparation','Get dimension information');
15999    FEM_ENGINES_PKG.TECH_MESSAGE
16000     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.p_dimension_varchar_label',p_dimension_varchar_label);
16001    FEM_ENGINES_PKG.TECH_MESSAGE
16002     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.c_user_id',c_user_id);
16003    FEM_ENGINES_PKG.TECH_MESSAGE
16004     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.v_obj_def_id',v_object_definition_id);
16005    FEM_ENGINES_PKG.TECH_MESSAGE
16006     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.p_object_id',p_object_id);
16007 
16008    Engine_Master_Prep (p_dimension_varchar_label
16009                       ,v_object_definition_id
16010                       ,p_execution_mode
16011                       ,v_dimension_id
16012                       ,v_target_b_table
16013                       ,v_target_tl_table
16014                       ,v_target_attr_table
16015                       ,v_source_b_table
16016                       ,v_source_tl_table
16017                       ,v_source_attr_table
16018                       ,v_member_col
16019                       ,v_member_dc_col
16020                       ,v_member_t_dc_col
16021                       ,v_member_name_col
16022                       ,v_member_t_name_col
16023                       ,v_member_description_col
16024                       ,v_value_set_required_flag
16025                       ,v_user_defined_flag
16026                       ,v_simple_dimension_flag
16027                       ,v_shared_dimension_flag
16028                       ,v_table_handler_name
16029                       ,v_composite_dimension_flag
16030                       ,v_structure_id
16031                       ,v_exec_mode_clause
16032                       ,v_eng_master_prep_status
16033                       ,v_hier_table_name
16034                       ,v_hier_dimension_flag
16035                       ,v_member_id_method_code
16036                       ,x_rows_to_load
16037                       ,v_date_format_mask
16038                       );
16039 
16040    IF v_eng_master_prep_status IN ('ERROR') THEN
16041       RAISE e_terminate;
16042    END IF;
16043 
16044    FEM_ENGINES_PKG.TECH_MESSAGE
16045     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.source_b_table ',v_source_b_table);
16046 
16047   ------------------------------------------------------------------------------
16048   --Composite Dimensions dont have _TL and _ATTR tables.
16049   ------------------------------------------------------------------------------
16050 
16051   IF v_composite_dimension_flag = 'N' THEN
16052    FEM_ENGINES_PKG.TECH_MESSAGE
16053     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.source_tl_table ',v_source_tl_table);
16054    FEM_ENGINES_PKG.TECH_MESSAGE
16055     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.source_attr_table ',v_source_attr_table);
16056   END IF;
16057 
16058 
16059    FEM_ENGINES_PKG.TECH_MESSAGE
16060     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.value_set_required_flag ',v_value_set_required_flag);
16061    FEM_ENGINES_PKG.TECH_MESSAGE
16062     (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.table handler ',v_table_handler_name);
16063 
16064    FEM_ENGINES_PKG.TECH_MESSAGE
16065     (c_log_level_1,c_block||'.'||c_proc_name||'.v_exec_mode_clause ',v_exec_mode_clause);
16066 
16067    FEM_ENGINES_PKG.TECH_MESSAGE
16068     (c_log_level_1,c_block||'.'||c_proc_name||'.v_date_format_mask ',v_date_format_mask);
16069 
16070   -- The following are not needed composite dimension
16071 
16072   IF v_composite_dimension_flag = 'N' THEN
16073 
16074       ------------------------------------------------------------------------------
16075       -- Preparation STEP:  Determing the Source System Codes in the load
16076       ------------------------------------------------------------------------------
16077       IF v_simple_dimension_flag = 'N' THEN
16078 
16079           FEM_ENGINES_PKG.TECH_MESSAGE
16080           (c_log_level_3,c_block||'.'||c_proc_name||
16081            '.Preparation STEP','Determing Source System Codes for the load');
16082          build_src_sys_select_stmt (p_dimension_varchar_label
16083                                    ,v_source_attr_table
16084                                    ,v_shared_dimension_flag
16085                                    ,x_src_sys_select_stmt);
16086          FEM_ENGINES_PKG.TECH_MESSAGE
16087           (c_log_level_1,c_block||'.'||c_proc_name||'.Preparation.src_sys_select_stmt',x_src_sys_select_stmt);
16088          OPEN cv_get_src_sys FOR x_src_sys_select_stmt;
16089          FETCH cv_get_src_sys BULK COLLECT INTO
16090                tg_src_system_dc;
16091             v_src_sys_last_row := tg_src_system_dc.LAST;
16092             FEM_ENGINES_PKG.TECH_MESSAGE
16093             (c_log_level_1,c_block||'.'||c_proc_name||'.Source_System_Step.v_src_sys_last_row'
16094             ,v_src_sys_last_row);
16095       END IF;  -- src system selection
16096 
16097       IF (v_hier_dimension_flag = 'Y') THEN
16098          ------------------------------------------------------------------------------
16099          -- Load Dimension Groups
16100          ------------------------------------------------------------------------------
16101          FEM_ENGINES_PKG.TECH_MESSAGE
16102           (c_log_level_3,c_block||'.'||c_proc_name||
16103            '.Dimension Groups','Starting the Dimension Group load section');
16104          v_load_type := 'DIMENSION_GROUP';
16105 
16106          ------------------------------------------------------------------------------
16107          -- Pre_Validation
16108          -- This step identifies new Dimension Groups missing TL records
16109          ------------------------------------------------------------------------------
16110       FEM_ENGINES_PKG.TECH_MESSAGE
16111        (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp Pre_Validation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16112 
16113          Pre_Validation (P_ENG_SQL => null
16114                         ,P_DATA_SLC => null
16115                         ,P_PROC_NUM => null
16116                         ,P_PARTITION_CODE => null
16117                         ,P_FETCH_LIMIT => null
16118                         ,P_LOAD_TYPE => v_load_type
16119                         ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16120                         ,P_DIMENSION_ID => v_dimension_id
16121                         ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16122                         ,P_SOURCE_TL_TABLE => c_dimgrp_tl_t_table
16123                         ,P_SOURCE_ATTR_TABLE => null
16124                         ,P_TARGET_B_TABLE => c_dimgrp_b_table
16125                         ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16126                         ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16127                         ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16128                         ,P_SIMPLE_DIMENSION_FLAG => 'Y'
16129                         ,P_SHARED_DIMENSION_FLAG => 'N'
16130                         ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16131                         ,P_MASTER_REQUEST_ID => p_master_request_id);
16132          FEM_ENGINES_PKG.TECH_MESSAGE
16133           (c_log_level_1,c_block||'.'||c_proc_name||
16134            '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16135 
16136          FEM_ENGINES_PKG.TECH_MESSAGE
16137           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp Pre_Valdation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16138 
16139 
16140          ------------------------------------------------------------------------------
16141          -- New Dimension Groups
16142          ------------------------------------------------------------------------------
16143       FEM_ENGINES_PKG.TECH_MESSAGE
16144        (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16145 
16146          New_Members (P_ENG_SQL => null
16147                      ,P_DATA_SLC => null
16148                      ,P_PROC_NUM => null
16149                      ,P_PARTITION_CODE => null
16150                      ,P_FETCH_LIMIT => null
16151                      ,P_LOAD_TYPE => v_load_type
16152                      ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16153                      ,P_DATE_FORMAT_MASK => v_date_format_mask
16154                      ,P_DIMENSION_ID => v_dimension_id
16155                      ,P_TARGET_B_TABLE => c_dimgrp_b_table
16156                      ,P_TARGET_TL_TABLE => c_dimgrp_tl_table
16157                      ,P_TARGET_ATTR_TABLE => null
16158                      ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16159                      ,P_SOURCE_TL_TABLE => c_dimgrp_tl_t_table
16160                      ,P_SOURCE_ATTR_TABLE => null
16161                      ,P_TABLE_HANDLER_NAME => c_dimgrp_tbl_handler
16162                      ,P_MEMBER_COL => c_dimgrp_col
16163                      ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16164                      ,P_MEMBER_NAME_COL => c_dimgrp_name_col
16165                      ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16166                      ,P_MEMBER_T_NAME_COL => c_dimgrp_name_col
16167                      ,P_MEMBER_DESCRIPTION_COL => c_dimgrp_desc_col
16168                      ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16169                      ,P_SIMPLE_DIMENSION_FLAG => 'Y'
16170                      ,P_SHARED_DIMENSION_FLAG => 'N'
16171                      ,P_HIER_DIMENSION_FLAG => 'N'
16172                      ,P_MEMBER_ID_METHOD_CODE => 'FUNCTION'
16173                      ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16174                      ,P_MASTER_REQUEST_ID => p_master_request_id);
16175          FEM_ENGINES_PKG.TECH_MESSAGE
16176           (c_log_level_1,c_block||'.'||c_proc_name||
16177            '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16178 
16179       FEM_ENGINES_PKG.TECH_MESSAGE
16180        (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16181 
16182          ------------------------------------------------------------------------------
16183          -- Update Name/Descriptions for existing Members
16184          ------------------------------------------------------------------------------
16185       FEM_ENGINES_PKG.TECH_MESSAGE
16186        (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16187 
16188          TL_Update (P_ENG_SQL => null
16189                    ,P_DATA_SLC => null
16190                    ,P_PROC_NUM => null
16191                    ,P_PARTITION_CODE => null
16192                    ,P_FETCH_LIMIT => null
16193                    ,P_LOAD_TYPE => v_load_type
16194                    ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16195                    ,P_DIMENSION_ID => v_dimension_id
16196                    ,P_TARGET_B_TABLE => c_dimgrp_b_table
16197                    ,P_TARGET_TL_TABLE => c_dimgrp_tl_table
16198                    ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16199                    ,P_SOURCE_TL_TABLE => c_dimgrp_tl_t_table
16200                    ,P_MEMBER_COL => c_dimgrp_col
16201                    ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16202                    ,P_MEMBER_NAME_COL => c_dimgrp_name_col
16203                    ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16204                    ,P_MEMBER_T_NAME_COL => c_dimgrp_name_col
16205                    ,P_MEMBER_DESCRIPTION_COL => c_dimgrp_desc_col
16206                    ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16207                    ,P_SIMPLE_DIMENSION_FLAG => 'Y'
16208                    ,P_SHARED_DIMENSION_FLAG => 'N'
16209                    ,P_HIER_DIMENSION_FLAG => 'N'
16210                    ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16211                    ,P_MASTER_REQUEST_ID => p_master_request_id);
16212 
16213          FEM_ENGINES_PKG.TECH_MESSAGE
16214           (c_log_level_1,c_block||'.'||c_proc_name||
16215            '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16216 
16217          FEM_ENGINES_PKG.TECH_MESSAGE
16218           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16219 
16220          ----------------------------------------------------------------------------------
16221          --  Base_Update
16222          ----------------------------------------------------------------------------------
16223          FEM_ENGINES_PKG.TECH_MESSAGE
16224           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Grp Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16225 
16226          Base_Update (P_ENG_SQL => null
16227                      ,P_DATA_SLC => null
16228                      ,P_PROC_NUM => null
16229                      ,P_PARTITION_CODE => null
16230                      ,P_FETCH_LIMIT => null
16231                      ,P_LOAD_TYPE => v_load_type
16232                      ,P_DIMENSION_VARCHAR_LABEL => p_dimension_varchar_label
16233                      ,P_SIMPLE_DIMENSION_FLAG => 'N'
16234                      ,P_SHARED_DIMENSION_FLAG => 'N'
16235                      ,P_DIMENSION_ID => v_dimension_id
16236                      ,P_VALUE_SET_REQUIRED_FLAG => 'N'
16237                      ,P_HIER_TABLE_NAME => null
16238                      ,P_HIER_DIMENSION_FLAG => 'N'
16239                      ,P_SOURCE_B_TABLE => c_dimgrp_b_t_table
16240                      ,P_TARGET_B_TABLE => c_dimgrp_b_table
16241                      ,P_MEMBER_DC_COL => c_dimgrp_dc_col
16242                      ,P_MEMBER_T_DC_COL => c_dimgrp_dc_col
16243                      ,P_MEMBER_COL => c_dimgrp_col
16244                      ,P_EXEC_MODE_CLAUSE => v_exec_mode_clause
16245                      ,P_MASTER_REQUEST_ID => p_master_request_id);
16246 
16247          FEM_ENGINES_PKG.TECH_MESSAGE
16248           (c_log_level_1,c_block||'.'||c_proc_name||
16249            '.gv_dimgrp_rows_rejected',gv_dimgrp_rows_rejected);
16250 
16251          FEM_ENGINES_PKG.TECH_MESSAGE
16252           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Grp Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16253 
16254       END IF; -- Dimension Group Processing only happens for v_hier_dimension_flag = 'Y'
16255          v_rows_rejected_accum :=  gv_dimgrp_rows_rejected;
16256          FEM_ENGINES_PKG.TECH_MESSAGE
16257           (c_log_level_1,c_block||'.'||c_proc_name||
16258            '.v_rows_rejected_accum',v_rows_rejected_accum);
16259 
16260       ------------------------------------------------------------------------------
16261       -- Load Dimension Members
16262       ------------------------------------------------------------------------------
16263        FEM_ENGINES_PKG.TECH_MESSAGE
16264        (c_log_level_3,c_block||'.'||c_proc_name||
16265         '.Dimension Members','Starting the Dimension Member load section');
16266 
16267       v_load_type := 'DIMENSION_MEMBER';
16268       ------------------------------------------------------------------------------
16269       -- Pre_Validation
16270       -- This step identifies new members missing TL records
16271       ------------------------------------------------------------------------------
16272 
16273          FEM_ENGINES_PKG.TECH_MESSAGE
16274           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Pre_Validation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16275 
16276          fem_multi_proc_pkg.MASTER
16277          (X_PRG_STAT => v_mp_prg_status
16278          ,X_EXCEPTION_CODE => v_mp_exception_code
16279          ,P_RULE_ID => p_object_id
16280          ,P_ENG_STEP => 'ALL'
16281          ,P_DATA_TABLE => v_source_b_table
16282          ,P_ENG_SQL => null
16283          ,P_TABLE_ALIAS => 'B'
16284          ,P_RUN_NAME => 'Pre_Validation'
16285          ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Pre_Validation'
16286          ,P_CONDITION => null
16287          ,P_FAILED_REQ_ID => null
16288          ,P_ARG1 => v_load_type
16289          ,P_ARG2 => p_dimension_varchar_label
16290          ,P_ARG3 => v_dimension_id
16291          ,P_ARG4 => v_source_b_table
16292          ,P_ARG5 => v_source_tl_table
16293          ,P_ARG6 => v_source_attr_table
16294          ,P_ARG7 => v_target_b_table
16295          ,P_ARG8 => v_member_t_dc_col
16296          ,P_ARG9 => v_member_dc_col
16297          ,P_ARG10 => v_value_set_required_flag
16298          ,P_ARG11 => v_simple_dimension_flag
16299          ,P_ARG12 => v_shared_dimension_flag
16300          ,P_ARG13 => v_exec_mode_clause
16301          ,P_ARG14 => p_master_request_id);
16302 
16303          FEM_ENGINES_PKG.TECH_MESSAGE
16304           (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_pgr_status',v_mp_prg_status);
16305          FEM_ENGINES_PKG.TECH_MESSAGE
16306           (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception_code',v_mp_exception_code);
16307 
16308          IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16309            IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16310               null;
16311            ELSE
16312               RAISE e_terminate;
16313            END IF;
16314          END IF;
16315 
16316          -- accumulate rejected row count
16317          get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16318          v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16319 
16320          FEM_ENGINES_PKG.TECH_MESSAGE
16321           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr Pre_Validation',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16322 
16323          FEM_ENGINES_PKG.TECH_MESSAGE
16324           (c_log_level_1,c_block||'.'||c_proc_name||
16325            '.v_rows_rejected_accum',v_rows_rejected_accum);
16326 
16327 
16328       ------------------------------------------------------------------------------
16329       -- New Dimension Members
16330       ------------------------------------------------------------------------------
16331 
16332          -- truncate the INTERIM tables in preparation for CALP processing
16333          IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16334             truncate_calp_interim;
16335          END IF;
16336 
16337          FEM_ENGINES_PKG.TECH_MESSAGE
16338           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16339 
16340 
16341          fem_multi_proc_pkg.MASTER
16342          (X_PRG_STAT => v_mp_prg_status
16343          ,X_EXCEPTION_CODE => v_mp_exception_code
16344          ,P_RULE_ID => p_object_id
16345          ,P_ENG_STEP => 'ALL'
16346          ,P_DATA_TABLE => v_source_b_table
16347          ,P_ENG_SQL => null
16348          ,P_TABLE_ALIAS => 'B'
16349          ,P_RUN_NAME => 'New_Members'
16350          ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.New_Members'
16351          ,P_CONDITION => null
16352          ,P_FAILED_REQ_ID => null
16353          ,P_ARG1 => v_load_type
16354          ,P_ARG2 => p_dimension_varchar_label
16355          ,P_ARG3 => v_date_format_mask
16356          ,P_ARG4 => v_dimension_id
16357          ,P_ARG5 => v_target_b_table
16358          ,P_ARG6 => v_target_tl_table
16359          ,P_ARG7 => v_target_attr_table
16360          ,P_ARG8 => v_source_b_table
16361          ,P_ARG9 => v_source_tl_table
16362          ,P_ARG10 => v_source_attr_table
16363          ,P_ARG11 => v_table_handler_name
16364          ,P_ARG12 => v_member_col
16365          ,P_ARG13 => v_member_dc_col
16366          ,P_ARG14 => v_member_name_col
16367          ,P_ARG15 => v_member_t_dc_col
16368          ,P_ARG16 => v_member_t_name_col
16369          ,P_ARG17 => v_member_description_col
16370          ,P_ARG18 => v_value_set_required_flag
16371          ,P_ARG19 => v_simple_dimension_flag
16372          ,P_ARG20 => v_shared_dimension_flag
16373          ,P_ARG21 => v_hier_dimension_flag
16374          ,P_ARG22 => v_member_id_method_code
16375          ,P_ARG23 => v_exec_mode_clause
16376          ,P_ARG24 => p_master_request_id
16377          );
16378          FEM_ENGINES_PKG.TECH_MESSAGE
16379           (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16380 
16381 
16382          IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16383            IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16384               null;
16385            ELSE
16386               RAISE e_terminate;
16387            END IF;
16388          END IF;
16389          -- accumulate rejected row count
16390          v_rows_loaded := 0;  -- initializing this variable so we can use it to
16391                               -- figure out if any new members were created
16392          get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16393          FEM_ENGINES_PKG.TECH_MESSAGE
16394           (c_log_level_1,c_block||'.'||c_proc_name||
16395            '.v_rows_loaded',v_rows_loaded);
16396 
16397          IF v_rows_loaded > 0 THEN
16398             raise_member_bus_event (p_dimension_varchar_label);
16399          END IF;
16400 
16401          v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16402          FEM_ENGINES_PKG.TECH_MESSAGE
16403           (c_log_level_1,c_block||'.'||c_proc_name||
16404            '.v_rows_rejected_accum',v_rows_rejected_accum);
16405          FEM_ENGINES_PKG.TECH_MESSAGE
16406           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr New_Members',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16407 
16408          FEM_ENGINES_PKG.TECH_MESSAGE
16409           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16410          --------------------------------------------------------------
16411          -- Perform the Date Overlap Check for CAL_PERIOD loads
16412          -- and move all valid new members into FEM
16413          IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16414             calp_date_overlap_check(v_rows_rejected
16415                                     ,'NEW_MEMBERS');
16416             v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16417 
16418             fem_multi_proc_pkg.MASTER
16419             (X_PRG_STAT => v_mp_prg_status
16420             ,X_EXCEPTION_CODE => v_mp_exception_code
16421             ,P_RULE_ID => p_object_id
16422             ,P_ENG_STEP => 'ALL'
16423             ,P_DATA_TABLE => 'FEM_CALP_INTERIM_T'
16424             ,P_ENG_SQL => null
16425             ,P_TABLE_ALIAS => 'B'
16426             ,P_RUN_NAME => 'Post_Cal_Periods'
16427             ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Post_Cal_Periods'
16428             ,P_CONDITION => null
16429             ,P_FAILED_REQ_ID => null
16430             ,P_ARG1 => 'NEW_MEMBERS'
16431             ,P_ARG2 => p_master_request_id);
16432 
16433             FEM_ENGINES_PKG.TECH_MESSAGE
16434              (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16435 
16436             IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16437               IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16438                  null;
16439               ELSE
16440                  RAISE e_terminate;
16441               END IF;
16442             END IF;
16443 
16444             -- accumulate rejected row count
16445             get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16446             v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16447             FEM_ENGINES_PKG.TECH_MESSAGE
16448              (c_log_level_1,c_block||'.'||c_proc_name||
16449               '.v_rows_rejected_accum',v_rows_rejected_accum);
16450 
16451             FEM_ENGINES_PKG.TECH_MESSAGE
16452              (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16453 
16454          END IF; -- overlap check for CAL_PERIOD load
16455          --------------------------------------------------------------
16456 
16457 
16458       ----------------------------------------------------------------------------------
16459       --  Base_Update
16460       ----------------------------------------------------------------------------------
16461 
16462 
16463          FEM_ENGINES_PKG.TECH_MESSAGE
16464           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16465 
16466             fem_multi_proc_pkg.MASTER
16467             (X_PRG_STAT => v_mp_prg_status
16468             ,X_EXCEPTION_CODE => v_mp_exception_code
16469             ,P_RULE_ID => p_object_id
16470             ,P_ENG_STEP => 'ALL'
16471             ,P_DATA_TABLE => v_source_b_table
16472             ,P_ENG_SQL => null
16473             ,P_TABLE_ALIAS => 'B'
16474             ,P_RUN_NAME => 'Base_Update'
16475             ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Base_Update'
16476             ,P_CONDITION => null
16477             ,P_FAILED_REQ_ID => null
16478             ,P_ARG1 => v_load_type
16479             ,P_ARG2 => p_dimension_varchar_label
16480             ,P_ARG3 => v_simple_dimension_flag
16481             ,P_ARG4 => v_shared_dimension_flag
16482             ,P_ARG5 => v_dimension_id
16483             ,P_ARG6 => v_value_set_required_flag
16484             ,P_ARG7 => v_hier_table_name
16485             ,P_ARG8 => v_hier_dimension_flag
16486             ,P_ARG9 => v_source_b_table
16487             ,P_ARG10 => v_target_b_table
16488             ,P_ARG11 => v_member_dc_col
16489             ,P_ARG12 => v_member_t_dc_col
16490             ,P_ARG13 => v_member_col
16491             ,P_ARG14 => v_exec_mode_clause
16492             ,P_ARG15 => p_master_request_id
16493             );
16494          IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16495            IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16496               null;
16497            ELSE
16498               RAISE e_terminate;
16499            END IF;
16500          END IF;
16501 
16502          FEM_ENGINES_PKG.TECH_MESSAGE
16503           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr Base_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16504 
16505          -- accumulate rejected row count
16506          get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16507          v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16508          FEM_ENGINES_PKG.TECH_MESSAGE
16509           (c_log_level_1,c_block||'.'||c_proc_name||
16510            '.v_rows_rejected_accum',v_rows_rejected_accum);
16511       --END IF; -- simple dim = 'N' (for Base Update)
16512 
16513       ------------------------------------------------------------------------------
16514       -- Update Name/Descriptions for existing Members
16515       ------------------------------------------------------------------------------
16516 
16517          FEM_ENGINES_PKG.TECH_MESSAGE
16518           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16519 
16520          fem_multi_proc_pkg.MASTER
16521          (X_PRG_STAT => v_mp_prg_status
16522          ,X_EXCEPTION_CODE => v_mp_exception_code
16523          ,P_RULE_ID => p_object_id
16524          ,P_ENG_STEP => 'ALL'
16525          ,P_DATA_TABLE => v_source_tl_table
16526          ,P_ENG_SQL => null
16527          ,P_TABLE_ALIAS => 'B'
16528          ,P_RUN_NAME => 'TL_Update'
16529          ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.TL_Update'
16530          ,P_CONDITION => null
16531          ,P_FAILED_REQ_ID => null
16532          ,P_ARG1 => v_load_type
16533          ,P_ARG2 => p_dimension_varchar_label
16534          ,P_ARG3 => v_dimension_id
16535          ,P_ARG4 => v_target_b_table
16536          ,P_ARG5 => v_target_tl_table
16537          ,P_ARG6 => v_source_b_table
16538          ,P_ARG7 => v_source_tl_table
16539          ,P_ARG8 => v_member_col
16540          ,P_ARG9 => v_member_dc_col
16541          ,P_ARG10 => v_member_name_col
16542          ,P_ARG11 => v_member_t_dc_col
16543          ,P_ARG12 => v_member_t_name_col
16544          ,P_ARG13 => v_member_description_col
16545          ,P_ARG14 => v_value_set_required_flag
16546          ,P_ARG15 => v_simple_dimension_flag
16547          ,P_ARG16 => v_shared_dimension_flag
16548          ,P_ARG17 => v_hier_dimension_flag
16549          ,P_ARG18 => v_exec_mode_clause
16550          ,P_ARG19 => p_master_request_id
16551          );
16552          IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16553            IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16554               null;
16555            ELSE
16556               RAISE e_terminate;
16557            END IF;
16558          END IF;
16559 
16560          FEM_ENGINES_PKG.TECH_MESSAGE
16561           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr TL_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16562 
16563          -- accumulate rejected row count
16564          get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16565          v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16566          FEM_ENGINES_PKG.TECH_MESSAGE
16567           (c_log_level_1,c_block||'.'||c_proc_name||
16568            '.v_rows_rejected_accum',v_rows_rejected_accum);
16569 
16570       ------------------------------------------------------------------------------
16571       -- Pre_Validation_Attr
16572       --This step identifies bad attr records (only run for Simple_dim='N'
16573       ------------------------------------------------------------------------------
16574       IF (v_simple_dimension_flag = 'N') THEN
16575          FEM_ENGINES_PKG.TECH_MESSAGE
16576           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Pre_Validation_Attr',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16577 
16578          fem_multi_proc_pkg.MASTER
16579          (X_PRG_STAT => v_mp_prg_status
16580          ,X_EXCEPTION_CODE => v_mp_exception_code
16581          ,P_RULE_ID => p_object_id
16582          ,P_ENG_STEP => 'ALL'
16583          ,P_DATA_TABLE => v_source_attr_table
16584          ,P_ENG_SQL => null
16585          ,P_TABLE_ALIAS => 'B'
16586          ,P_RUN_NAME => 'Pre_Validation_Attr'
16587          ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Pre_Validation_Attr'
16588          ,P_CONDITION => null
16589          ,P_FAILED_REQ_ID => null
16590          ,P_ARG1 => v_load_type
16591          ,P_ARG2 => p_dimension_varchar_label
16592          ,P_ARG3 => v_dimension_id
16593          ,P_ARG4 => v_source_b_table
16594          ,P_ARG5 => v_source_tl_table
16595          ,P_ARG6 => v_source_attr_table
16596          ,P_ARG7 => v_target_b_table
16597          ,P_ARG8 => v_member_t_dc_col
16598          ,P_ARG9 => v_member_dc_col
16599          ,P_ARG10 => v_value_set_required_flag
16600          ,P_ARG11 => v_simple_dimension_flag
16601          ,P_ARG12 => v_shared_dimension_flag
16602          ,P_ARG13 => v_hier_dimension_flag
16603          ,P_ARG14 => v_exec_mode_clause
16604          ,P_ARG15 => p_master_request_id
16605          );
16606          FEM_ENGINES_PKG.TECH_MESSAGE
16607           (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16608 
16609          IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16610            IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16611               null;
16612            ELSE
16613               RAISE e_terminate;
16614            END IF;
16615          END IF;
16616 
16617          FEM_ENGINES_PKG.TECH_MESSAGE
16618           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Mbr Pre_Validation_Attr',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16619 
16620          -- accumulate rejected row count
16621          get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16622          v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16623          FEM_ENGINES_PKG.TECH_MESSAGE
16624           (c_log_level_1,c_block||'.'||c_proc_name||
16625            '.v_rows_rejected_accum',v_rows_rejected_accum);
16626 
16627       ----------------------------------------------------------------------------------
16628       --  Update attributes
16629       ----------------------------------------------------------------------------------
16630 
16631          -- truncate the INTERIM tables in preparation for CALP processing
16632          IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16633             truncate_calp_interim;
16634          END IF;
16635 
16636          FEM_ENGINES_PKG.TECH_MESSAGE
16637           (c_log_level_3,c_block||'.'||c_proc_name||'.Start Mbr Attr_Assign_Update',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16638 
16639          fem_multi_proc_pkg.MASTER
16640          (X_PRG_STAT => v_mp_prg_status
16641          ,X_EXCEPTION_CODE => v_mp_exception_code
16642          ,P_RULE_ID => p_object_id
16643          ,P_ENG_STEP => 'ALL'
16644          ,P_DATA_TABLE => v_source_attr_table
16645          ,P_ENG_SQL => null
16646          ,P_TABLE_ALIAS => 'B'
16647          ,P_RUN_NAME => 'Attr_Assign_Update'
16648          ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Attr_Assign_Update'
16649          ,P_CONDITION => null
16650          ,P_FAILED_REQ_ID => null
16651 --         ,P_REUSE_SLICES => 'R'
16652          ,P_ARG1 => p_dimension_varchar_label
16653          ,P_ARG2 => v_date_format_mask
16654          ,P_ARG3 => v_dimension_id
16655          ,P_ARG4 => v_target_b_table
16656          ,P_ARG5 => v_target_attr_table
16657          ,P_ARG6 => v_source_b_table
16658          ,P_ARG7 => v_source_attr_table
16659          ,P_ARG8 => v_member_col
16660          ,P_ARG9 => v_member_dc_col
16661          ,P_ARG10 => v_member_t_dc_col
16662          ,P_ARG11 => v_value_set_required_flag
16663          ,P_ARG12 => v_hier_dimension_flag
16664          ,P_ARG13 => v_simple_dimension_flag
16665          ,P_ARG14 => v_shared_dimension_flag
16666          ,P_ARG15 => v_exec_mode_clause
16667          ,P_ARG16 => p_master_request_id
16668          );
16669          IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16670            IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16671               null;
16672            ELSE
16673               RAISE e_terminate;
16674            END IF;
16675          END IF;
16676 
16677          -- accumulate rejected row count
16678          get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16679          v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16680          FEM_ENGINES_PKG.TECH_MESSAGE
16681           (c_log_level_1,c_block||'.'||c_proc_name||
16682            '.v_rows_rejected_accum',v_rows_rejected_accum);
16683 
16684          FEM_ENGINES_PKG.TECH_MESSAGE
16685           (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Attr_Assign',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16686 
16687          FEM_ENGINES_PKG.TECH_MESSAGE
16688           (c_log_level_3,c_block||'.'||c_proc_name||'.Begin Attr Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16689 
16690          --------------------------------------------------------------
16691          -- Perform the Date Overlap Check for CAL_PERIOD loads
16692          -- and update valid START_DATE attributes in FEM
16693          IF p_dimension_varchar_label = 'CAL_PERIOD' THEN
16694             calp_date_overlap_check(v_rows_rejected
16695                                     ,'ATTR_ASSIGN_UPDATE');
16696             v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16697 
16698             fem_multi_proc_pkg.MASTER
16699             (X_PRG_STAT => v_mp_prg_status
16700             ,X_EXCEPTION_CODE => v_mp_exception_code
16701             ,P_RULE_ID => p_object_id
16702             ,P_ENG_STEP => 'ALL'
16703             ,P_DATA_TABLE => v_source_attr_table
16704             ,P_ENG_SQL => null
16705             ,P_TABLE_ALIAS => 'B'
16706             ,P_RUN_NAME => 'Post_Cal_Periods'
16707             ,P_ENG_PRG => 'FEM_DIM_MEMBER_LOADER_PKG.Post_Cal_Periods'
16708             ,P_CONDITION => null
16709             ,P_FAILED_REQ_ID => null
16710             ,P_ARG1 => 'ATTR_ASSIGN_UPDATE'
16711             ,P_ARG2 => p_master_request_id);
16712 
16713             FEM_ENGINES_PKG.TECH_MESSAGE
16714              (c_log_level_1,c_block||'.'||c_proc_name||'.v_mp_exception',v_mp_exception_code);
16715 
16716             IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16717               IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16718                  null;
16719               ELSE
16720                  RAISE e_terminate;
16721               END IF;
16722             END IF;
16723             -- accumulate rejected row count
16724             get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16725             v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16726             FEM_ENGINES_PKG.TECH_MESSAGE
16727              (c_log_level_1,c_block||'.'||c_proc_name||
16728               '.v_rows_rejected_accum',v_rows_rejected_accum);
16729             FEM_ENGINES_PKG.TECH_MESSAGE
16730              (c_log_level_3,c_block||'.'||c_proc_name||'.Finish Attr Overlap Processing',to_char(sysdate,'MM/DD/YYY:HH:MI:SS'));
16731 
16732          END IF; -- overlap check for CAL_PERIOD load
16733 
16734          --------------------------------------------------------------
16735 
16736       END IF; -- Simple Dimension Flag = 'N' (for Attr validation and Attr Update)
16737 
16738       ----------------------------------------------------------------------------------
16739       --  Post Dimension Member load status to FEM_DIM_LOAD_STATUS
16740       ----------------------------------------------------------------------------------
16741       IF v_simple_dimension_flag = 'N' THEN
16742          v_src_sys_last_row := NVL(tg_src_system_dc.LAST,0);
16743          FEM_ENGINES_PKG.TECH_MESSAGE
16744          (c_log_level_1,c_block||'.'||c_proc_name||'.Step10.v_src_sys_last_row'
16745          ,v_src_sys_last_row);
16746 
16747             FOR i IN 1..v_src_sys_last_row
16748             LOOP
16749                FEM_ENGINES_PKG.TECH_MESSAGE
16750                (c_log_level_1,c_block||'.'||c_proc_name||'.Step10.tg_src_system_dc'
16751                ,tg_src_system_dc(i));
16752 
16753                Post_dim_status (v_dimension_id
16754                                ,tg_src_system_dc(i)
16755                                ,v_source_attr_table);
16756             END LOOP;
16757       END IF; -- src_system Post_dim_status
16758 
16759       x_rows_rejected_accum := v_rows_rejected_accum;
16760          FEM_ENGINES_PKG.TECH_MESSAGE
16761           (c_log_level_1,c_block||'.'||c_proc_name||
16762            '.x_rows_rejected_accum',x_rows_rejected_accum);
16763 
16764       -----------------------------------------------------------------------------------
16765       -- Close any open cursors
16766       -----------------------------------------------------------------------------------
16767       IF cv_get_src_sys%ISOPEN THEN
16768          CLOSE cv_get_src_sys;
16769       END IF;
16770 
16771 
16772       --------------------------------------------------------------------------
16773       -- The following piece of code is for loading
16774       -- Composite Dimensions
16775       --------------------------------------------------------------------------
16776 
16777 
16778     ELSIF v_composite_dimension_flag = 'Y' THEN
16779 
16780 
16781       fem_engines_pkg.tech_message(
16782 	             p_severity  => c_log_level_2
16783 	             ,p_module   => c_block||'.'||c_proc_name||'.Before Process_Rows'
16784                  ,p_msg_text => 'Calling Process_Rows via MP Framework');
16785 
16786       --------------------------------------------------------------------------
16787       -- This procedure calls the MP Engine for the proc 'Process_rows'
16788       --------------------------------------------------------------------------
16789 
16790       fem_multi_proc_pkg.MASTER
16791          (X_PRG_STAT => v_mp_prg_status
16792          ,X_EXCEPTION_CODE => v_mp_exception_code
16793          ,P_RULE_ID => p_object_id
16794          ,P_ENG_STEP => 'ALL'
16795          ,P_DATA_TABLE => v_source_b_table
16796          ,P_ENG_SQL => g_select_statement
16797          ,P_TABLE_ALIAS => 'B'
16798          ,P_RUN_NAME => 'Process_Rows'
16799          ,P_ENG_PRG => 'FEM_COMP_DIM_MEMBER_LOADER_PKG.Process_Rows'
16800          ,P_CONDITION => null
16801          ,P_FAILED_REQ_ID => null
16802          ,P_ARG1 => p_dimension_varchar_label
16803          ,P_ARG2 => p_execution_mode
16804          ,P_ARG3 => v_structure_id
16805          ,P_ARG4 => p_master_request_id);
16806          --Bug#4736810
16807          get_mp_rows_rejected (v_rows_rejected, v_rows_loaded);
16808          v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
16809          x_rows_rejected_accum := v_rows_rejected_accum;
16810 
16811      fem_engines_pkg.tech_message(
16812 	             p_severity  => c_log_level_5
16813 	             ,p_module   => c_block||'.'||c_proc_name||'.After Process_Rows'
16814                  ,p_msg_text => 'Process_Rows Status '||v_mp_prg_status||
16815 				 'Process_Rows Err Code '||v_mp_exception_code);
16816 
16817       --------------------------------------------------------------------------
16818       -- Check for the MP error message from process_rows
16819       --------------------------------------------------------------------------
16820 
16821           IF v_mp_prg_status NOT IN ('COMPLETE:NORMAL') THEN
16822 
16823 		   IF v_mp_exception_code IN ('FEM_MP_NO_DATA_SLICES_ERR') THEN
16824 
16825 			 fem_engines_pkg.tech_message(
16826 	             p_severity  => c_log_level_1
16827 	             ,p_module   => c_block||'.'||c_proc_name||'.After Process_Rows'
16828                  ,p_msg_text => 'Process_Rows Error '||v_mp_exception_code);
16829 
16830            ELSE
16831 
16832               RAISE e_terminate;
16833 
16834            END IF;
16835 
16836          END IF;
16837 
16838 
16839 	  fem_engines_pkg.tech_message(
16840 	             p_severity  => c_log_level_1
16841 	             ,p_module   => c_block||'.'||c_proc_name||'.After Process_Rows'
16842                  ,p_msg_text => 'End of Process_Rows');
16843 
16844   END IF;
16845 
16846 
16847       --COMMIT;
16848 
16849 
16850 
16851 --------------------------------------------------------------------------------
16852 --            Load Dimension
16853 --            Exception Block
16854 --------------------------------------------------------------------------------
16855 
16856 EXCEPTION
16857    WHEN e_terminate THEN
16858 
16859        fem_engines_pkg.tech_message(
16860 	             p_severity  => c_log_level_4
16861 	             ,p_module   => c_block||'.'||c_proc_name||'. Load_Dimension'
16862                  ,p_msg_text => 'Process_Rows Error '||v_mp_exception_code);
16863 
16864        RAISE e_main_terminate;
16865 
16866    WHEN e_exec_lock_exists THEN
16867          gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
16868          IF v_num_msg > 0 THEN
16869             FOR i IN 1 .. v_num_msg LOOP
16870                FEM_ENGINES_PKG.User_Message
16871                  (p_msg_text => FND_MSG_PUB.Get(p_encoded => 'F'));
16872             END LOOP;
16873          END IF;
16874 
16875       FEM_ENGINES_PKG.TECH_MESSAGE
16876        (p_severity => c_log_level_5
16877        ,p_module => c_block||'.'||c_proc_name||'.Exception'
16878        ,p_app_name => c_fem
16879        ,p_msg_name => G_EXEC_LOCK_EXISTS
16880        ,P_TOKEN1 => 'OBJECT_ID'
16881        ,P_VALUE1 => v_object_id);
16882 
16883       FEM_ENGINES_PKG.USER_MESSAGE
16884        (P_APP_NAME => c_fem
16885        ,P_MSG_NAME => G_EXEC_LOCK_EXISTS
16886        ,P_TOKEN1 => 'OBJECT_ID'
16887        ,P_VALUE1 => v_object_id);
16888 
16889 
16890    WHEN OTHERS THEN
16891       gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
16892       gv_prg_msg := sqlerrm;
16893       gv_callstack := dbms_utility.format_call_stack;
16894 
16895       FEM_ENGINES_PKG.TECH_MESSAGE
16896        (p_severity => c_log_level_6
16897        ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
16898        ,p_msg_text => gv_prg_msg);
16899 
16900       FEM_ENGINES_PKG.TECH_MESSAGE
16901        (p_severity => c_log_level_6
16902        ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
16903        ,p_msg_text => gv_callstack);
16904 
16905       FEM_ENGINES_PKG.USER_MESSAGE
16906        (p_app_name => c_fem
16907        ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
16908        ,P_TOKEN1 => 'ERR_MSG'
16909        ,P_VALUE1 => gv_prg_msg);
16910 
16911     --  FEM_ENGINES_PKG.USER_MESSAGE
16912     --   (p_app_name => c_fem
16913     --   ,p_msg_text => gv_prg_msg);
16914 
16915       RAISE e_main_terminate;
16916 
16917 END Load_Dimension;
16918 
16919 
16920 
16921 /*===========================================================================+
16922  | PROCEDURE
16923  |                 Main
16924  |
16925  | DESCRIPTION
16926  |                 Main engine procedure for loading dimension members
16927  |                 and attribute assignments into FEM
16928  |
16929  |
16930  |
16931  | SCOPE - PUBLIC
16932  |
16933  | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
16934  |
16935  | ARGUMENTS  : IN:
16936  |
16937  |              OUT:
16938  |
16939  |              IN/ OUT:
16940  |
16941  | RETURNS    : NONE
16942  |
16943  | NOTES
16944  |    This procedure is called by Concurrent Manager when the loader is launched
16945  |    It performs the following:
16946  |       1)  Validates the parameters passed by CM
16947  |       2)  Obtains the associated object_Definition_id and dimension_Varchar_label
16948  |            for the dimension_id passed in as a parm
16949  |       3)  Registers the Process Execution
16950  |       4)  Loads the dimension
16951  |
16952  | HISTORY
16953  |    5/31/2005 Rob Flippo  Bug#3923485  Removed p_date_format_mask input parm
16954  |                          now using ICX: Date Format Mask profile option
16955  ===========================================================================*/
16956 PROCEDURE Main (
16957    errbuf                       OUT NOCOPY     VARCHAR2
16958   ,retcode                      OUT NOCOPY     VARCHAR2
16959   ,p_execution_mode             IN       VARCHAR2
16960   ,p_dimension_id               IN       NUMBER
16961 )
16962 
16963 IS
16964 
16965    -- Nested Procedure declarations
16966    PROCEDURE Get_Object_Def (p_dimension_id              IN       NUMBER
16967                             ,x_object_definition_id       OUT NOCOPY NUMBER
16968                             ,x_dimension_varchar_label  OUT NOCOPY VARCHAR2);
16969 
16970    -- Constants for body of Main
16971    c_proc_name VARCHAR2(30) := 'Main';
16972 
16973    -- Variables for body of Main
16974    v_completion_status VARCHAR2(30);
16975    v_object_id NUMBER(9);
16976    v_object_definition_id NUMBER(9);
16977    v_dimension_varchar_label VARCHAR2(30);
16978    v_pl_status VARCHAR2(30);
16979    v_rows_rejected NUMBER :=0;
16980    v_rows_rejected_accum NUMBER :=0;
16981    v_rows_to_load NUMBER :=0;
16982    v_rows_to_load_accum NUMBER :=0;
16983    v_bulk_rows_rejected NUMBER :=0;
16984 
16985    v_obj_def_display_name VARCHAR2(150);  -- used when terminating and want to show
16986                                           -- the type of load in the log
16987 
16988    /*************************************************
16989    obsolete variables
16990    -- these are variables for counting from fem_simple_dims_b_t/tl_t
16991    -- to see if there are any rows for loading
16992    v_source_b_count NUMBER :=0;
16993    v_source_tl_count NUMBER :=0;
16994    v_source_count_accum NUMBER :=0;
16995 
16996    -- Variables to determine valid Simple Dimensions for loading
16997    -- when loading from the Object = "Simple Dimensions"
16998    v_hier_editor_managed_flag VARCHAR2(1);
16999    v_xdim_read_only_flag VARCHAR2(1);
17000    v_value_set_required_flag VARCHAR2(1);
17001    v_simple_dimension_flag VARCHAR2(1);
17002    ****************************************************/
17003 
17004    v_msg_count NUMBER;
17005    v_sec_folder_count NUMBER;  -- used to see if user has privs to the Integrations folder
17006    v_msg_data VARCHAR2(4000);
17007    v_API_return_status VARCHAR2(30);
17008    v_sec_folder_name VARCHAR2(150); -- folder name that the user must have privs in
17009 
17010    ----------------------------------------------------------------
17011    -- Nested Procedure bodies
17012    ----------------------------------------------------------------
17013 
17014    -- Get_Object Def
17015    --   This procedure gets Object Definition associated with the dimension.
17016    --   Each dimension has a hard-coded associated object_definition where the
17017    --   MP settings are located.
17018    --   This procedure also gets the Dimension Varchar label for the dimension
17019    --   being loaded so that we can use that to identify the dimension in the code
17020    --   rather than the _ID
17021    --
17022    PROCEDURE Get_Object_Def (p_dimension_id          IN         NUMBER
17023                             ,x_object_definition_id  OUT NOCOPY NUMBER
17024                             ,x_dimension_varchar_label OUT NOCOPY VARCHAR2)
17025 
17026    IS
17027 
17028    BEGIN
17029 
17030       BEGIN
17031          SELECT loader_object_def_id, dimension_varchar_label
17032          INTO x_object_definition_id, x_dimension_varchar_label
17033          FROM fem_xdim_dimensions_vl
17034          WHERE dimension_id = p_dimension_id;
17035 
17036          IF x_object_definition_id IS NULL THEN
17037             RAISE e_dim_load_not_enabled;
17038          END IF;
17039       EXCEPTION
17040          WHEN no_data_found THEN
17041             raise e_dimension_not_found;
17042       END;
17043    EXCEPTION
17044       WHEN e_dimension_not_found THEN
17045 
17046          FEM_ENGINES_PKG.TECH_MESSAGE
17047           (p_severity => c_log_level_5
17048           ,p_module => c_block||'.'||c_proc_name||'.Exception'
17049           ,p_app_name => c_fem
17050           ,p_msg_name => G_DIM_NOT_FOUND);
17051 
17052          FEM_ENGINES_PKG.USER_MESSAGE
17053           (p_app_name => c_fem
17054           ,p_msg_name => G_DIM_NOT_FOUND);
17055 
17056          RAISE e_main_terminate;
17057 
17058       WHEN e_dim_load_not_enabled THEN
17059 
17060          FEM_ENGINES_PKG.TECH_MESSAGE
17061           (p_severity => c_log_level_5
17062           ,p_module => c_block||'.'||c_proc_name||'.Exception'
17063           ,p_app_name => c_fem
17064           ,p_msg_name => G_INVALID_SIMPLE_DIM);
17065 
17066          FEM_ENGINES_PKG.USER_MESSAGE
17067           (p_app_name => c_fem
17068           ,p_msg_name => G_INVALID_SIMPLE_DIM);
17069 
17070          RAISE e_main_terminate;
17071 
17072 
17073    END Get_Object_Def;
17074 
17075 ---------------------------------------------------------------------------
17076 --  Main body of the "Main" procedure
17077 ---------------------------------------------------------------------------
17078 BEGIN
17079 
17080    -- Get the OBject Definition ID and the label of the dimension_id to be loaded
17081    Get_Object_Def (p_dimension_id
17082                   ,v_object_definition_id
17083                   ,v_dimension_varchar_label);
17084 
17085    -- Get Object ID
17086    BEGIN
17087       SELECT object_id
17088       INTO v_object_id
17089       FROM fem_object_definition_b
17090       WHERE object_definition_id = v_object_definition_id
17091       AND object_id IN (SELECT object_id FROM fem_object_catalog_b
17092       WHERE object_type_code = 'DIM_MEMBER_LOADER');
17093    EXCEPTION
17094       WHEN no_data_found THEN
17095          RAISE e_invalid_obj_def;
17096    END;
17097    -----------------------------------------------------
17098    --  Validate Security - does user have privs to the Integrations folder
17099    -----------------------------------------------------
17100    SELECT count(*)
17101    INTO v_sec_folder_count
17102    FROM fem_user_folders
17103    WHERE user_id=c_user_id
17104    AND folder_id=1000;
17105 
17106    IF v_sec_folder_count = 0 THEN
17107       RAISE e_no_folder_privs;
17108    END IF;
17109 
17110 
17111 
17112    -----------------------------------------------------
17113    --  Validate the execution mode
17114    -----------------------------------------------------
17115    IF p_execution_mode NOT IN ('S','E') THEN
17116       RAISE e_invalid_exec_mode;
17117    END IF;
17118    -----------------------------------------------------
17119 
17120 
17121    Register_process_execution (v_object_id
17122                               ,v_object_definition_id
17123                               ,p_execution_mode
17124                               ,v_completion_status);
17125 
17126    IF v_pl_status IN ('ERROR') THEN
17127       raise e_pl_registration_failed;
17128    END IF;
17129 
17130    Load_Dimension (
17131       v_rows_rejected
17132      ,v_rows_to_load
17133      ,p_execution_mode
17134      ,v_object_id
17135      ,v_object_definition_id
17136      ,v_dimension_varchar_label
17137      ,gv_request_id);
17138 
17139       v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
17140       v_rows_to_load_accum := v_rows_to_load_accum + v_rows_to_load;
17141 
17142 
17143          /*****************************************************************
17144          Obsolete code for updating rows in a shared interface table
17145          when the dimension is invalid.  In this case, we are not
17146          updating the records with a STATUS
17147          FOR dim IN cv_dimension LOOP
17148             v_dimension_varchar_label := dim.dimension_varchar_label;
17149                FEM_ENGINES_PKG.TECH_MESSAGE
17150                (c_log_level_1,c_block||'.'||c_proc_name||'.dimension'
17151                ,v_dimension_varchar_label);
17152 
17153 
17154             -- Only process simple dims that are Value Set = N and
17155             -- Hier Edtitor Managed Flag = 'Y'.  All other records
17156             -- in FEM_SIMPLE_DIMS_B_T/TL_T will be updated with
17157             -- INVALID_SIMPLE_DIM status
17158             BEGIN
17159                SELECT X.hier_editor_managed_flag
17160                ,X.read_only_flag
17161                ,X.value_set_required_flag
17162                ,X.simple_dimension_flag
17163                INTO v_hier_editor_managed_flag
17164                ,v_xdim_read_only_flag
17165                ,v_value_set_required_flag
17166                ,v_simple_dimension_flag
17167                FROM fem_xdim_dimensions X, fem_dimensions_b B
17168                WHERE B.dimension_varchar_label = v_dimension_varchar_label
17169                AND B.dimension_id = X.dimension_id;
17170             EXCEPTION
17171                WHEN no_data_found THEN
17172                   v_simple_dimension_flag := 'N';
17173                   v_value_set_required_flag := 'N';
17174                   v_xdim_read_only_flag := 'Y';
17175                   v_hier_editor_managed_flag := 'N';
17176 
17177             END; -- sub block
17178 
17179             IF (v_simple_dimension_flag = 'Y') AND
17180             (v_value_set_required_flag = 'N') AND
17181             (v_xdim_read_only_flag = 'N') AND
17182             (v_hier_editor_managed_flag = 'Y') THEN
17183 
17184                Load_Dimension (
17185                  v_rows_rejected
17186                  ,v_rows_to_load
17187                  ,p_execution_mode
17188                  ,v_object_id
17189                  ,p_object_definition_id
17190                  ,v_dimension_varchar_label
17191                  ,p_date_format_mask);
17192 
17193                v_rows_rejected_accum := v_rows_rejected_accum + v_rows_rejected;
17194                v_rows_to_load_accum := v_rows_to_load_accum + v_rows_to_load;
17195             ELSE
17196                UPDATE fem_simple_dims_b_t
17197                SET STATUS = 'INVALID_SIMPLE_DIM'
17198                WHERE dimension_varchar_label = v_dimension_varchar_label;
17199 
17200                v_bulk_rows_rejected := SQL%ROWCOUNT;
17201                v_rows_rejected_accum := v_rows_rejected_accum + v_bulk_rows_rejected;
17202                -- rows to load gets incremented because these invalid_simple_dim rows
17203                -- don't appear in the original total since they don't belong to a legal
17204                -- dimension
17205                v_rows_to_load_accum := v_rows_to_load_accum + v_bulk_rows_rejected;
17206                UPDATE fem_simple_dims_tl_t
17207                SET STATUS = 'INVALID_SIMPLE_DIM'
17208                WHERE dimension_varchar_label = v_dimension_varchar_label;
17209 
17210                v_bulk_rows_rejected := SQL%ROWCOUNT;
17211                v_rows_rejected_accum := v_rows_rejected_accum + v_bulk_rows_rejected;
17212                -- rows to load gets incremented because these invalid_simple_dim rows
17213                -- don't appear in the original total since they don't belong to a legal
17214                -- dimension
17215                v_rows_to_load_accum := v_rows_to_load_accum + v_bulk_rows_rejected;
17216 
17217              COMMIT;
17218             END IF;
17219          END LOOP;
17220          *******************************************************************/
17221    ----------------------------------------------------------------------------------
17222    --  Engine Master Post Processing
17223    --  This step updates the status tables with number of rows processed,
17224    --  number of error rows, etc.
17225    ----------------------------------------------------------------------------------
17226    FEM_ENGINES_PKG.TECH_MESSAGE
17227     (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_rejected_accum',v_rows_rejected_accum);
17228 
17229    FEM_ENGINES_PKG.TECH_MESSAGE
17230     (c_log_level_1,c_block||'.'||c_proc_name||'.v_rows_to_load_accum',v_rows_to_load_accum);
17231 
17232    Eng_Master_Post_Proc (v_object_id
17233                         ,v_rows_rejected_accum
17234                         ,v_rows_to_load_accum);
17235 
17236 
17237 EXCEPTION
17238       WHEN e_no_folder_privs THEN
17239 
17240          SELECT folder_name
17241          INTO v_sec_folder_name
17242          FROM fem_folders_vl
17243          WHERE folder_id=1000;
17244 
17245 
17246          FEM_ENGINES_PKG.TECH_MESSAGE
17247           (p_severity => c_log_level_5
17248           ,p_module => c_block||'.'||c_proc_name||'.Exception'
17249           ,p_app_name => c_fem
17250           ,p_msg_name => G_NO_FOLDER_PRIVS
17251           ,P_TOKEN1 => 'FOLDER'
17252           ,P_VALUE1 => v_sec_folder_name);
17253 
17254          FEM_ENGINES_PKG.USER_MESSAGE
17255           (p_app_name => c_fem
17256           ,p_msg_name => G_NO_FOLDER_PRIVS
17257           ,P_TOKEN1 => 'FOLDER'
17258           ,P_VALUE1 => v_sec_folder_name);
17259 
17260          gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17261 
17262       WHEN e_invalid_exec_mode THEN
17263 
17264          FEM_ENGINES_PKG.TECH_MESSAGE
17265           (p_severity => c_log_level_5
17266           ,p_module => c_block||'.'||c_proc_name||'.Exception'
17267           ,p_app_name => c_fem
17268           ,p_msg_name => G_INVALID_EXEC_MODE);
17269 
17270          FEM_ENGINES_PKG.USER_MESSAGE
17271           (p_app_name => c_fem
17272           ,p_msg_name => G_INVALID_EXEC_MODE);
17273 
17274          gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17275 
17276    WHEN e_main_terminate THEN
17277 
17278        gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17279 
17280        FEM_PL_PKG.Update_Obj_Exec_Status(
17281         P_API_VERSION               => c_api_version,
17282         P_COMMIT                    => c_true,
17283         P_REQUEST_ID                => gv_request_id,
17284         P_OBJECT_ID                 => v_object_id,
17285         P_EXEC_STATUS_CODE          => 'ERROR_RERUN',
17286         P_USER_ID                   => gv_apps_user_id,
17287         P_LAST_UPDATE_LOGIN         => null,
17288         X_MSG_COUNT                 => v_msg_count,
17289         X_MSG_DATA                  => v_msg_data,
17290         X_RETURN_STATUS             => v_API_return_status);
17291 
17292       ---------------------------
17293       -- Update Request Status --
17294       ---------------------------
17295       FEM_PL_PKG.Update_Request_Status(
17296         P_API_VERSION               => c_api_version,
17297         P_COMMIT                    => c_true,
17298         P_REQUEST_ID                => gv_request_id,
17299         P_EXEC_STATUS_CODE          => 'ERROR_RERUN',
17300         P_USER_ID                   => gv_apps_user_id,
17301         P_LAST_UPDATE_LOGIN         => null,
17302         X_MSG_COUNT                 => v_msg_count,
17303         X_MSG_DATA                  => v_msg_data,
17304         X_RETURN_STATUS             => v_API_return_status);
17305 
17306    WHEN e_invalid_obj_def THEN
17307 
17308       FEM_ENGINES_PKG.TECH_MESSAGE
17309        (p_severity => c_log_level_5
17310        ,p_module => c_block||'.'||c_proc_name||'.Exception'
17311        ,p_app_name => c_fem
17312        ,p_msg_name => G_INVALID_OBJ_DEF);
17313 
17314       FEM_ENGINES_PKG.USER_MESSAGE
17315        (p_app_name => c_fem
17316        ,p_msg_name => G_INVALID_OBJ_DEF
17317        ,P_TOKEN1 => 'OBJECT'
17318        ,P_VALUE1 => null);
17319 
17320       gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17321 
17322    WHEN e_pl_registration_failed THEN
17323 
17324       -- User and Tech messages have already been posted, so do nothing
17325       gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17326 
17327    WHEN OTHERS THEN
17328 
17329       gv_concurrent_status := fnd_concurrent.set_completion_status('ERROR',null);
17330       gv_prg_msg := sqlerrm;
17331       gv_callstack := dbms_utility.format_call_stack;
17332 
17333       FEM_ENGINES_PKG.TECH_MESSAGE
17334        (p_severity => c_log_level_6
17335        ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
17336        ,p_msg_text => gv_prg_msg);
17337 
17338       FEM_ENGINES_PKG.TECH_MESSAGE
17339        (p_severity => c_log_level_6
17340        ,p_module => c_block||'.'||c_proc_name||'.Unexpected Exception'
17341        ,p_msg_text => gv_callstack);
17342 
17343       FEM_ENGINES_PKG.USER_MESSAGE
17344        (p_app_name => c_fem
17345        ,p_msg_name => 'FEM_UNEXPECTED_ERROR'
17346        ,P_TOKEN1 => 'ERR_MSG'
17347        ,P_VALUE1 => gv_prg_msg);
17348 /*
17349       FEM_ENGINES_PKG.USER_MESSAGE
17350        (p_app_name => c_fem
17351        ,p_msg_text => gv_prg_msg); */
17352 
17353 
17354 END Main;
17355 
17356 /***************************************************************************/
17357 
17358 END FEM_DIM_MEMBER_LOADER_PKG;