Convert ODI mappings and packages to Snowflake SQL

ODI Smart Export XML parsed structurally. Mappings, Knowledge Modules, and CDC patterns converted to Snowflake SQL procedures, Streams, and Tasks. Full lineage, validated parity.

Upload an ODI export, get converted code →
Why Snowflake

Knowledge Modules tie your pipelines to Oracle infrastructure

KMs replaced by Snowflake native features

IKMs generate Oracle-specific MERGE and INSERT statements. Snowflake provides native MERGE, COPY INTO, and automatic micro-partitioning. No more maintaining custom Knowledge Modules — Snowflake handles optimization internally.

CDC patterns modernized with Streams and Tasks

ODI Journalizing KMs (JKMs) create trigger-based CDC tables that add overhead to source systems. Snowflake Streams track changes natively without source-side impact, and Tasks automate downstream processing on a schedule or when new data arrives.

Oracle SQL dialect eliminated

ODI mappings use Oracle-specific syntax — NVL, DECODE, ROWNUM, MINUS, hierarchical queries. Snowflake SQL is ANSI-compliant with built-in equivalents: COALESCE, IFF/CASE, ROW_NUMBER(), EXCEPT, and recursive CTEs.

Parser output

ODI IKM incremental update to Snowflake MERGE with Streams

An ODI mapping using IKM Oracle Incremental Update — converted to Snowflake MERGE driven by a Stream for automatic change capture. No JKM triggers, no staging tables, no Oracle dependency.

ODI Mapping (IKM Oracle Incremental Update)
<!-- ODI Mapping: Sync_Policy_Dim -->
<Mapping name="Sync_Policy_Dim">
  <Source schema="STAGING"
         table="STG_POLICIES"/>
  <Target schema="DW"
         table="DIM_POLICY"/>
  <Join condition="SRC.POLICY_ID = TGT.POLICY_ID"/>
  <Filter>SRC.EFF_DT >= :LAST_EXTRACT</Filter>
  <Expression target="POLICY_STATUS">
    DECODE(STATUS_CD,'A','Active','C','Cancelled',
           'L','Lapsed','Unknown')
  </Expression>
  <Expression target="ANNUAL_PREMIUM">
    NVL(MONTHLY_PREM,0) * 12
  </Expression>
  <IKM name="IKM Oracle Incremental Update"
       FLOW_CONTROL="true"/>
  <JKM name="JKM Oracle Consistent"
       SUBSCRIBER="DW_CDC"/>
</Mapping>
MigryX
converts
Snowflake SQL
-- ODI IKM + JKM → Snowflake Stream + MERGE

-- Stream replaces JKM journalizing
CREATE STREAM IF NOT EXISTS stg_policies_stream
  ON TABLE staging.stg_policies;

-- Stored procedure replaces ODI mapping
CREATE OR REPLACE PROCEDURE dw.sync_policy_dim()
RETURNS STRING
LANGUAGE SQL
AS
$$
  MERGE INTO dw.dim_policy AS tgt
  USING (
    SELECT
      policy_id,
      CASE status_cd
        WHEN 'A' THEN 'Active'
        WHEN 'C' THEN 'Cancelled'
        WHEN 'L' THEN 'Lapsed'
        ELSE 'Unknown'
      END AS policy_status,
      COALESCE(monthly_prem, 0) * 12
        AS annual_premium
    FROM stg_policies_stream
    WHERE METADATA$ACTION = 'INSERT'
  ) AS src
  ON tgt.policy_id = src.policy_id
  WHEN MATCHED THEN UPDATE SET
    tgt.policy_status = src.policy_status,
    tgt.annual_premium = src.annual_premium
  WHEN NOT MATCHED THEN INSERT
    (policy_id, policy_status, annual_premium)
    VALUES
    (src.policy_id, src.policy_status,
     src.annual_premium);
  RETURN 'Sync complete';
$$;

-- Task replaces ODI package scheduling
CREATE OR REPLACE TASK dw.sync_policy_task
  WAREHOUSE = 'ETL_WH'
  SCHEDULE = 'USING CRON 0 */2 * * * UTC'
  WHEN SYSTEM$STREAM_HAS_DATA('stg_policies_stream')
AS CALL dw.sync_policy_dim();

IKM Oracle Incremental Update replaced by Snowflake MERGE. JKM Oracle Consistent replaced by a Snowflake Stream with automatic change tracking. DECODE and NVL converted to CASE and COALESCE. Package scheduling replaced by a Snowflake Task with stream-aware triggering.

Coverage

ODI to Snowflake — artifact mapping

ODI Artifact Snowflake Equivalent Notes
MappingSQL stored procedureSource-to-target flow as ANSI SQL
IKM (Integration KM)MERGE / COPY INTOIncremental, append, and full-refresh patterns
LKM (Loading KM)External Stage + COPY INTOS3, Azure Blob, GCS file ingestion
PackageSnowflake Task DAGStep sequences with predecessor dependencies
Load PlanTask treeParallel/serial execution with root task control
ProcedureSnowflake Scripting / JS UDFCustom logic in Snowflake procedural SQL
VariableSession variable / parameterRuntime values passed via SET or procedure args
Interface (pre-12c)SQL view + procedureLegacy interfaces parsed and restructured
CKM (Check KM)NOT NULL / constraintsColumn-level constraints on Snowflake tables
JKM (Journalizing KM)Snowflake StreamNative CDC replaces trigger-based journalizing
RKM (Reverse KM)INFORMATION_SCHEMAMetadata discovery via Snowflake catalog views
Sequence (execution order)Task predecessorDAG ordering via AFTER clause in Task definitions
Validation

Every conversion validated to row-level parity

Data Matching compares ODI mapping output against Snowflake procedure output — row by row, column by column. In the case study below, all 900 interfaces were validated with production-parallel runs over a full billing cycle.

See how Data Matching works →
900
ODI interfaces modernized
4X
Faster pipeline execution
$2.9M
Savings over 3 years
60
Knowledge Modules eliminated

Insurance Carrier: ODI to Snowflake in 8 Months

900 ODI interfaces and mappings converted to Snowflake SQL stored procedures. 60 Knowledge Modules — IKMs, LKMs, JKMs — eliminated and replaced by native Snowflake features: MERGE, COPY INTO, Streams, and Tasks. Oracle-specific CDC triggers removed from 14 source databases. Nightly batch window reduced from 6 hours to 45 minutes with Snowflake's elastic compute.

Read the full case study →

See it on your own ODI mappings

Upload an ODI Smart Export. Get parsed lineage, Snowflake SQL code, and a validation report.

Book a Live Demo → hello@migryx.com