All posts · General

Design Patterns for Oracle Cloud Integration Projects

Proven patterns for common Oracle Cloud integration challenges — canonical data model, hub-and-spoke topology, idempotent processing, and saga-based distributed transactions.

Anurag Jangra · March 14, 2026 · 7 min read · ... views

Pattern 1: Hub-and-Spoke with OIC

Without a hub: N×(N-1) point-to-point integrations for N systems.

graph TB
    subgraph "Point-to-Point — 12 integrations for 4 systems"
        A1[Fusion ERP] <-->|1| A2[HCM]
        A1 <-->|2| A3[Custom App]
        A1 <-->|3| A4[Partner API]
        A2 <-->|4| A3
        A2 <-->|5| A4
        A3 <-->|6| A4
    end
    style A1 fill:#2d0f0f,stroke:#EF4444,color:#e2e8f0

With OIC as hub: 2N integrations — one in, one out per system.

graph LR
    ERP[Fusion ERP] <-->|2| HUB[OIC Hub]
    HCM[Oracle HCM] <-->|2| HUB
    APP[Custom App]  <-->|2| HUB
    PAR[Partner API] <-->|2| HUB

    style HUB fill:#1e3a5f,stroke:#3B82F6,color:#e2e8f0
    style ERP fill:#0f2d1f,stroke:#22C55E,color:#e2e8f0
    style HCM fill:#0f2d1f,stroke:#22C55E,color:#e2e8f0
    style APP fill:#0f2d1f,stroke:#22C55E,color:#e2e8f0
    style PAR fill:#0f2d1f,stroke:#22C55E,color:#e2e8f0

Adding a 5th system requires just 2 new integrations, not 8.

Pattern 2: Canonical Data Model

graph LR
    SRC1[Source A
CustomerNo, CustName] -->|map| CDM[(Canonical
Customer Model
customerId, name,
email, phone)]
    SRC2[Source B
AccountID, AccountTitle] -->|map| CDM
    CDM -->|map| TGT1[Target X]
    CDM -->|map| TGT2[Target Y]

    style CDM fill:#1e3a5f,stroke:#3B82F6,color:#e2e8f0

Adding Source C only requires one new mapping to the canonical model — not mappings to every existing target.

Pattern 3: Idempotent Processing

The problem: a network timeout means OIC doesn’t know if its POST was received. Retrying may create duplicates.

sequenceDiagram
    participant OIC
    participant API as Target API
    participant DB  as Track DB

    OIC->>API: POST /orders {correlationId: "ORD-2026-001", ...}
    Note over API: Network timeout!
    OIC->>API: Retry POST /orders {correlationId: "ORD-2026-001", ...}
    API->>DB: SELECT WHERE correlation_id = 'ORD-2026-001'
    DB-->>API: Already processed!
    API-->>OIC: 200 OK (returns existing order, no duplicate)

Implementation in PL/SQL:

PROCEDURE create_order_idempotent (
  p_correlation_id VARCHAR2,
  p_order_data     order_payload_t,
  p_result         OUT order_result_t
) AS
  v_existing_id NUMBER;
BEGIN
  -- Check for existing processing of this correlation ID
  SELECT order_id INTO v_existing_id
  FROM orders
  WHERE correlation_id = p_correlation_id;
  
  -- Already processed — return existing result
  p_result.order_id := v_existing_id;
  p_result.status   := 'EXISTING';
  RETURN;
  
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    -- First time — create the order
    INSERT INTO orders (correlation_id, ...)
    VALUES (p_correlation_id, ...);
    p_result.order_id := seq_orders.CURRVAL;
    p_result.status   := 'CREATED';
END;

Pattern 4: Saga — distributed transaction compensation

When a business transaction spans multiple systems and a step fails:

sequenceDiagram
    participant OIC
    participant HCM as Oracle HCM
    participant PAY as Payroll
    participant BANK as Bank API

    OIC->>HCM: Step 1: Create employee record
    HCM-->>OIC: ✓ Employee ID: 12345
    OIC->>PAY: Step 2: Create payroll assignment
    PAY-->>OIC: ✓ Payroll ID: 67890
    OIC->>BANK: Step 3: Setup bank account
    BANK-->>OIC: ✗ FAILED (invalid sort code)
    
    Note over OIC: Saga: execute compensations in reverse
    OIC->>PAY: Compensate Step 2: DELETE payroll 67890
    OIC->>HCM: Compensate Step 1: DELETE employee 12345
    OIC->>OIC: Raise alert to operations team

Each step in OIC has a corresponding compensating action in a fault handler that reverses it cleanly.

Think Beyond the Implementation

Questions worth sitting with after reading this

01

Why is this architecture appropriate for this specific context — and where would it be the wrong choice?

02

What assumptions did we make that aren't stated explicitly? What happens if those assumptions are wrong?

03

What would break first if the requirements changed — volume doubled, a third system was added, or the deadline halved?

04

What alternatives did we reject, and why? Was the decision made on evidence — or habit?

AJ
Anurag Jangra
Oracle Cloud PaaS Consultant · OIC & VBCS Specialist

4.5+ years delivering enterprise Oracle Cloud integrations and VBCS applications across manufacturing, IT services, and financial sectors. OCI Certified — writes about real-world OIC, VBCS, SQL, and BI Publisher patterns from production experience.

Chat on WhatsApp