Skip to Content
Author's profile photo Former Member

BODS alternatives and considerations

1.SQL transform

When underlying table is altered (add/delete columns) in database the SQL transform should be “UPDATE SCHEMA”

If not this will not pull any records from the table and it neither error nor warns when we validate the job from designer

2. Date format

to_date() function

‘YYYYDDD’ format is not supported by BODS.

Documentation manual don’t provide any information to convert 7 digit Julian dates (Legacy COBOL dates).

We may need to write custom function to convert these dates or get date from underlying database “if database supported this date format”

——Sample function ———-

IF(substr($julian_dt, 1, 4) = 2000 or substr($julian_dt, 1, 2) = 18)


RETURN(sql(‘DS_Legacy’, ‘select to_char(to_date(‘||$julian_dt||’,\’YYYYDDD\’),\’YYYY.MM.DD\’) from dual’));


return decode((substr($julian_dt, 1, 2) = 19), jde_date(substr($julian_dt, 3, 5)), (substr($julian_dt, 1, 2) = 20), add_months(jde_date(substr($julian_dt, 3, 5)), 1200),  NULL );

————-sample function END —————

3. Getting timestamp column from SQL transform

In SQL transform  a timestamp field is not pulled directly, instead alternatively we can convert that to text or custom format accordingly and pill and convert back to desired date time format.

4. When a character field is mapped to numeric field , if the value is not numeric equivalent then the value is converted to NULL.

if the value is equivalent to numeric that is typecast to numeric.

Alternative: ADD nvl AFTER YOU MAP it to numeric field, if you don’t want to populate NULL for that field in target

5. for character fields while mapping higher length field to less length fields the value will be truncated and propagated.

if the source value is all blanks NULL will be propagated to the next transform

(something similar to above)

6. When using gen_rownum() function:

If this function is used in a query transform in which there is join operation then there is possibility to generate duplicate values.

The issue is not with the function instead the query transform functionality in combination with join and gen_rownum() function.

Reason: – For every transform BODI will generate SQL query and pushes to database to fetch/compute result data

– When joining BODI caches one table and then fetches other table and joins returns the data.

– While caching these row numbers are generated. Here is the issue

— example When joining table with 100 records(cached) with table 200 records (assuming all 200 match join criteria) then output volume of join

   is 200 records since the row numbers are already generated with 100 records table there will be 100 duplicate values in output.

7.BODS 14 version allows multiple users operate simultaneously on single local repository.

This leads to code inconsistency, if the same object (Datastore/JOB/WORKFLOW/DATAFLOW) is being modified by two different users at the same time

the last saving version is stored to the repository.

Solution: Mandatory to use central repository concept to check-out-check-in code safely.

8. “Enable recovery” is one of the best feature of BODS, when we use Try-Catch approach in the job automatic recovery option will not recover in case of job failure.

– Must be careful to choose try-catch blocks, when used this BODS expects developer to handle exceptions.

9. Bulk loader option for target tables:

Data directly written to database data files (skips SQL layer), when enables back the constraints even PK may also be not valid because of duplicate values in the column because data is not validated while loading data.

– This error is shown at the end of the job and job will have successful completion with an error saying “UNIQUE constraint is in unusable state”

9a. While enabling/rebuilding UNIQUE index on the table if there is any oracle error to enable the index sill the error from BODS log is shown as duplicate values found cannot enable UNIQUE index.

actually the issue is not with data issue is with oracle database temp segment.

When used API bulk load option the data load will be faster and all the constraints on the table are automatically disabled and enabled back after the data loaded to the table.

10.LOOKUP,TARGETS,SOURCE Objects from data store are hard coded schema names.

When we update schema name at datastore level that is not sufficient to point to updated schema for these objects.

Instead we need to use “Alias” in the data store.

11.Static repository instance:

Multiple users can login to same local repository and work simultaneously, When any user updates the repository object those changes are not visible immediately to other logged in users, to reflect those other users should re-login to the repository.


This error shows then we want to execute the job, the job will not start and not even take this to “Execution Properties” window.

Simply says cannot execute.

If you validate the job the job validates successfully without any errors or issues

This may be cause of following issues

1. Invalid MERGE transform (go to merge transform validate, take care of warnings)

2. Invalid validation transform columns (Check each validation rule)

Best alternate:

Go to Tools>options>Designer>general un check the option “perform complete validation before job execution” then start the job

now the job fails with proper error message in error log

13. How to use global variables in SQL transform:

you can use global variables in SQL Transform in SQL Statement

you will not be able to import schema with reference to global variable in SQL Statement, so when importing schema use constant values instead of global variable, once the schema is imported, you can replace the constant with global variable, it will be replaced with the value you set for that variable when job is executed

the other thing, I don’t think you will be able to retain the value of global variable outside the DF, to verify this add script after the first DF and print the value of variable, is it same as that set inside the DF ?

if the data type of the column is VARCHAR the enclose the variable in { }, for example:- WHERE BATCH_ID = {$CurrentBatchID} if its NUMERIC then use WHERE BATCH_ID = $CurrentBatchID

14. Expression value type cast:

example-1: decode(1<>1,2,1.23),   this  evaluates to 1

example-2: decode(1<>1,2.0,1.23) this evaluates to  1.23

example-3: decode(1<>1,2.0,1) this evaluates to  1

What is happening here?

BODS will cast from left to right, i.e. what ever the datatype of the left most operand is the final datatype of the expression.

in example 1 first operand is 1, entire expression castes/converts to INTEGER

in example 2 first operand is a floting point, entire expression casts/converts to a float/double

in example 3 first operand is a floting point, entire expression casts/converts to a float/double

This issue is applicable where ever a mathematical expression is possible like in query transform, lookup etc.

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.