<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>Data Integration and Management</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/" />
   <link rel="self" type="application/atom+xml" href="http://blogs.oracle.com/dataintegration/xml/rss.xml" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297</id>
   <updated>2009-11-20T22:26:58Z</updated>
   <subtitle>Inside Oracle&apos;s Data Integration community</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type Enterprise 4.23-en</generator>


<entry>
   <title>Parallel Processing in ODI</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/11/parallel_processing_in_odi.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.15669</id>
   
   <published>2009-11-21T04:11:09Z</published>
   <updated>2009-11-20T22:26:58Z</updated>
   
   <summary>This post describes how ODI can be leveraged to execute processes in parallel, and beyond the parallelisation how these can then be synchronized. </summary>
   <author>
      <name>Christophe Dupupet</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="etl" label="ETL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="interface" label="Interface" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="package" label="Package" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="parallelprocessing" label="Parallel Processing" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="procedure" label="Procedure" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="scenario" label="Scenario" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p><em>This post assumes that you have some level of familiarity with ODI. The concepts of Packages, Interfaces, Procedures and Scenarios are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for detailed information.</em></p>

<p><strong>ODI: Parallel Processing</strong></p>

<p>A common question in ODI is how to run processes in parallel. When you look at a typical ODI package, all steps are described in a serial fashion and will be executed in sequence. </p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ParallelPackageSerial.PNG" src="http://blogs.oracle.com/dataintegration/2009/11/20/ParallelPackageSerial.PNG" width="408" height="119" class="mt-image-none" style="" /></span></p>

<p>However, this same package can parallelize and synchronize processes if needed.</p>

<p><strong> PARALLEL PROCESSES </strong></p>

<p>The first piece of the puzzle if you want to parallelize your executions is that a package can invoke other packages once they have been compiled into scenarios (the process of generation of scenarios is described later in this post). You can then have a <em>master</em> package that will orchestrate other scenarios. There is no limit as to how many levels of nesting you will have, as long as your processes are making sense: Your master package invokes a seconday package which, in turn invokes another package...</p>

<p>When you invoke these scenarios, you have two possible execution modes: synchronous and asynchronous. </p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ParallelScenario.PNG" src="http://blogs.oracle.com/dataintegration/2009/11/20/ParallelScenario.PNG" width="380" height="344" class="mt-image-none" style="" /></span></p>

<p>A <em>synchronous</em> execution will serialize the scenario execution with other steps in the package: ODI executes the scenario, and only after its execution is completed, runs the next step.</p>

<p>An <em>asynchronous</em> execution will only invoke the scenario but will immediately execute the next step in the calling package: the scenario will then run in parallel with the next step. You can use this option to start multiple scenarios concurrently: they will all run in parallel, independently of one another.</p>

<p><strong> SYNCHRONIZING PROCESSES </strong></p>

<p>Once we have started multiple processes in parallel, a common requirement is to synchronize these processes: some steps may run in parallel, but at times we will need all separate threads to be completed before we proceed with a final series of steps. ODI provides a tool for this: OdiWaitForChildSession. </p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ParallelSynchronize.PNG" src="http://blogs.oracle.com/dataintegration/2009/11/20/ParallelSynchronize.PNG" width="160" height="106" class="mt-image-none" style="" /></span></p>

<p>An interesting feature is that as you start your different processes in parallel, they can each be assigned a keyword (this is just one of the parameters you can set when you start a scenario). When you synchronize the processes, you can select which processes will be synchronized based on a selection of keywords.</p>

<p><strong> ADDING SCENARIOS TO YOUR PACKAGE FOR PARALLEL PROCESSING</strong></p>

<p>To add a scenario to your package, simply drag and drop the generated scenario in the package, and edit the execution parameters as needed. In particular, remember to set the execution mode to <em>Asynchronous</em>.</p>

<p>You can generate a scenario from a package, from an interface, or from a procedure. The last two will be more atomic (one interface or one procedure only per execution unit). The typical way to generate a scenario is to right-click on one of these objects and to select <em>Generate Scenario</em>. </p>

<p>The generation of scenarios can also be automated with ODI processes that would invoke the ODI tool <em>OdiGenerateAllScen</em>. The parameters of this tool will let you define which scenarios are being generated automatically. </p>

<p>In all cases, scenarios can be found in the object tree, under the object they were generated from - or in the Operator interface, in the <em>Scenarios</em> tab.</p>

<p>While you are developing your different objects, keep in mind that you can <em>Regenerate</em> existing scenarios. This is faster than deleting existing ones only to re-create them with the same version number. To re-generate a scenario, simply right-click on the existing version and select <em>Regenerate ...</em> .</p>

<p>From an execution perspective, you can specify that the scenario you will execute is version <em>-1</em> (negative one) to ensure that the latest version number is always the one executed. This is a lot easier than editing the parameters with each new release.</p>

<p><strong>DISPLAYING PARALLEL PROCESSING</strong></p>

<p>You will notice that as of 10.1.3.4, ODI does not graphically differentiate between serialized and parallelized executions: all are represented in a serial manner. One way to make parallel executions more visible is stack up the objects vertically, versus the more natural horizontal execution for serialized objects. (If we have electricians reading this, the layout will be very familiar to them, but this is only a coincidence...)</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ParallelPackageStackUp.PNG" src="http://blogs.oracle.com/dataintegration/2009/11/20/ParallelPackageStackUp.PNG" width="805" height="395" class="mt-image-none" style="" /></span></p>

<p><strong>OTHER OBJECTS THAN SCENARIOS</strong></p>

<p>Scenarios are not the only objects that will allow for parallel (or Asynchronous) execution. If you look at the ODI tool <em>OdiOSCommand</em>, you will notice a <em>Synchronous</em> option that will allow you to define if the external component you are executing will run in parallel with the current process, or if it will be serialized in your process. The same is true for the Data Quality tool <em>OdiDataQuality</em>.</p>

<p><strong>EXECUTION LOGS</strong></p>

<p>As you will start running more processes in parallel, be ready to see more processes being executed concurrently in the Operator interface. If you are only interested in seing the master processes though, the <em>Hierarchy</em> tab will allow you to limit your view to parent processes. Children processes will be listed under the entry <em>Childres Sessions</em> under each session. </p>

<p>Likewise, when you access the logs from the web front end, you can view the <em>Parent</em> processes only.</p>

<p>Enjoy!</p>

<p><em>Screenshots were taken using version 10.1.3.5 of ODI. Actual icons and graphical representations may vary with other versions of ODI.</em><br />
</p>]]>
      
   </content>
</entry>

<entry>
   <title>Oracle GoldenGate Downloads now Available on OTN</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/11/oracle_goldengate_downloads_no.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.15494</id>
   
   <published>2009-11-10T22:37:59Z</published>
   <updated>2009-11-10T22:51:23Z</updated>
   
   <summary>If you listened to our webcast today: Introducing Oracle GoldenGate, Real-time Data Integration and Continuous Availability with Hasan Rizvi and Juan Loaiza, you heard us mention about some of the key performance, heterogeneity and reliability benefits. Now you can download...</summary>
   <author>
      <name>dain.hansen</name>
      
   </author>
   
   <category term="managementpackfororaclegoldengate" label="Management Pack for Oracle GoldenGate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oraclegoldengate" label="Oracle GoldenGate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oraclegoldengateveridata" label="Oracle GoldenGate Veridata" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>If you listened to our webcast today: Introducing <a href="http://www.oracle.com/webapps/dialogue/dlgpage.jsp?p_ext=Y&p_dlg_id=8286503&src=6878223&Act=31&msgid=8287286&eid=34071414&lid=1">Oracle GoldenGate, Real-time Data Integration and Continuous Availability </a>with Hasan Rizvi and Juan Loaiza, you heard us mention about some of the key performance, heterogeneity and reliability benefits.</p>

<p>Now you can <a href="http://www.oracle.com/technology/software/products/goldengate/index.html">download the Oracle GoldenGate software here </a>on our website and check it out for yourself. We've included some of the common platforms and Oracle sources and targets to get you started, but as we pointed out in our I-seminar we have support for many other sources and target environments:<br />
<ul><br />
	<li><a href="http://www.oracle.com/technology/software/products/goldengate/index.html">Oracle GoldenGate</a></li><br />
	<li><a href="http://www.oracle.com/technology/software/products/goldengate/index.html">Oracle GoldenGate Veridata</a></li><br />
	<li><a href="http://www.oracle.com/technology/software/products/goldengate/index.html">Management Pack for Oracle GoldenGate</a></li><br />
</ul></p>

<p><a href="http://www.oracle.com/goldengate">Click here </a>for more information about Oracle GoldenGate.</p>]]>
      
   </content>
</entry>

<entry>
   <title>The Benefits of ODI Knowledge Modules: a Template Approach for Better Data Integration</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/11/the_benefits_of_odi_knowledge.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.15464</id>
   
   <published>2009-11-09T16:17:27Z</published>
   <updated>2009-11-09T16:46:19Z</updated>
   
   <summary>An analysis of the benefits of using a template based approach for data integration, and how this approach is made possible by ODI Knowledge Modules.</summary>
   <author>
      <name>Christophe Dupupet</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="etl" label="ETL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="interface" label="Interface" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="km" label="KM" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="knowledgemodule" label="Knowledge Module" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="source" label="Source" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="stagingtable" label="Staging table" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="target" label="Target" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p><em>This post assumes that you have some level of familiarity with ODI. The concepts of Knowledge Module are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for detailed information.</em>.</p>

<p>At the core, ODI knowledge modules are templates of code that will be leveraged for data integration tasks: they pre-define data integration steps that are required to extract, load, stage - if needed - and integrate data.</p>

<p>Several types of Knowledge Modules are available, and are grouped in families for Loading operations (LKMs), Integration operations (IKMs), Data Control operations (CKMs), and more.</p>

<p>For a more detailed description of what a knowledge module is, simply picture the multiple steps required to load data from a flat file into a database. You can connect to the file using JDBC, or leverage the database native loading utility (sqlldr for Oracle, bcp for SQL Server or Sybase, load for db2, etc.). External tables are another alternative for databases that support this feature. <br />
As you use one or the other technique, you may first want to stage the data before loading your actual target table; in other cases, staging will only slow down your data load. </p>

<p>As far as the integration in the target system is concerned, again multiple strategies are available: simple inserts, inserts and updates, upserts, slowly changing dimension... these techniques may be as simple as one step, or be a complex series of commands that must be issued to your database for proper execution. </p>

<p>The Knowledge Modules will basically list these steps so that a developer who needs to repeat the same integration pattern only has to select the appropriate templates, versus re-developing the same logic over and over again.</p>

<p>The immediate benefits of this approach are well known and well documented:<br />
- All developers use the same approach, and code development is consistent across the company, hence guarantying the quality of the code<br />
- Productivity is greatly improved, as proven path are re-used versus being re-developed<br />
- Code improvement and modification can be centralized and has a much broader impact: optimization and regulatory changes are done once and inherited by all processes<br />
- Maintenance is greatly simplified </p>

<p>To fully appreciate all the benefits of using knowledge Modules, there is a lot more that needs to be exposed and understood about the technology. This post is a modest attempt at addressing this need.</p>

<p><strong>GENERATION OF CODE AND TRANSFORMATIONS</strong></p>

<p>Most tools today will offer the ability to generate SQL code (or some other type of code, such as scripts) on your source <strong>or</strong> target system. As most products come with a transformation engine, they will also generate proprietary code for this engine where data is staged (I'll skip the debate here as to whether a transformation engine is a staging area or not - the point being that code can be generated on either source, "middle-tier" or target).</p>

<p>However, real life requirements are rarely either/or. Often times, it makes sense to leverage all systems to optimize the processing: spread out the load for the transformations, reduce the amount of data to be transferred over the network, process the data where it is versus moving the data around solely for the purpose of transformations.</p>

<p>To achieve this, Data Integration tools must be able to distribute the transformation logic across the different systems. </p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="KMCodeExecution.PNG" src="http://blogs.oracle.com/dataintegration/2009/11/09/KMCodeExecution.PNG" width="727" height="197" class="mt-image-none" style="" /></span></p>

<p>Only ODI will effectively generate code <strong>and transformations</strong> on all systems. This feature is only possible thanks to the KM technology.</p>

<p>Beyond the ability to generate code, you have to make sure that the generated code is the best possible code for the selected technology. Too often, tools first generate code that is then translated for the appropriate database. With the KMs technology, no translation is required: the generated code was initially conceived explicitly for a given technology, hence taking advantage of all the specifics of this technology.</p>

<p>And since the KMs are technology specific, there is no limit to what can be leveraged on the databases, including user defined functions or stored procedures.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="KMCodeGeneration.PNG" src="http://blogs.oracle.com/dataintegration/2009/11/09/KMCodeGeneration.PNG" width="266" height="202" class="mt-image-none" style="" /></span></p>

<p><strong>CODE ADAPTABILITY</strong></p>

<p>Whenever a tool generates code, the most common complaint is that there is very little (if any) control over the generated result. What if a simple modification of the code could provide dramatic performance improvements? Basic examples would include index management, statistics generation, joins management, and a lot more. </p>

<p>The KM technology is open and expansible so that developers have complete control over the code generation process. Beyond the ability to optimize the code, they can extend their solution to define and enforce in house best practices, and comply with corporate, industry or regulatory requirements. KMs Modifications are done directly from the developers graphical interface.</p>

<p>One point that can easily be adapted is whether data have to be materialized throughout the integration process. Some out-of-the-box KMs will explicitly land data in a physical file or tables. Others will avoid I/Os by leveraging pipes instead of files, views and synonyms instead of tables. Again, developers can adapt the behavior to their actual requirements.</p>

<p><strong>EXPANDING THE TOOL TO NEW TECHNOLOGIES</strong></p>

<p>How much time does it take to adapt your code to a new release of your database? How much time does it take to add a new technology altogether? In both cases, KMs will provide a quick and easy answer. </p>

<p>Let us start with the case of a new version of the database. While our engineering teams will release new KMs as quickly as possible to take advantage of the latest releases of any new database, you do not have to wait for them. A new release typically means new parameters for your DDL and DML, as well as new functions for your existing transformations. Adapt the existing KMs with the features you need, and in minutes your code is ready to leverage the latest and greatest of your database. </p>

<p>Likewise, if you ever need to define a new technology that would not be listed by ODI (in spite of the already extensive list we provide), simply define the behavior of this technology in the Topology interface, and design technology specific KMs to take advantage of the specific features of this database. I can guaranty you that 80% of the code you need (at least!) is already available in an existing KM... Thus dramatically reducing the amount of effort required to generate code for your own technology. </p>

<p><strong>ARE KM MODIFICATIONS REQUIRED?</strong></p>

<p>I am a strong advocate of the customization of KMs: I like to get the best I can out of what I am given. But often times, good enough is more than enough. I will always remember trying to optimize performance for a customer: we did not know initially what our processing window would be - other than "give us your best possible performance". The first out-of-the-box KM we tried processed the required 30,000,000 records in 20 minutes. Due to IT limitations, we could only leverage lesser systems for faster KMs... but still reduced performance to 6 minutes for the same volume of data. We started modifying KMs to get even better results, when the customer admitted that we actually had 3 hour for the process to complete... At this point, spending time in KM modifications was clearly not needed anymore. </p>

<p>KMs are meant to give the best possible performance out of the box. But every environment is unique, and assuming that we can have the best possible code for you before knowing your own specific challenges would be an illusion - hence the ability to push the product and the code to the limit</p>

<p>Another common question is: do you have to leverage both source and target systems as part of your transformations? Clearly, the answer is no. But in most cases, it is crucial to have the flexibility to leverage all systems, versus being cornered in using only one of them. Over time, you will want to reduce the volume of data transferred over the network; you will want to distribute some of your processing... all more reasons to leverage all available engines in your environment.</p>

<p>Do not hesitate and share with us how you extend your KMs!</p>

<p><em>Screenshots were taken using version 10.1.3.5 of ODI. Actual icons and graphical representations may vary with other versions of ODI.</em></p>]]>
      
   </content>
</entry>

<entry>
   <title>Live Webcast: How Your Business Can Profit from Oracle GoldenGate</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/11/live_webcast_how_your_business.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.15320</id>
   
   <published>2009-11-03T04:31:41Z</published>
   <updated>2009-11-03T04:39:27Z</updated>
   
   <summary> Through its recent acquisition of GoldenGate Software, Oracle has accelerated its product strategy to deliver a comprehensive data integration platform and increase uptime for customers&apos; mission-critical systems. But how can your business profit from Oracle GoldenGate products - and...</summary>
   <author>
      <name>dain.hansen</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="database11g" label="Database 11g" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="hasanrizvi" label="Hasan Rizvi" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="juanloaiza" label="Juan Loaiza" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oraclegoldengate" label="Oracle GoldenGate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oraclereplication" label="Oracle Replication" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="realtimedataintegration" label="Real-time data integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="streams" label="Streams" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="realtimebi" label="real-time BI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="realtimedatawarehousing" label="real-time data warehousing" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="gg_header.jpg" src="http://blogs.oracle.com/dataintegration/gg_header.jpg" width="500" height="208" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></p>

<p>Through its recent acquisition of <strong>GoldenGate Software</strong>, Oracle has accelerated its product strategy to deliver a comprehensive data integration platform and increase uptime for customers' mission-critical systems. But how can your business profit from Oracle GoldenGate products - and how do they complement your existing Oracle investments?</p>

<p>Join us for this live Webcast hosted by Hasan Rizvi, Senior Vice President for Oracle Fusion Middleware Product Development and Juan Loaiza, Senior Vice President Systems Technology, to get the answers!</p>

<p><a href="http://www.oracle.com/go/?&Src=6878223&Act=18&pcode=NAMK09092426MPP004"><strong>Register now for this event</strong></a></p>

<p>You'll learn how you can apply Oracle GoldenGate's real-time data integration and heterogeneous data replication capabilities to:</p>

<ul>
	<li>Improve business insight through real-time integrations to business intelligence and data warehousing </li>
	<li>Maximize data availability through multi-master database configurations </li>
	<li>Synchronize and distribute data using bi-directional replication </li>
	<li>Upgrade databases, hardware and applications with zero downtime </li>
	<li>Replicate data between Oracle and non-Oracle systems </li>
</ul>

<p>To find out more about Oracle and GoldenGate goto: <a href="http://www.oracle.com/goldengate">http://www.oracle.com/goldengate </a></p>]]>
      
   </content>
</entry>

<entry>
   <title>Day 4: Hasta la Vista Oracle Open World</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/day_4_hasta_la_vista_oracle_op.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.15051</id>
   
   <published>2009-10-15T15:28:41Z</published>
   <updated>2009-10-15T15:44:07Z</updated>
   
   <summary>I hope everyone enjoyed the blockbuster keynote with Arnold and Larry - my favorite quote of the night was from Gov. Shwarzeneggar in speaking how much he loved the tech industry: &quot;I love tech. I love all kinds of tech......</summary>
   <author>
      <name>dain.hansen</name>
      
   </author>
   
   <category term="dainhansen" label="Dain Hansen" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="ellison" label="Ellison" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="informationmanagement" label="Information Management" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="paullonghurst" label="Paul Longhurst" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="arnoldschwarzenegger" label="arnold schwarzenegger" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegration" label="data integration" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>I hope everyone enjoyed the blockbuster keynote with Arnold and Larry - my favorite quote of the night was from Gov. Shwarzeneggar in speaking how much he loved the tech industry: <blockquote>"I love tech. I love all kinds of tech... and not just high tech but bio tech, <a href="http://news.cnet.com/8301-11128_3-10065300-54.html">green tech, clean tech</a>. The tech industry has made me what I am today... I wouldn't have made my start in acting career without help from body building technology and of course food supplement technology!"</blockquote></p>

<p>Ellison delivered a compelling keynote as well - especially interesting was his 10 million dollar challenge for anyone that could double the speed of <a href="http://www.oracle.com/database/exadata.html">Exadata. </a></p>

<p>So what about data integration? Well yesterday we had an action-packed day. Thanks to <a href="http://www.rittmanmead.com/">Rittman Mead </a>for their Oracle Un-conference on Oracle Warehouse Builder, and special thanks to Paul Longhurst at <a href="http://www.overstock.com">Overstock.com </a>for delivering an innovative best practice presentation on how to make Data Warehouses more active, more real-time and more efficient. </p>

<p>Today there's a session which I'm delivering with Haidong Song on <strong>Information Management: Combining the power of ODI and MDM</strong> together. I invite you to come to our session at </p>

<p><strong>9AM in Moscone South, Room 304</strong></p>]]>
      
   </content>
</entry>

<entry>
   <title>Day 3 Oracle OpenWorld: the Innovator meets Terminator</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/day_3_oracle_openworld_the_inn.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.15025</id>
   
   <published>2009-10-14T16:42:29Z</published>
   <updated>2009-10-14T17:01:31Z</updated>
   
   <summary>For all those geeks like me who idolize both the innovators and the terminators in the world, today is your day. Day 3 promises to keynote both Larry Ellison and Gov. Schwarzenegger. And if you&apos;re like me - and I...</summary>
   <author>
      <name>dain.hansen</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="goldengate" label="GoldenGate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="arnoldschwarzenegger" label="arnold schwarzenegger" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dainsworld" label="dainsworld" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegration" label="data integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="larryellison" label="larry ellison" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="overstockcom" label="overstock.com" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>For all those geeks like me who idolize both the innovators and the terminators in the world, today is your day. Day 3 promises to keynote both Larry Ellison and Gov. Schwarzenegger. And if you're like me - and I know you are - you've memorized all the one-liners from Commando and stapled them into your pocket protector, or I should say you've archived them on your iPhone and created ring tones out of them.</p>

<p>What else to do at OpenWorld today?</p>

<p>Don't forget to spend time at the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Oracle GoldenGate and the Oracle Data Integration booths in Moscone West</a> . And check out <strong>Overstock.com </strong>session which promises to be a good one on the how Overstock.com used both Oracle GoldenGate and Oracle Data Integration. <strong>Moscone West L3 in Room 3014</strong></p>

<p>What else is up today? Well I'm definitely looking forward today to meet up with some friends and colleagues and discuss and share what we've been up to this year. </p>

<p>Don't forget to follow me on twitter: "Dainsworld" and check out my own #oow09 one-liners<br />
</p>]]>
      
   </content>
</entry>

<entry>
   <title>Day 2 OpenWorld: 1 Umbrella. 2 Espressos. And the Innovation Across the Stack</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/day_2_openworld_1_umbrella_2_e.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14977</id>
   
   <published>2009-10-13T16:37:43Z</published>
   <updated>2009-10-13T16:58:17Z</updated>
   
   <summary>With a 2 hour commute through what appears to be horizontal rain, I&apos;m enjoying my double espresso in preparation for today&apos;s excitement. Stay dry and try not to miss the important sessions below: Check out Thomas Kurian talk about the...</summary>
   <author>
      <name>dain.hansen</name>
      
   </author>
   
   <category term="goldengate" label="GoldenGate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="hasanrizvi" label="Hasan Rizvi" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="juanloaiza" label="Juan Loaiza" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracleopenworld" label="Oracle Open World" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="streams" label="Streams" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>With a 2 hour commute through what appears to be horizontal rain, I'm enjoying my double espresso in preparation for today's excitement. Stay dry and try not to miss the important sessions below:</p>

<p>Check out Thomas Kurian talk about the "Innovation across the stack" today in the keynote and be sure not to miss the most important session of the day for the Data Integration crew:</p>

<p><strong>Oracle GoldenGate & Oracle Streams: The Future of Oracle Replication and Data Integration</strong><u></u></p>

<p>Panel With Hasan Rizvi and Juan Loaiza, Sachin Chawla, and Ali Kutay<br />
<strong>Tuesday, 2:30  - 3:30 PM<br />
Moscone South Room 270</strong></p>

<p><br />
And be sure not to miss these sessions today<br />
<ul><br />
	<li><strong>11:30a </strong><u>Using Oracle GoldenGate for Zero Down time with Sabre</u>, Marriott Hotel GoldenGate B1</li><br />
	<li><strong>11:30a </strong><u>Enterprise Data Services in the Cloud with Oracle Fusion Middleware</u>, Marriott Hotel Salon 7</li><br />
	<li><strong>1:00p</strong> <u>Oracle GoldenGate Deep Dive Architecture for Real-time</u>, Marriott Hotel </li><br />
	<li><strong>1:00p </strong><u>Deep Dive for Real-world Use cases with SOA and Data Integration</u>, Hilton Hotel GoldenGate 3</li><br />
	<li><strong>4:00p</strong> <u>BPM and Data Integration combined</u>, Marriott Hotel Nob Hill CD</li><br />
</ul></p>

<ul>
	<li>Check out the content catalog and more on <a href="http://www.oracle.com/us/openworld/index.htm">Oracle OpenWorld site</a></li>
	<li>Hands on Lab Sessions for ODI-EE 2:30p and 4:00p in Marriott Hotel GoldenGate A2</li>
	<li>Find out more about <a href="www.oracle.com/goto/odi">Oracle Data Integration Products and Oracle GoldenGate </a>at </li>
</ul>]]>
      
   </content>
</entry>

<entry>
   <title>Live from Oracle Open World: &quot;Art of the Possible&quot; ... and your must see on Day 1</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/live_from_oracle_open_world_ar.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14928</id>
   
   <published>2009-10-12T14:49:38Z</published>
   <updated>2009-10-12T15:45:01Z</updated>
   
   <summary>I&apos;m sitting here on one of just a handful of the Oracle Open World official bean bags waiting for the Charles Phillips keynote, &quot;Art of the Possible&quot;. I thought I would send you what I think some important noteworthy sessions...</summary>
   <author>
      <name>dain.hansen</name>
      
   </author>
   
   <category term="artofthepossible" label="Art of the Possible" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegration" label="Data integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracleopenworld" label="Oracle Open World" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="goldengate" label="goldengate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oow09" label="oow09" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>I'm sitting here on one of just a handful of the Oracle Open World official bean bags waiting for the Charles Phillips keynote, "Art of the Possible". I thought I would send you what I think some important noteworthy sessions of the day:</p>

<ul>
	<li><strong>8:30 AM </strong>- <u>Charles Phillips - Art of the possible</u></li>
	<li><strong>11:30 AM </strong>- <u>Introducing Oracle GoldenGate products, strategy discussion</u>: Marriott Hotel Golden Gate B1</li>
	<li><strong>1:00 PM </strong>- <u>Real-time BI using Oracle Data Integration and Oracle GoldenGate</u>, Marriott Hotel Golden Gate B1</li>
	<li><strong>1:00 PM </strong>- <u>Event-Driven BI from Heterogeneous Datasources with Oracle Data Integrator</u> Marriott Hotel Salon 1</li>
	<li><strong>2:30 PM </strong>- <u>Oracle Fusion Middleware 11g--Foundation for Innovation </u>Moscone North Hall D</li>
	<li><strong>4:00 PM</strong> - <u>RIM Case Study: Using Oracle GoldenGate Data Replication for High Availability</u>, Marriott Hotel Golden Gate B1</li>
	<li><strong>5:30 PM </strong>- <u>Integrate Oracle BI Solutions, Using Oracle Data Integrator Enterprise Edition</u> - Moscone South Room 307</li>
</ul>
And don't forget two hands on labs for those of you that like to get your hands dirty

<p><strong>11:30 AM and 1:00 PM</strong> for Oracle Data Integrator Enterprise Edition at Marriott Hotel Golden Gate A2</p>

<p><strong>Useful links:</strong></p>

<ul>
	<li>Check out the <a href="http://myexpospace.com/oracle2009/vcr2009/vcr.cfm">virtual collateral rack</a>: </li>
	<li><a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Oracle Data Integration and Oracle GoldenGate session lists</a></li>
	<li>Find out more about <a href="http://www.oracle.com/goto/odi">Oracle Data Integration products including Oracle GoldenGate</a></li>
</ul>

<p>Find it all here: <a href="http://www.oracle.com/us/openworld/index.htm">Oracle OpenWorld home page </a></p>

<p>To keep up to date on the Data Integration sessions at Oracle Open World feel free to follow me on <a href="www.twitter.com">twitter</a>: "dainsworld"</p>

<p>See you at the show!</p>

<p><br />
</p>]]>
      
   </content>
</entry>

<entry>
   <title>Did You Know that ODI Automatically Summarizes Data Errors?</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/did_you_know_that_odi_generate.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14830</id>
   
   <published>2009-10-09T18:09:10Z</published>
   <updated>2009-10-09T12:25:11Z</updated>
   
   <summary>ODI automatically generates a table to summarize all errors identified on a server. We review here the structure of this table, and how to locate it on the server.</summary>
   <author>
      <name>Christophe Dupupet</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="etl" label="ETL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="errors" label="Errors" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="flow_control" label="FLOW_CONTROL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="flowcontrol" label="Flow Control" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="interface" label="Interface" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="km" label="KM" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="knowledgemodule" label="Knowledge Module" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="static_control" label="STATIC_CONTROL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="stagingtable" label="Staging table" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="staticcontrol" label="Static Control" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>Looking for <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Data Integration at OpenWorld 2009</a>? <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Click here</a>!</p>

<p><em>This post assumes that you have some level of familiarity with ODI. The concepts of Interface, Flow and Static Control, as well as Knowledge Module are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for detailed information.</em>.</p>

<p><br />
<strong>TABLES GENERATED BY ODI TO IDENTIFY ERRORS </strong></p>

<p>If you take advantage of either  <em>Flow Control</em> or <em>Static Control</em> in your interfaces, you know that ODI will automatically trap errors for you as you run your interfaces. </p>

<p>When you select the <em>Controls</em> tab of your interface, where you will decide which Knowledge Module will be used to identify the errors, you have an option to drop the <em>Error</em> table and another one to drop  the <em>Check</em> table. Have you ever wondered what these are?</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Interface Controls Tab" src="http://blogs.oracle.com/dataintegration/2009/10/08/ErrorsSummaryReset.PNG" width="597" height="441" class="mt-image-none" style="" /></span></p>

<p>The <em>Error</em> table is the table that will be created by ODI to store all errors trapped by the FLOW_CONTROL and STATIC_CONTROL of your interface. You have probably already used the error table. This table is structured after your target table, along with administrative information needed to re-cycle or re-process the invalid records. It is loaded by ODI with all records that fail to pass the validation of the rules defined on your Target table. This feature is often referred to as a Data Quality Firewall as only the "good" data will make it to the target table. </p>

<p>Once all errors have been identified for a given interface, ODI will summarize them into another table: the <em>Check</em> table. There will be only one such table per data server: all target tables in the server (irrespectively of their schema) will share the same summary table. The name of this table is defined by default by the CKMs as <em>SNP_CHECK_TAB</em>.</p>

<p><br />
<strong>LOCATION OF THE <em>CHECK</em> TABLE </strong></p>

<p>You will find the <em>check</em> table in the <em>default work schema</em> of your server. To locate this schema, you have to go back to topology, in the <em>Physical Architecture</em> tab. Expand your data server to list the different physical schemas. One of the schemas is your default schema and will be identified by a checkmark on the schema icon (see SALES_DWH in the example below).</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Default Schema" src="http://blogs.oracle.com/dataintegration/2009/10/08/ErrorsSummaryDefaultSchema.PNG" width="225" height="156" class="mt-image-none" style="" /></span><br />
When you edit the schema, it has an associated work schema. The work schema associated to your default schema is your <em>default work schema</em>: ODI_TMP is the following example.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Default Work Schema" src="http://blogs.oracle.com/dataintegration/2009/10/08/ErrorsSummaryDefaultWorkSchema.PNG" width="291" height="205" class="mt-image-none" style="" /></span></p>

<blockquote>Note that you can change your default schema by selecting/unselecting the <em>default</em> option in the schema definition.  But remember that you will always need <strong>exactly one</strong> default schema for each server.</blockquote>

<p>Now that we know where to find this table, let's look at its structure:<ul><li>CATALOG_NAME, SCHEMA_NAME: location of the table that was being loaded (i.e. the target table)</li><br />
	<li>RESOURCE_NAME, FULL_RES_NAME: name of the table that was being loaded</li><br />
	<li>ERR_TYPE: type of control that was performed (Flow Control or Static Control)</li><br />
	<li>ERR_MESS: plain English error message associated with the error</li><br />
	<li>CHECK_DATE: date and time of the control</li><br />
	<li>ORIGIN: name of the ODI process that identified the errors</li><br />
	<li>CONS_NAME: name of the constraint (as defined in the ODI Models) that defines the rule that the record violated</li><br />
	<li>CONS_TYPE: type of error (duplicate primary key, invalid reference, conditional check failed, Null Value)</li><br />
	<li>ERR_COUNT: number of records identified by the process that failed to pass that specific control rule.</li><br />
</ul></p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ErrorsSummaryStructure.PNG" src="http://blogs.oracle.com/dataintegration/2009/10/08/ErrorsSummaryStructure.PNG" width="364" height="291" class="mt-image-none" style="" /></span></p>

<p>A sample of the data available in that summary table is show below (we split the content in 2 screenshots to make this more readable - this is one and only one table):</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Errors Summary Data" src="http://blogs.oracle.com/dataintegration/2009/10/08/ErrorsSummaryData.PNG" width="1163" height="232" class="mt-image-none" style="" /></span></p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Errors Summary Data2" src="http://blogs.oracle.com/dataintegration/2009/10/08/ErrorsSummaryData2.PNG" width="555" height="232" class="mt-image-none" style="" /></span></p>

<p>There are many possible uses for this table: decision making in your ODI processes based on the number of errors identified or the type of errors identified, basic reporting on errors trapped by ODI, trend analysis or the evolution of errors over time...</p>

<p>Do not hesitate and share with us how you leverage this table!</p>

<p><em>Screenshots were taken using version 10.1.3.5 of ODI. Actual icons and graphical representations may vary with other versions of ODI.</em></p>]]>
      
   </content>
</entry>

<entry>
   <title>Connecting to Oracle Business Intelligence EE using Oracle Data Integrator</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/connecting_to_oracle_bi_server.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14791</id>
   
   <published>2009-10-09T00:26:00Z</published>
   <updated>2009-10-08T23:32:09Z</updated>
   
   <summary> Looking for Data Integration at OpenWorld 2009? Click here! The posts in this series assume that you have some level of familiarity with ODI. The concepts of Topology, Data Server, Physical and Logical Architecture are used here assuming that...</summary>
   <author>
      <name>julien.testut</name>
      
   </author>
   
   <category term="businessintelligence" label="Business Intelligence" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="connection" label="Connection" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataserver" label="Data Server" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="jdbc" label="JDBC" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="obi" label="OBI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="obiserver" label="OBI Server" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="obiee" label="OBIEE" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="technology" label="Technology" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p><em><br />
Looking for <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Data Integration at OpenWorld 2009</a>? <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Click here</a>!</p>

<p>The posts in this series assume that you have some level of familiarity with ODI. The concepts of Topology, Data Server, Physical and Logical Architecture are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for more details.</em></p>

<p>In this post I will describe how to create a connection to an Oracle Business Intelligence (OBI) Server. </p>

<p><strong>Adding the Oracle BI Server JDBC driver to ODI</strong></p>

<p>Before we can connect to Oracle BI Server we need to add its JDBC driver to the ODI_HOME\oracledi\drivers directory.<br />
You will find the Oracle BI JDBC driver (bijdbc.jar) in your OBI EE  installation directory -> OBI_HOME\jdbc. You can simply copy it and then paste it into the ODI drivers directory.<br />
<em><u>Note:</u> Make sure you use the JDBC driver coming with OBI EE 10.1.3.4.1, I've had issues with previous releases of the driver.  If you are getting an error like 'No Suitable Driver' you are not using the right driver.</em></p>

<p><strong>Creating the Oracle BI Server Technology in Topology Manager</strong></p>

<p>The Oracle BI Server technology does not exist in ODI 10g, while we could use the Oracle technology it is cleaner to create a new technology. <br />
Instead of creating it from scratch I recommend to duplicate the Oracle technology.</p>

<p>Open Topology Manager and locate the Oracle technology in the Physical Architecture tree.<br />
Right-click on <em>Oracle </em>and select <em>Duplicate</em>.<br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Duplicate_Technology.png" src="http://blogs.oracle.com/dataintegration/biserver_odi_part1/Duplicate_Technology.png" width="259" height="642" class="mt-image-left" style="margin: 0 20px 20px 0;" /></span><br />
A new technology called <em>Copy of Oracle </em>should now appear in the list.<br />
Double-click on it to edit it.<br />
Change its name to <strong>Oracle BI Server </strong>and its code to <strong>ORACLE_BI_SERVER</strong>.<br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_Techno_1.png" src="http://blogs.oracle.com/dataintegration/BI_Server_Techno_1.png" width="175" height="135" class="mt-image-left" style="margin: 0 20px 20px 0;" /></span><br />
Under <em>Naming Rules </em>check the <strong>Using "Catalog"'</strong> checkbox and enter <strong>Catalog </strong>in the Used Term field.<br />
Remove <strong>Schema </strong>in the <em>Used Term</em> field and uncheck the <strong>Using "Schema"</strong> checkbox.<br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_Techno_2.png" src="http://blogs.oracle.com/dataintegration/BI_Server_Techno_2.png" width="446" height="156" class="mt-image-none" style="" /></span><br />
In the <em>Local Object Mask </em>and <em>Remote Object Mask </em>fields enter "%CATALOG"."%OBJECT".</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_Techno_3.png" src="http://blogs.oracle.com/dataintegration/BI_Server_Techno_3.png" width="334" height="388" class="mt-image-none" style="" /></span><br />
Go to the <em>Language </em>tab and empty the <em>Object Delimiter </em>field.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_Techno_4.png" src="http://blogs.oracle.com/dataintegration/BI_Server_Techno_4.png" width="404" height="122" class="mt-image-none" style="" /></span></p>

<p><strong>Creating a Data Server for the Oracle BI Server Technology</strong></p>

<p>Now that we have created the OBI Server technology we can create a data server to connect to  an OBI Server instance.<br />
Right-click on the <strong>Oracle BI Server </strong>technology and select <strong>Insert Data Server</strong>.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BIServer_Insert_DataServer.png" src="http://blogs.oracle.com/dataintegration/BIServer_Insert_DataServer.png" width="273" height="289" class="mt-image-none" style="" /></span></p>

<p>In the <em>Data Server</em> window, enter any name in the <em>Name </em>field.<br />
Enter your OBI Server username and password in the <em>User </em>and <em>Password </em>fields.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_DataServer.png" src="http://blogs.oracle.com/dataintegration/BI_Server_DataServer.png" width="366" height="380" class="mt-image-none" style="" /></span></p>

<p>Click on the <em>JDBC</em> tab.</p>

<p>Enter the JDBC Driver Name and JDBC URL in their respective fields:<br />
-	JDBC Driver:  <strong>oracle.bi.jdbc.AnaJdbcDriver</strong><br />
-	JDBC URL: <strong> jdbc:oraclebi://localhost:9703/ </strong>(modify it according to your environment settings)</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_DataServer_2.png" src="http://blogs.oracle.com/dataintegration/BI_Server_DataServer_2.png" width="374" height="326" class="mt-image-none" style="" /></span></p>

<p><em><u>Note:</u> <br />
The OBI Server JDBC Driver is not in the Driver list, you need to type the Driver name in the JDBC Driver field. <br />
Make sure that there are no spaces at the end or at the beginning of each string.<br />
The JDBC URL needs to end with the '/' character otherwise you'll receive an error while trying to connect.</em></p>

<p>When you are done click on the Properties tab. We need to add 2 properties.</p>

<p>Click on the Insert button to add a Key. <br />
Enter <strong>Catalog </strong>in the Key field and the name of the OBI Catalog you would like to access in the Value field.<br />
In this example I used a catalog called Paint.</p>

<p>Click on the Insert button to add a second Key.<br />
Enter <strong>NQ_SESSION.SELECTPHYSICAL</strong> in the Key field and <strong>yes </strong>in the Value field.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_DataServer_3.png" src="http://blogs.oracle.com/dataintegration/BI_Server_DataServer_3.png" width="455" height="156" class="mt-image-none" style="" /></span></p>

<p>Click on <strong>Test </strong>to validate the connection information. <br />
Click <strong>OK </strong>to close the Successful Connection window.</p>

<p>Click <strong>OK </strong>to save and close the Data Server window.</p>

<p>A Physical Schema window should pop up.<br />
In the <em>Catalog (Catalog)</em> list select the Catalog you would like to access.<br />
In the <em>Catalog (Work Catalog) </em>list select the same Catalog.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_PSchema_1.png" src="http://blogs.oracle.com/dataintegration/BI_Server_PSchema_1.png" width="345" height="427" class="mt-image-none" style="" /></span></p>

<p>Verify that the <em>Local Object Mask</em> and <em>Remote Object Mask</em> fields are set to "%CATALOG"."%OBJECT".<br />
Click on the <em>Context </em>tab then click on the Insert button to add a row.</p>

<p>Select a context in the <em>Context </em>column and select a Logical Schema or type a new Logical Schema name in the <em>Logical Schema </em>column. I used <strong>BIEE_LSCHEMA</strong> in this example.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="BI_Server_PSchema_2.png" src="http://blogs.oracle.com/dataintegration/BI_Server_PSchema_2.png" width="329" height="403" class="mt-image-none" style="" /></span></p>

<p>Click <strong>OK </strong>to save and close the Physical Schema window.</p>

<p>We now have successfully created the infrastructure we need to use OBI Server in our ODI processes.</p>

<p>In another post I will describe how to use OBI EE as a source in an ODI interface.</p>]]>
      
   </content>
</entry>

<entry>
   <title>Creating a New Knowledge Module for Sample Data Sets Generation</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/creating_a_new_knowledge_modul.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14635</id>
   
   <published>2009-10-02T06:01:00Z</published>
   <updated>2009-10-02T00:13:12Z</updated>
   
   <summary>This post will look into when and how to create a knowledge module. Then it will walk through some of the choices that can be made when designing a Knowledge Module. A complete KM is provided to support the explanations.
</summary>
   <author>
      <name>Christophe Dupupet</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="etl" label="ETL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="interface" label="Interface" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="km" label="KM" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="knowledgemodule" label="Knowledge Module" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="stagingtable" label="Staging table" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="userfunction" label="User Function" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="datageneration" label="data generation" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="randomsample" label="random sample" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="samplegeneration" label="sample generation" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>Looking for <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Data Integration at OpenWorld 2009</a>? <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Click here</a>!</p>

<p><em>The posts in this series assume that you have some level of familiarity with ODI. The concepts of Interface and Knowledge Module are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for detailed information.</em>.<br />
In particular, to learn more on Knowledge Modules, I strongly recommend the <em> Knowledge Module Developer's Guide - Fundamentals </em> that comes with the product. You will have to <a href="http://otn.oracle.com/goto/odi"> download and install ODI </a> to access this document in the Documentation Library.</p>

<p>This post will look into <em>"when"</em> and <em>"how"</em> to create a knowledge module. Then it will walk through some of the choices that can be made when designing a Knowledge Module.</p>

<p>To illustrate the descriptions, we are working on an example described previously in <a href="http://blogs.oracle.com/dataintegration/2009/09/generating_sample_data_with_od.html">this post</a>.</p>

<p><br />
<strong>1. WHAT BELONGS TO A KNOWLEDGE MODULE?</strong></p>

<p>The first element to look into is what parts of the logic of your code are reusable. What you are typically looking for are the following:<ul><li>Sequences of steps that are repeated commonly, even though some steps may be optional. For instance: creation of a staging table, creation of a script or parameter file for a utility, invoking an external program, extraction of data from a database, etc.</li><br />
	<li>For each step, identification of the non variable parts vs. the variable parts. For instance, in a select statement, the body of the code remains the same. In the following example, the elements in brackets are variables, the others are fixed:</li><ul><li>	 <em>Insert into [TableName] ([ListOfColumns]) select ([ListOfColumns and Expressions]) from [List of Tables] where [conditions]</em></li></ul></li><br />
	<li>For your module to be re-usable, you want to make sure that no information that physically relates your code to any system or table structure is left out of the code. The idea behind the KMs is that as developers will build their transformations and mappings, ODI will "fill in the blanks" with the appropriate data.</li><br />
</ul><br />
The easiest way to get started with a knowledge module is actually to take an existing one and modify it. As the syntax has already been validated in existing KMs, the amount of work required to produce valid code will be greatly reduced.<br />
In most cases, column names, mapping expressions do not belong to a knowledge module. The exception would be administrative columns that you add as part of the logic of your KM. For instance, most <em>Incremental Update</em> knowledge modules that ship with ODI create an <em>IND_UPDATE</em> column to differentiate records that will be updated from those that will be inserted. These columns definitely belong in the code of the KM.</p>

<p>Likewise, you may want to create your own tables (administrative tables, audit tables, etc.) with a very static name. These can be created by the Knowledge Module. But in general, it is better to dynamically generate the table name after the table being loaded, to prevent multiple processes running in parallel from trying to use the same intermediate table.</p>

<p><br />
<strong>2. DO I HAVE A CASE FOR A KNOWLEDGE MODULE?</strong></p>

<p>Any technique used to extract data out of a database (or file, or messaging system, or web service for that matter) can be a good opportunity to create a new KM. The same is true for loading techniques and integration techniques: inserts, updates, slowly changing dimension, etc.</p>

<p>In the scenario that we are contemplating, we want to insert data (albeit random data) into a table, so we probably have a good case for a knowledge module.</p>

<p>The first step is usually to look for available techniques, try the code independently of any knowledge module, and check out how it behaves: how is performance? How does the code behave when data volume grows? You want to make sure that the code you will integrate as a template is as good as it can be before you share it with the entire corporation!</p>

<p>Typically, extracting from a source system to stage data is done in an LKM. Loading data into a target table is done with an IKM. In our case, we will clearly create an IKM.</p>

<p><br />
<strong>3. RANDOM DATA GENERATION: CODE GENESIS</strong></p>

<p>For our example, will start with a KM that works exclusively for Oracle Databases. Adaptations of the code will be possible later on to make similar processes run on other databases.</p>

<p>The Oracle database provides a fantastic feature that we can leverage to generate a large number of records: <em>group by cube</em>: it returns all the possible permutation for the selected columns. So the following code:</p>

<p><em>select NULL from dual group by cube(1,1,1) </em></p>

<p>returns 8 records (2 to the power 3). Add columns for the list for the permutations, and you are adding an exponential number of records. </p>

<p>Now when I played with this function on my (very) little installation of the database, I seemed to hit a limit for (very) large permutation numbers. I have to admit that I am not using the function in its expected fashion, no I cannot really complain. But at least I can easily generate 1024 records (2 to the power 10). Now from a usability perspective, I do not really want to use that number for the users of my KM (1024 has a geeky flavor to it, doesn't it?). How about generating a table with just 1,000 records?</p>

<p>The following code will do the trick:</p>

<p><em>select NULL from dual group by cube(1,1,1,1,1,1,1,1,1,1)<br />
where rownum<=1000</em></p>

<p>Note that so far, all the instructions we have are hard-coded. We still do not have anything that would be dynamic in nature.</p>

<p>Now we need to use the above query to create some table with our 1,000 records. Again, we can hard-code the table name - but this does not make for very portable code. In particular, from one environment to the next, the database schema names will vary. We have three options to create our staging table, from the least portable to the most portable:<ul><li>Hardcoded table name and schema name: myschema.SEED</li><br />
	<li>Dynamic schema name, hardcoded table name: let ODI retrieve the proper schema name and automatically update the code at execution time: <%=odiRef.getObjectName("L", "SEED", "W")%> (Generated code: myschema.SEED)</li><br />
	<li>Fully dynamic table name and schema name (usually, dynamic tables are named after the target table with some sort of extension): <%=snpRef.getTable("L", "TARG_NAME", "A")%>_SEED (generated code: if you are loading TRG_CUSTOMERS, then the SEED table name is myschema.TRG_CUSTOMER_SEED)</li><br />
</ul><br />
Best practice is of course to use the last one of these options to allow for multiple processes to run in parallel. To keep our explanations simple, we will use the second option above - but keep in mind that best practice would be to use the fully dynamic one.</p>

<p>As we will use our KM over and over, it is important to make the developer's life easy. Steps have to be included here to create our seeding table, drop it when we are done, and make sure before we create it that it is not there from a previous run that could have failed. <br />
The typical sequence of steps for a KM creating any type of staging table is:<ul><li>Drop table (and ignore errors - if there is no table, we are fine)</li><br />
	<li>Create table (re-create it to reflect any possible meta-data changes)</li><br />
	<li>Load the table with staging data - in our case a sequence of numbers that we will be able to leverage later on for filtering... (please be patient: we will come back to this). Here a rownum will do the trick...</li><br />
</ul><br />
Now that we have the code to insert data into our staging table, we can put all the pieces together and have the first three steps of our knowledge module. Keep in mind that you have to be consistent from one step to the next as you name your table. <a href="http://blogs.oracle.com/dataintegration/2009/09/09/SampleBuilder.zip">The actual knowledge module with all the matching code is available here</a> (look for KM_IKM Oracle - Build Sample Data - Gen II.xml).</p>

<p><br />
<strong>4. COMPLETING THE CODE </strong></p>

<p>So far our table only has 1,000 records. Not much in terms of volume. But all we need now to create a table with 1,000,000 records... is a Cartesian product (you know, the one thing your mother told you NOT to do with a database? It comes very handy here!):</p>

<p><em>insert into [Target] ([Columns]) Select * from SEED S1, SEED s2</em></p>

<p>And if we want to return less records, all we have to do is filter on the S2 table. For instance the clause:</p>

<p><em>where S2.SEED_ID<=10</em> </p>

<p>will return 10,000 records!. Remember when we stored rownums in this table earlier? This is where it becomes very handy...</p>

<p>So far the only thing we have done is to generate a fairly large number of records. Where the exercise becomes even more interesting is if we can generate data for each record that matches our requirements for sample data. In a <a href="http://blogs.oracle.com/dataintegration/2009/09/odi_user_functions_a_case_stud.html">previous post</a> we have seen how to generate User Functions in ODI to abstract this type of random generation. The code for the sample data generation typically does not belong to the Knowledge Module as it would not give us enough flexibility for all the possible combinations out there.</p>

<p>The User Function examples used before can generate numerics and strings. We could expand their design to generate random phone numbers, or random social security numbers... and work with random data that will now look like real data, instead of exposing sensitive information.</p>

<p><strong>5. ADDING FLEXIBILITY TO THE KNOWLEDGE MODULE</strong></p>

<p>The fact that User Functions do not belong to the code of the Knowledge Module does not mean that there is no flexibility in the Knowledge Modules. Here, we are building a sample table out of thin air: it is very possible that the table does not exist in the first place. Or if want to run multiple tests with different amounts of records each time, we may want to truncate the table before each new run.</p>

<p>KM options are a very simple way to toggle such behaviors in a KM. We can create 2 options: CREATE_TABLE and TRUNCATE. Then create the appropriate steps in our KM: <ul><li>Create Target Table</li><br />
	<li>Truncate table</li><br />
</ul><br />
When you want to associate an option to a given step, edit the step itself; then click on the "option" tab and un-check "always execute". Select only the appropriate option in the list and click OK...</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="KM_Option.PNG" src="http://blogs.oracle.com/dataintegration/KM_Option.PNG" width="721" height="501" class="mt-image-none" style="" /></span></p>

<p>As we define the options, it is also good to think of the most common usage for the KM. In our case, chances are we will often want to create the table and truncate it for successive runs: we can then define that these steps will be executed by default (set the default for the variables to "Yes". More conventional KMs would typically have these options, but their defaults would be set to "No".</p>

<p>We now have a complete Knowledge Module that can be used to generate between 1,000 and 1,000,000 records in any table of your choice, complete with options that will let the users of the KM adapt the behavior to their actual needs...</p>

<p>Again, if you want to review all the code in details, it is available <a href="http://blogs.oracle.com/dataintegration/2009/09/09/SampleBuilder.zip">here</a> (look for KM_IKM Oracle - Build Sample Data - Gen II.xml).</p>

<p>Enjoy!</p>

<p><em>Screenshots were taken using version 10.1.3.5 of ODI. Actual icons and graphical representations may vary with other versions of ODI.</em><br />
</p>]]>
      
   </content>
</entry>

<entry>
   <title>Oracle Welcomes GoldenGate at OpenWorld</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/10/oracle_welcomes_goldengate_at.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14701</id>
   
   <published>2009-10-01T18:40:37Z</published>
   <updated>2009-10-02T21:48:55Z</updated>
   
   <summary> Oracle has completed the acquisition of GoldenGate Software, a leading provider of real-time data integration solutions, making GoldenGate a wholly owned subsidiary of Oracle. We&apos;re especially excited to welcome Oracle GoldenGate. We invite you to learn more about GoldenGate...</summary>
   <author>
      <name>dain.hansen</name>
      
   </author>
   
   <category term="continuousavailability" label="Continuous Availability" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="datasynchronization" label="Data Synchronization" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="disasterrecovery" label="Disaster Recovery" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="goldengate" label="GoldenGate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="highavailability" label="High Availability" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odiee" label="ODI-EE" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegration" label="Oracle Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oraclegoldengate" label="Oracle GoldenGate" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="replication" label="Replication" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p><br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="GG_header.jpg" src="http://blogs.oracle.com/dataintegration/GG_header.jpg" width="614" height="120" class="mt-image-none" style="" /></span></p>

<p>Oracle has completed the acquisition of GoldenGate Software, a leading provider of real-time data integration solutions, making GoldenGate a wholly owned subsidiary of Oracle.</p>

<p>We're especially excited to welcome Oracle GoldenGate. We invite you to learn more about GoldenGate and Oracle through <a href="http://www35.cplan.com/cc221_new/newCatalog.jsp?ilc=221-1&ilg=english&isort_sessions=&isort_demos=&isort_exhibitors=&is=yes&isort_sessions_type=&isort_exhibitors_type=&isort_demos_type=&icriteria2=openworldspecificgg&search_sessions=yes&icriteria1=+&icriteria8=&openTagSearch=openworldspecificgg&icriteria9=+&icriteria6=&icriteria3=+&icriteria4=+&icriteria7=&search_advance=yes&horizontal1=20">dedicated sessions at Oracle OpenWorld</a>.</p>

<p>See the latest product offerings at Oracle OpenWorld: Visit the <a href="http://www35.cplan.com/cc221_new/newCatalog.jsp?ilc=221-1&ilg=english&isort_sessions=&isort_demos=&isort_exhibitors=&is=yes&isort_sessions_type=&isort_exhibitors_type=&isort_demos_type=&icriteria2=&search_exhibitors=yes&icriteria1=+&icriteria8=goldengate&openTagSearch=&icriteria9=+&icriteria6=&icriteria3=+&icriteria4=+&icriteria7=&search_advance=yes&horizontal1=20">GoldenGate booth </a>at 3709 Moscone West.</p>

<p>Find Oracle OpenWorld events and content especially relevant to customers of Oracle's GoldenGate products: Download the document "Focus on <a href="http://www.oracle.com/ocom/groups/public/@ocompublic/documents/webcontent/032698.pdf">Data Integration and GoldenGate</a>."</p>

<p>Come to our website to find out more about the <a href="http://www.oracle.com/goto/odi">Oracle GoldenGate products</a>!</p>]]>
      
   </content>
</entry>

<entry>
   <title>ODI User Functions: A Case Study</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/09/odi_user_functions_a_case_stud.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14508</id>
   
   <published>2009-09-21T04:29:37Z</published>
   <updated>2009-09-21T00:31:22Z</updated>
   
   <summary>Using one of the ODI User Functions that were described in a previous post, we review how to design and use User Functions in ODI. </summary>
   <author>
      <name>Christophe Dupupet</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="etl" label="ETL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="interface" label="Interface" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="km" label="KM" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="knowledgemodule" label="Knowledge Module" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="stagingtable" label="Staging table" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="userfunction" label="User Function" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="datageneration" label="data generation" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="random" label="random" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="sample" label="sample" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="samplegeneration" label="sample generation" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p>Looking for <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Data Integration at OpenWorld 2009</a>? Check out <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">here</a>!</p>

<p><em>The posts in this series assume that you have some level of familiarity with ODI. The concepts of Interface and User Function are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for detailed information.</em>.</p>

<p>This post will give some examples of how and where user functions can be used in ODI. We will look back at a <a href="http://blogs.oracle.com/dataintegration/2009/09/generating_sample_data_with_od.html">previous post</a> and see why and how user functions were created for this case.</p>

<p><strong>1. A CASE FOR USER FUNCTIONS</strong></p>

<p>As I was trying to design a simple way to generate random data, I simple approach to specify the type of data to be generated. An example would be to easily generate a random string.</p>

<p>Working on Oracle for this example, I could leverage the database function DBMS_RANDOM.STRING. It takes 2 parameters: one for the type of characters (uppercase, lowercase, mixed case), and on for the length of the string. But I want a little more than this: I also want the ability to force my generation to have a minimum number of characters. For this, I now need to generate a random number. The database function DBMS_RANDOM.VALUE does this, but returns a decimal value. Well, the TRUNC function can take care of this... but my mapping expression becomes somewhat complex:</p>

<p><em>DBMS_RANDOM.STRING(Format, TRUNC(DBMS_RANDOM.VALUE(MinLen,MaxLen)))</em></p>

<p>Imagine now using this formula over and over again in your mappings - not the easiest and most readable portion of code to handle. And maintenance will easily become a nightmare if you simply cut and paste...</p>

<p>A user function makes sense at this point, and will provide the following benefits:<ul><br />
	<li>A readable name that makes the usage and understanding of the transformation formula a lot easier</li><br />
	<li>A central place to maintain the transformation code</li><br />
	<li>The ability to share the transformation logic with other developers who do not have to come up with the code for this anymore.</li><br />
</ul></p>

<p>From a code generation perspective, if you use the User Function in your interfaces, ODI will replace the function name with the associated code and send that code to the database. Databases will never see the User Function name - the substitution is part of the code generation.</p>

<p><strong>2. BUILDING THE USER FUNCTION</strong></p>

<p>You need to provide 3 elements when you build a user function:<ul><br />
	<li>A name (and a group name to organize the functions)</li><br />
	<li>A syntax</li><br />
	<li>The actual code to be generated when the developers will use the functions</li><br />
</ul></p>

<p><br />
<strong>2.1 Naming the User Function</strong></p>

<p>The name of the user function is yours to choose, but make sure that it properly describes what this function is doing: this will make the function all the more usable for others. You will also notice a drop down menu that will let you select a group for this function. If you want to create a new group, you can directly type the group name <em>in</em> the drop down itself.</p>

<p>For our example, we will name the user Function <em>RandomString</em> and create a new group called <em>RandomGenerators</em>.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="User Function Name" src="http://blogs.oracle.com/dataintegration/UserFunctionName.PNG" width="391" height="105" class="mt-image-none" style="" /></span></p>

<p><br />
<strong>2.2 The User Function Syntax</strong></p>

<p>The next step will be to define the syntax for the function. Parameters are defined with a starting dollarsign: <br />
$ <br />
and enclosed in parenthesis:<br />
(). <br />
You can name your parameters as you want: these names will be used when you put together the code for the user functions, along with the $ and (). You can have no parameters or as many parameters as you want...</p>

<p>In our case, we need 3 parameters: One for the string format, one for the minimum length of the generated string, one for the maximum length. Our syntax will hence be:</p>

<p><em>RandomString($(Format), $(MinLen), $(MaxLen)) </em></p>

<p>If you want to force the data types for the parameters, you can do so by adding the appropriate character after the parameter name: <strong>s</strong> for String, <strong>n</strong> for Numeric and <strong>d</strong> for Date. In that case our User Function syntax would be:</p>

<p><em>RandomString($(Format)s, $(MinLen)n, $(MaxLen)n)</em></p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="User Function Syntax" src="http://blogs.oracle.com/dataintegration/UserFunctionSyntax.PNG" width="389" height="396" class="mt-image-none" style="" /></span></p>

<p><br />
<strong>2.3 Code of the User Function</strong></p>

<p>The last part in the definition of the user function will be to define the associated SQL code. To do this, click on the <em>Implementation</em> tab and click the <em>Add</em> button. A window will pop up with two parts: the upper part is for the code per se, the bottom part is for the selection of the technologies where this syntax can be used. Whenever you will use the User Function in your mappings, if the underlying technology is one of the ones you have selected, then ODI will substitute the function name with the code you enter here.</p>

<p>For our example, select <em>Oracle</em> in the list of <em>Linked Technologies</em> and type the following code in the upper part:</p>

<p><em>DBMS_RANDOM.STRING($(Format), TRUNC(DBMS_RANDOM.VALUE($(MinLen),$(MaxLen))))</em></p>

<p>Note that we are replacing here the column names with the names of the parameters we have defined in the syntax field previously.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="User Function Code" src="http://blogs.oracle.com/dataintegration/UserFunctionCode.PNG" width="582" height="372" class="mt-image-none" style="" /></span></p>

<p>Click on the <em>Ok</em> button to save your syntax and on the <em>Ok</em> or <em>Apply</em> button to save your User Function.</p>

<p><Strong>3. EXPANDING THE USER FUNCTIONS TO OTHER TECHNOLOGIES</Strong></p>

<p>Once we are done with the previous step, the user function is ready to be used. One downside with our design so far: it can only be used on one technology. Chances are we will need a more flexibility.</p>

<p>One key feature of the User Functions is that they will give you the opportunity to enter the matching syntax for any other database of your choice. No matter which technology you will use later on, you will only have to provide the name of the user function, irrespectively of the underlying technology. </p>

<p>To add other implementations and technologies, simply go back to the <em>Implementation</em> tab of the User Function, click the <em>Add</em> button. Select the technology for which you are defining the code, and add the code. </p>

<p>Note that you can select multiple technologies for any given code implementation: these technologies will then be listed next to one antother.</p>

<p><Strong>4. USING THE USER FUNCTIONS IN IINTERFACES</Strong></p>

<p>To use the User Functions in your interfaces, simply enter them in your mappings, filters, joins and constraints the same way you would use SQL code.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Interface Mappings" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerInterfaceMappings.PNG" width="605" height="142" class="mt-image-none" style="" /></span></p>

<p>When you will execute your interface, the generated code can be reviewed in the Operator interface. Note that you should never see the function names in the generated code. If you do, check out the following elements:<ul><br />
	<li>User Function names are case sensitive. Make sure that you are using the appropriate combination of uppercase and lowercase characters</li><br />
	<li>Make sure that you are using the appropriate number of parameters, and that they have the appropriate type (string, number or date)</li><br />
	<li>Make sure that there is a definition for the User Function for the technology in which it is running. This last case may be the easiest one to oversee, so try to keep it in mind!</li><br />
</ul><br />
As long as you see SQL code in place of the User Function name, the substitution happened successfully.</p>

<p>Enjoy!</p>

<p><em>All Screenshots were taken using version 10.1.3.5 of ODI. Actual icons and graphical representations may vary with other versions of ODI.</em><br />
</p>]]>
      
   </content>
</entry>

<entry>
   <title>How to Define Multi Record Format Files in ODI</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/09/managing_multi_record_format_f.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14331</id>
   
   <published>2009-09-14T00:18:59Z</published>
   <updated>2009-09-13T23:19:43Z</updated>
   
   <summary>The posts in this series assume that you have some level of familiarity with ODI. The concepts of Datastore, Model and Logical Schema are used here assuming that you understand them in the context of ODI. If you need more...</summary>
   <author>
      <name>julien.testut</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="etl" label="ETL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="model" label="Model" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="sunopsis" label="Sunopsis" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="datastore" label="datastore" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="file" label="file" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="format" label="format" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="multirecordformat" label="multi record format" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p><em>The posts in this series assume that you have some level of familiarity with ODI. The concepts of Datastore, Model and Logical Schema are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for more details.</em></p>
<p dir="ltr" style="MARGIN-RIGHT: 0px">It is not unusual to have to load files containing various record formats. For example a company might store orders and order lines using distinct record formats in the same flat file or you might have one single file containing a header, some records and a footer. <br />In this post, we'll use the following source file as an example: </p>
<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<p dir="ltr" style="MARGIN-RIGHT: 0px"><br /><em>1,101,2009/09/01,Computer Parts<br />2,234,101,Motherboard, Asus P6T,239.99<br />2,235,101,CPU,Intel Celeron 430,40<br />1,102,2009/09/02,Computer Parts<br />2,301,102,CPU,AMD Phenom II X4,170<br />1,103,2009/09/05,Printers<br />2,401,103,Inkjet Printer,Canon iP4600,69.99<br />2,402,103,Inkjet Printer,Epson WF30,39.99<br />2,403,103,Inkjet Printer,HP Deskjet D2660,49.99</em></p></blockquote>
<p dir="ltr" style="MARGIN-RIGHT: 0px">As we can see the Order and Order Lines records have different formats (one has 4 fields, the other has 6 fields), they could also have a different field separator.</p>
<p><strong>Identifying the Record Codes</strong></p>
<p>The first step in order to handle such a file in ODI is to identify a record code, this record code should be unique for a particular record type. In our example&nbsp;the record code will be used by ODI&nbsp;to identify if the record is an Order or an Order Line. All the Order records should have the same record code, this also applies to the Order Lines records. <br />In our example the first field indicates the record code: <br />- 1 for Orders records.<br />- 2 for Order Lines records.</p>
<p><strong>Define the Datastores</strong></p>
<p>We assume that you have already created a Model using a Logical Schema that points to the directory containing your source file. </p>
<p>We will start by defining a datastore for the Order records.</p>
<p>Right-click on the File model and select Insert Datastore.<br />In the Definition tab, enter a name and specify the flat file resource name in the Resource Name field.&nbsp;</p>
<p><img class="mt-image-none" height="184" alt="Order_Datastore.jpg" src="http://blogs.oracle.com/dataintegration/Order_Datastore.jpg" width="374" /></p>
<p>
<p>
<p>In the Files tab, specify your flat file settings (delimiter, field separator etc.)</p>
<p>Refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">ODI documentation </a>for additional information regarding how to define a flat file datastore.</p>
<p></p>
<p></p>
<p>In our example the Order records have 4 fields:<br />- RECORD_TYPE<br />- ORDER_ID<br />- ORDER_DATE<br />- ORDER_TYPE</p>
<p>Go to the columns tab and add&nbsp;those 4 columns&nbsp;to your datastore.</p>
<p>Now specify the Record Code in the 'Rec. Code' field of the RECORD_CODE column. </p>
<p>
<p>
<p><img class="mt-image-none" height="193" alt="Order_Datastore_Columns.jpg" src="http://blogs.oracle.com/dataintegration/Order_Datastore_Columns.jpg" width="542" /></p>
<p>Click OK.</p>
<p></p>
<p></p>
<p>In the Models view, right-click on the datastore and select View Data to display the file content and make sure it is defined correctly.&nbsp;</p>
<p>
<p><img class="mt-image-none" height="168" alt="Order_Datastore_Data.jpg" src="http://blogs.oracle.com/dataintegration/Order_Datastore_Data.jpg" width="350" /></p>
<p>The data is filtered based on the record code value, we only see the Order records.</p>
<p></p>
<p>We will now apply the same approach to the Order Lines record.</p>
<p>Right-click on the File model and select Insert Datastore to add a second datastore for the Order Lines record.</p>
<p>In the Definition tab, enter a name and specify the flat file resource name in the Resource Name field. We are pointing this datastore to the same file we used for the Order records.&nbsp;</p>
<p>
<p><img class="mt-image-none" height="193" alt="Order_Line_Datastore.jpg" src="http://blogs.oracle.com/dataintegration/Order_Line_Datastore.jpg" width="398" /></p>
<p>In the Files tab, specify your flat file settings (delimiter, field separator etc.).<br />Refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">ODI documentation </a>for additional information regarding how to define a flat file datastore.</p>
<p></p>
<p></p>
<p>In our example the Order Lines records have 6&nbsp;fields:<br />- RECORD_TYPE<br />- LORDER_ID<br />- ORDER_ID<br />- LINE_ORDER_TYPE<br />- ITEM<br />- PRICE</p>
<p>Go to the columns tab and add&nbsp;those&nbsp;6 columns&nbsp;to your datastore. </p>
<p>Now specify the Record Code in the 'Rec. Code' field of the RECORD_CODE column.</p>
<p>
<p><img class="mt-image-none" height="207" alt="Order_Line_Datastore_Columns.jpg" src="http://blogs.oracle.com/dataintegration/Order_Line_Datastore_Columns.jpg" width="578" /></p>
<p>Click OK.</p>
<p></p>
<p>Right-click on the datastore and select View Data to display the file content and make sure it is defined correctly.</p>
<p>
<p><img class="mt-image-none" height="224" alt="Order_Line_Datastore_Data.jpg" src="http://blogs.oracle.com/dataintegration/Order_Line_Datastore_Data.jpg" width="585" /></p>
<p>The data is filtered based on the record code value, we only see the Order Lines records.</p>
<p>You can now use those 2 datastores in your interfaces.</p>
<p></p>
<p><em>All Screenshots were taken using version 10.1.3.5 of ODI. Actual icons and graphical representations may vary with other versions of ODI.</em><br /></p>]]>
      
   </content>
</entry>

<entry>
   <title>Generating Sample Data with ODI: A Case Study For Knowledge Modules and User Functions</title>
   <link rel="alternate" type="text/html" href="http://blogs.oracle.com/dataintegration/2009/09/generating_sample_data_with_od.html" />
   <id>tag:blogs.oracle.com,2009:/dataintegration//297.14283</id>
   
   <published>2009-09-10T05:09:09Z</published>
   <updated>2009-10-02T01:45:39Z</updated>
   
   <summary>Using ODI to generate random sample data sets out of thin air, using a combination of Knowledge Module and User Functions.</summary>
   <author>
      <name>Christophe Dupupet</name>
      
   </author>
   
   <category term="dataintegration" label="Data Integration" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="dataintegrator" label="Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="elt" label="ELT" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="etl" label="ETL" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="ikm" label="IKM" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="interface" label="Interface" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="km" label="KM" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="knowledgemodule" label="Knowledge Module" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="model" label="Model" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="odi" label="ODI" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="oracledataintegrator" label="Oracle Data Integrator" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="stagingtable" label="Staging table" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="sunopsis" label="Sunopsis" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="userfunction" label="User Function" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="datageneration" label="data generation" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="sample" label="sample" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="samplegeneration" label="sample generation" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="temporarytable" label="temporary table" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="en" xml:base="http://blogs.oracle.com/dataintegration/">
      <![CDATA[<p><strong>Looking for <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Data Integration at OpenWorld 2009</a>? Look no further: all you need is <a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">here</a>!</strong></p>

<p><em>The posts in this series assume that you have some level of familiarity with ODI. The concepts of Interface, Model, Knowledge Module and User Function are used here assuming that you understand them in the context of ODI. If you need more details on these elements, please refer to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/documentation/oracledi_getting_started.pdf">ODI Tutorial</a> for a quick introduction, or to the <a href="http://www.oracle.com/technology/products/oracle-data-integrator/10.1.3/htdocs/1013_support.html">complete ODI documentation</a> for detailed information.</em></p>

<p><br />
We've all been there: we start coding, waiting for a set of sample data to be available. We move along with the code... and the data is not available. Or we need to build a small (or not so small) data set quickly. Sure, we all have sample databases left and right for that purpose. But recently I was looking for a decent size data set for some tests (more than the traditional 30 sample records) and could not put my hands on what I needed. What the heck: why not have ODI build this for me?</p>

<p>The techniques that we will leveraged for this are the following:<br />
<ul>	<li>	Creation of a temporary interface to create the sample table (See this <a href="http://blogs.oracle.com/dataintegration/2009/09/designing_and_loading_your_own.html">previous post</a> for details on how to create a temporary interface)</li><br />
	<li>	Creation of a new knowledge module to generate enough records in the new table</li><br />
	<li>	Creation of <a href="http://blogs.oracle.com/dataintegration/2009/09/odi_user_functions_a_case_stud.html">ODI User Functions</a> to simplify the generation of random values</li><br />
</ul></p>

<p><br />
All the objects mentioned in this article can be downloaded. Save <span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blogs.oracle.com/dataintegration/2009/09/09/PROJ_SampleBuilder.xml">this XML file</a></span> if you want to import in your repository a project that already contains all the objects (IKM and User functions). Click <span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blogs.oracle.com/dataintegration/2009/09/09/SampleBuilder.zip">here</a></span> if you want to download a file that will let you import the different objects individually. You will have to unzip the file before importing the objects in the later case.<br />
 <br />
The samples provided here have all been designed for an Oracle database, but can be modified and adapted for other technologies.</p>

<p>Today we will discuss the different elements that allow us to generate the sample data set. In future posts, we will dissect the <a href="http://blogs.oracle.com/dataintegration/2009/09/creating_a_new_knowledge_modul.html">Knowledge Modules</a> and <a href="http://blogs.oracle.com/dataintegration/2009/09/odi_user_functions_a_case_stud.html">User Functions</a> to see what technological choices were made based on the different challenges that had to be solved.</p>

<p><strong>1. THE INTERFACE </strong></p>

<p>For more details on how to create a temporary interface, you can refer to <a href="http://blogs.oracle.com/dataintegration/2009/09/designing_and_loading_your_own.html">this post</a>. For our example, we will create a new table in an existing schema. When you create your temporary interface, remember to set the following elements:<br />
<ul>	<li>	Select of your staging area ( In the <em>Definition</em> tab of the interface)</li><br />
	<li>	Name your target table</li><br />
	<li>	Select the location of your target table (work schema / data schema)</li><br />
	<li>	Name the <em>Columns</em>, and set their individual <em>data type and length</em></li><br />
</ul></p>

<p><br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Interface Definition Tab" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerInterfaceDefinition.PNG" width="229" height="210" class="mt-image-none" style="" /></span></p>

<p>For our example, we will use a fairly simple table structure:<br />
TABLE NAME: <blockquote>SAMPLER</blockquote><br />
COLUMNS: <blockquote>SAMPLER_ID			number(3)<br />
SAMPLER_NAME			varchar2(30)<br />
SAMPLER_PROMOTION		varchar2(10)<br />
SAMPLER_PRICE			number(10,2)<br />
SAMPLER_RELEASE_DATE	date</blockquote></p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Sampler Interface Table Creation" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerInterfaceTableCreation.PNG" width="440" height="437" class="mt-image-none" style="" /></span></p>

<p><strong>2. USER FUNCTIONS </strong></p>

<p>The Oracle database comes with a package called DBMS_RANDOM. Other random generators can be used (DBMS_CRYPTO for instance has random generation functions as well). These functions take more or less parameters, and if we realize after creating dozens of mappings that using the "other" package would have been better... we would be in a lot of trouble. Creating user functions will allow us to:<br />
<ul>	<li>	Have a naming convention that is simplified</li><br />
	<li>	Limit the number of parameters</li><br />
	<li>	Limit the complexity of the code</li><br />
	<li>	Later maintain the code independently of our interfaces, in a centralized location: if we decide to change the code entirely, we will make modifications in one single place - no matter how often we use that function.</li><br />
</ul></p>

<p><br />
For our example, we will have 5 ODI user functions in ODI (again, these can be downloaded <span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blogs.oracle.com/dataintegration/2009/09/09/SampleBuilder.zip">here</a></span>):<br />
<ul>	<li>RandomDecimal(Min, Max): generates a random value (with decimals) between  the Min and Max values</li><br />
	<li>	RandomNumber(Min, Max): generates a random value (without decimals) between  the Min and Max values</li><br />
	<li>	RandomBool(): generate a 0 or a 1</li><br />
	<li>	RandomDate(MinDate, MaxDate): returns a date between MinDate and MaxDate (make sure MinDate and MaxDate are valid dates for Oracle)</li><br />
	<li>	RandomString(Format, Min, Max): generates a random string with a minimum of Min characters and a maximum of Max characters. Valid formats are:<br />
<ul>	<li>	'u', 'U' - returning string in uppercase alpha characters</li><br />
	<li>	'l', 'L' - returning string in lowercase alpha characters</li><br />
	<li>	'a', 'A' - returning string in mixed case alpha characters</li><br />
	<li>	'x', 'X' - returning string in uppercase alpha-numeric characters</li><br />
	<li>	'p', 'P' - returning string in any printable characters. </li><br />
</ul></li></ul></p>

<p><br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="SamplerUserFunctions.PNG" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerUserFunctions.PNG" width="229" height="222" class="mt-image-none" style="" /></span></p>

<p>We can either use these functions as is or as part of a more complex code logic, such as a case...when statement.</p>

<p>For our example, we will build the following mappings: <table border="1"><br />
<tr><th>Column</th><th>Mapping</th></tr><br />
<tr><td>SAMPLER_ID</td><td>RandomNumber(1,999)</td></tr><br />
<tr><td>SAMPLER_NAME</td><td>RandomString('A', 1, 30)</td></tr><br />
<tr><td>SAMPLER_PROMOTION</td><td>case when RandomBool()=0 then 'FALSE'<br />
			else 'TRUE'<br />
			end</td></tr><br />
<tr><td>SAMPLER_PRICE</td><td>RandomDecimal(1,10000)</td></tr><br />
<tr><td>SAMPLER_RELEASE_DATE</td><td>RandomDate('01-JAN-2000', sysdate)</td></tr><br />
</table></p>

<p><br />
In ODI, the mappings will look like this:</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Sampler Interface Mappings" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerInterfaceMappings.PNG" width="605" height="142" class="mt-image-none" style="" /></span></p>

<p><strong>3. THE KNOWLEDGE MODULE </strong></p>

<p>Since we do not have any source table in this interface, we only need an IKM. The IKM provided will this example needs to be imported in your project.</p>

<p>Because the purpose of this KM is to generate sample data, it will have a few options where the default values will be different from the usual KMs:<br />
<ul>	<li>	TRUNCATE defaults to 'YES': we assume here that if you re-run the interface, you want to create a new sample. If you only want to add more records to an existing table, simply set this option to 'NO' in your interface.</li><br />
	<li>	CREATE_TABLE defaults to 'YES': we assume that the table to be loaded does not exist yet. You can turn that option to 'NO' if there is no need to create the table.</li><br />
	<li>	THOUSANDS_OF_RECORDS: set this to any value between 1 and 1,000 to generate between 1,000 and 1,000,000 records</li><br />
</ul></p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Sampler IKM" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerIKM.PNG" width="396" height="174" class="mt-image-none" style="" /></span></p>

<p>Once you have set the values for your KM, you can run the interface and let it generate the random data set.</p>

<p>With the above configuration, and using a standard laptop (dual core 1.86GHz processor and 2 Gb of RAM) equipped with Oracle XE my statistics were as follows:</p>

<p>    10,000 records generated in 5 seconds<br />
  100,000 records generated in 24 to 35 seconds (about 30 seconds on average)<br />
1,000,000 records generated in 211 to 235 seconds (about 4 minutes on average)</p>

<p>Note that the machine was not dedicated to this process and was running other processes.</p>

<p>Statistics are available in the Operator interface.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Sampler Stats" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerStats.PNG" width="427" height="399" class="mt-image-none" style="" /></span></p>

<p>To review the data loaded by ODI in your target table, simply reverse-engineer this table in a model, then right-click on the table and select <em>View Data</em> to see what was generated!</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="SamplerData.PNG" src="http://blogs.oracle.com/dataintegration/2009/09/09/SamplerData.PNG" width="660" height="495" class="mt-image-none" style="" /></span></p>

<p><strong>4. EXPANDING TO OTHER TECHNOLOGIES </strong></p>

<p>One question: why did I stop here and did not try to make this work for other technologies? Well, it turns out that ODI is really meant to move and transform data. As long as I have at least ONE table with random data in any one of my databases, it is now faster to just create a regular ODI interface and move the data across... The design will take less than a minute. The data transfer should not take much time either. Who would try to spend more time coding when the solution is that simple?</p>

<p>But if you want to make this work for other databases, here are your entry points:<br />
<ul>	<li>	Duplicate the KM and modify it to use SQL that would work on these other databases</li><br />
	<li>	Update the user functions to make sure that they use the appropriate functions for the given databases</li><br />
	<li>	Use the same logic to create your interface</li><br />
</ul><br />
Enjoy!</p>

<p><br />
<em>All Screenshots were taken using <a href="http://otn.oracle.com/goto/ODI">version 10.1.3.5 of ODI</a>. Actual icons and graphical representations may vary with other versions of ODI.</em></p>

<p><strong><a href="http://www.oracle.com/technology/products/oracle-data-integrator/events/data_integration_openworld-2009.html">Data Integration Showcased at OpenWorld 2009</a></strong></p>]]>
      
   </content>
</entry>

</feed>
