Really using ODI 12c for Data Integration with Oracle Hyperion Planning/Essbase
On Kscope 14 Oracle announced that ODI 12c would not have support to Planning/Essbase and HFM. You people could imagine that this bomb would make a lot of noise in EPM world.
Because we did not liked the ODI 12c interface, we did not care too much about this announcement, but after Oracle post this: https://blogs.oracle.com/dataintegration/entry/using_odi_12c_for_data, we heard a lot of users complaining about it.
Also we thought a little about our dear users and imagined how our beautiful ODI environment that orchestrates the entire EPM environment would look like if we had to create a lot of extra steps to export data from tables to files and use some CMD commands to load it into Planning/Essbase/HFM.
We decided to make some tests to see if we were able to use ODI 11 KMs with minimal changes to them (in order to increase acceptance of this method), and do our part to help the EPM world.
After a couple of hours (it was more like 6 hours…) we figure out how to make the KMs from ODI 11 work with minimal changes in ODI 12. Let us stop talking and start showing what we need to change to make ODI 12 compatible with EPM.
Technologies We do not need to import or change anything in the Technologies tree because Oracle left all the technologies for the EPM tools there.
Jars
We do not need to change or copy any Jar because Oracle was kind enough to maintain them there. The only thing we need to do is to Import the EPM KMs from the ODI 11 to ODI 12.
KMs We have seven KM that we need to import from ODI 11.
For Essbase:
RKM Hyperion Essbase
LKM Hyperion Essbase DATA to SQL
LKM Hyperion Essbase METADATA to SQL
IKM SQL to Hyperion Essbase (DATA)
IKM SQL to Hyperion Essbase (METADATA)
For Planning:
RKM Hyperion Planning
IKM SQL to Hyperion Planning
After we import the KMs, we need to changes a few things on them.
RKMs
In the RKMs we saw the first changes Oracle did in the way ODI works. In the 11 version, ODI used the <%=odiRef.getModel(“ID“)%> substitution method to get the ID of the model there we would like to reverse. If we take a look in the master repository, in ODI 12 we’ll see a new column in the table: This is the first thing we need to update in the RKM. ODI 11 used the ID, and if you try to use it as is, Oracle created a validation that makes the interface fails. (It was a good error message because we could figure out the problem reading it).
Then, basically we need to update it to the new GLOBAL_ID.
RKM Hyperion Essbase
Step Reset MetaData:
We need to update the code:
SnpsReverseResetTable -MODEL=<%=odiRef.getModel(“ID“)%>
To
SnpsReverseResetTable -MODEL=<%=odiRef.getModel(“GLOBAL_ID“)%>
Step Start the Reverse:
We need to update the code to the new standard and also enclosure the substitution method with double quotes because now it returns a string instead of a numeric value.
imod = <%=snpRef.getModel(“ID“)%>
To
imod = “<%=snpRef.getModel(“GLOBAL_ID“)%>”
Step Set MetaData:
We need only to update to GLOBAL_ID.
SnpsReverseSetMetaData -MODEL=<%=snpRef.getModel(“ID“)%>
To
SnpsReverseSetMetaData -MODEL=<%=snpRef.getModel(“GLOBAL_ID“)%>
RKM Hyperion Planning
For the Planning KM we just need to update the code exactly in the same way we did in the Essbase KM.
Step Reset MetaData:
SnpsReverseResetTable -MODEL=<%=odiRef.getModel(“ID“)%>
To
SnpsReverseResetTable -MODEL=<%=odiRef.getModel(“GLOBAL_ID“)%>
Step Start the Reverse:
imod = <%=snpRef.getModel(“ID“)%>
To
imod = “<%=snpRef.getModel(“GLOBAL_ID“)%>”
Step Set MetaData:
SnpsReverseSetMetaData -MODEL=<%=snpRef.getModel(“ID“)%>
To
SnpsReverseSetMetaData -MODEL=<%=snpRef.getModel(“GLOBAL_ID“)%>
After this, just create a model and reverse something to test it.
With this we are ready with the RKM part and we can start to create interfaces. Sweet.
IKMs
The IKMs were the easiest part. Oracle created some categories to group similar KMs. We need just to choose one of the 3 possibilities to make the KM shows in the Mappings (the new Interface object of ODI 12):
We choose “Control Append” since the EPM IKMs does not have any type of integration strategy, but really does not matter with one you choose (I just like things organized).
IKM SQL to Hyperion Essbase (DATA)
We need to double click the KM and select the integration type: IKM SQL to Hyperion Essbase (METADATA)
For the Metadata we need to do the same thing, add the Integration type (We chose “Control Append” again)
IKM SQL to Hyperion Planning
Same thing for the Planning IKM. Add the Integration type. (We chose “Control Append“) We are done with the IKM part.
LKMs
LKM Hyperion Essbase DATA to SQL
There is no change in this KM. Works as is. I like it.
LKM Hyperion Essbase METADATA to SQL
This was the tricky one. And not because it’s too different than the others. In fact, if it was not for a BUG in the API it would not need any changes to make it works (On Monday we will open a SR with Oracle about this bug).
The thing is: In the step “Begin Essbase Metadata Extract”, we have a line with the follow command: stagCols = ‘<%=snpRef.getColList(“”, “[CX_COL_NAME]=[COL_NAME] “, “, “, “”, “”)%>’
This command basically create a mapping between the temporary table and Essbase to start the extract. Essbase and its API is case sensitive with this information, and the pattern COL_NAME, in this version, seems to be bugged or changed the behavior (that I do not believe is the case, I will explain later).
In this version instead of bring something like this:
stagCols = ‘PARENTNAME=ParentName, MEMBERNAME=MemberName , ALIAS=Alias‘
It’s bring something like this:
stagCols = ‘PARENTNAME=PARENTNAME, MEMBERNAME= MEMBERNAME, ALIAS= ALIAS‘
The pattern is always returning in Uppercase, even when you change the execution to Stage or Target areas, and because of this, we got an error saying that the member PARENTNAME is not valid for the dimension XXXXX (And this does not happen in ODI 11 if you set the execution to Stage or Target areas).
Anyway, we start to test the behavior and we found out that in ODI 12 it is impossible (by now) to create an Oracle table like this: Because the pattern COL_NAME always return, uppercase no matter what and it removes the double quotes from the expression. This is why we think it is a bug, because it removes a functionality from the Oracle DB as well.
For a quickly workaround (yes we know it’s ugly, but Oracle will fix that in no time and we’ll be able to get rid of it) we changed the code from:
stagCols = ‘<%=snpRef.getColList(“”, “[CX_COL_NAME]=[COL_NAME] “, “, “, “”, “”)%>’
To
stagCols = ‘<%=snpRef.getColList(“”, “[CX_COL_NAME]=[COL_DESC] “, “, “, “”, “”)%>’
After this, we just need to copy the column name to the description inside the attributes in the model: Double clicking the column, it will open its properties and in the description tab we only need to copy the name of the column to its description because the COL_DESC will get exactly what is written there (with one exception: if you put a quote or double quotes it will turn it in space, but we will not use it here).
This workaround does the trick:
Yes, we know that we could use a lot of other methods, as Flexfields for example, to do this or even do some code changes in the KM, but the idea here is to show that is possible to use ODI 12 with minor changes. And with this we can use ODI 12 in our EPM environment just like we do with the 11 version.
We didn’t test HFM here because we don’t have it installed in our infra, but probably the amount of changes for HFM is the same as it’s for Essbase and Planning.
We hope you guys like this and please give us any feedback if you guys implement this solution. As far as we test it, it should work exactly like ODI 11.
See you next time.
——————Edited on 07/22/2014——————-
About the Case sensitive issue of [COL_NAME].
We installed the ODI 12.1.2.3 today and repeated the tests we did in the previous version.
The [COL_NAME] for IKM is working, and that means, the issue to create an Oracle table with 2 columns with the same name but different case is solved.
But the [COL_NAME] for LKM still doesn’t works. All LKM have the same behavior and we can see that in the logs when we tried to replicate the IKM behavior in a LKM.
As we can see, the behavior was fixed in the IKM but not in the LKM. This happens because the KMs are executed in different ways depending on its type (I, L, CKM) as we can see here:
http://docs.oracle.com/middleware/1212/odi/ODIKD/odiref_reference.htm#CIADFCFJ
For now please stick with our workaround until Oracle fix this in the LKMs.
See you next time.
July 19, 2014 at 1:10 am
This is some really great work guys! If this turns out to work I know some people that will really benefit from it.
I just wanted to comment on one thing regarding the capital names on columns issue. I don’t know if it’s also the case in version 12, but regarding the LKM with metadata, I bumped into this in 11.1.1.7 fairly recently.
It seems weird but this seems to consistently work for me: create a new interface, set the source, set the target, set the LKM, set the column mapping to the staging area, set the staging area to your relational database (this is all normal so far…) and then… if you run the interface you get that error with the column names such as ParentName not being PARENTNAME. So what to do now? Close the interface all the way, then open it. Make sure that your staging area and columsn are still set, then run it.
There seems to be something funky about laying out a new interface, but the act of closing it after all the pieces are set and then opening it seems to “kick” something and step around that capital column name issue. Again, I don’t know if this is still true in 12c but I wouldn’t be surprised.
Regards – Jason Jones
July 19, 2014 at 4:49 pm
Hi Jason how are you? Well, we know about this “Behavior” in the 11 version, but this time is a little different because even in the Oracle KMs you face the same issue. If yout try to Create a table in ODI 11 with 2 columns like “test” and TEST, it’ll work. In ODI12 does not works because of this. Then we think that or is a bug or a behavior change (but it’s odd to be something like this because you take out a database functionality [Ability to have case sencitive columns).
Anyway we were awere about this issue in 11 and even so we wasn’t able to make it works in 12 (all tests here are made using both ODIs)
Thanks and appreciate your feedback.
July 19, 2014 at 11:37 am
Thanks for going through the effort and time to test and share this I’m sure your changes will be implemented a lot. The sad part is Oracle won’t support you if there is a problem and we can’t guarantee the next patch won’t break your changes
July 19, 2014 at 4:52 pm
Yes, I agree with you. I even think that in a near furure oracle will remove the Jars for Hyperion (I’m praying to be wrong in this one) but… Let’s see what will happens.
It was fun to research this at least 😉
October 28, 2014 at 8:11 am
Nice work! 🙂
December 30, 2014 at 8:37 am
[…] a lot of cool stuff this year like ODI certification, ODTUG ODI Expert Panel, speaking at KScope14, changed ODI EPM KMs to work on ODI12c, ODI petition for EPM KMs support, OTNArchBeat Publication and a lot of other EPM related […]
January 14, 2015 at 2:21 pm
I just wonder, if EPM KMs are no longer available in ODI 12c, does Oracle intend to completely remove ODI and EPM integration. Or is Oracle emphasizing on FDMEE as only integration solution.
January 15, 2015 at 8:51 am
I think this was a product direction decision and FDMEE would be the way to go regarding EPM integration, but there was so much noise in the EPM community about it that Oracle seems to have changed its mind again. Take a look at this petition page:
https://www.change.org/p/oracle-announce-support-for-the-odi-kms-for-hyperion-planning-and-hyperion-financial-management-in-odi-12c-by-december-31-2014
If Chris is right, the Planning and Essbase support on ODI12c should come back in a near release of ODI12c. Unfortunately, nothing was said regarding HFM 😦
January 27, 2016 at 3:21 pm
Great Job!!
June 28, 2019 at 11:31 am
The step that starts the reverse gives an error saying “the 1st argument can’t be coarced to an int”. Guess the function ODIModelImporter(imod, hApp, repCon, rkmOptions) isn’t updated to accept oracle’s new GUID instead the old integer ID, any suggestions on how could solve this issue?
Thanks in advance
March 2, 2020 at 8:27 am
HI Giampaoli,
Is these fixed by the Oracle in ODI 12.2.1.4 now or we still need to do the manual modification in KM’s?
Regards,
Anurag
March 2, 2020 at 10:20 am
Hi Anurag how are you? Yes, this is fixed. This was from a time where Oracle decide to remove the Planning support from ODI. A lot of folks sign a petition and Oracle rollback his ideas and we have support again. Thanks.
October 6, 2020 at 12:42 pm
Hi,
I am getting some _getattribute__ while loading ODIEssbaseLoad error while loading data.
Again there is one out of index error as well.
Can you help !!!
October 6, 2020 at 12:38 pm
Hi,
Can you share the settings of the IKM for Essbase data load?
Regards