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 →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. 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 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 →Upload an ODI Smart Export. Get parsed lineage, Snowflake SQL code, and a validation report.