Hard sources — not covered by free tools
Also parsed — certify what free tools miss
Runtimes
After migration
ODI Smart Export XML parsed structurally. Mappings, Knowledge Modules, and CDC patterns converted to Snowflake SQL procedures, Streams, and Tasks. Full lineage, validated parity.
Deterministic parsers read the estate and emit native Snowflake code — not ODI mappings lifted into a hosted ODI.
Oracle ODI → MigryX parser → SQL + Snowpark + Tasks
Deterministic parseAI where it helpsMigryX AI handles the logic parsers cannot resolve alone, and every change it makes goes through the same parity checks. It runs on a model you approve, air-gapped if your estate requires it.
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.
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.
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.
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: 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>
-- 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.
| ODI Artifact | Snowflake Equivalent | Notes |
|---|---|---|
| Mapping | SQL stored procedure | Source-to-target flow as ANSI SQL |
| IKM (Integration KM) | MERGE / COPY INTO | Incremental, append, and full-refresh patterns |
| LKM (Loading KM) | External Stage + COPY INTO | S3, Azure Blob, GCS file ingestion |
| Package | Snowflake Task DAG | Step sequences with predecessor dependencies |
| Load Plan | Task tree | Parallel/serial execution with root task control |
| Procedure | Snowflake Scripting / JS UDF | Custom logic in Snowflake procedural SQL |
| Variable | Session variable / parameter | Runtime values passed via SET or procedure args |
| Interface (pre-12c) | SQL view + procedure | Legacy interfaces parsed and restructured |
| CKM (Check KM) | NOT NULL / constraints | Column-level constraints on Snowflake tables |
| JKM (Journalizing KM) | Snowflake Stream | Native CDC replaces trigger-based journalizing |
| RKM (Reverse KM) | INFORMATION_SCHEMA | Metadata discovery via Snowflake catalog views |
| Sequence (execution order) | Task predecessor | DAG ordering via AFTER clause in Task definitions |
Data Matching compares ODI mapping output against Snowflake procedure output - row by row, column by column.
See how Data Matching works →Customer names are shared under NDA in a demo, with reference calls on request.
See all engagements →