Skip to content
Fusion Reference

The Oracle Fusion Cloud Quirks Guide

Fusion Cloud looks familiar to anyone who knows Oracle EBS — and that familiarity is exactly what makes a first extract wrong. The database is real but unreachable by SQL, the extract files carry different column names than the documentation, a column that meant one thing in EBS means another here, and the org master multiplies on date-effectivity. This guide is the shortcut past every one of those, with copy-ready Databricks SQL. Last verified August 2026.

No SQL path to the database

Fusion Cloud is SaaS. The tables in this reference are real, documented objects — but Oracle does not hand you a connection string. Every row that reaches your lakehouse travels through a delivered surface: BICC (the BI Cloud Connector — scheduled bulk extracts of public view objects to object storage), OTBI (real-time subject-area queries), BIP (operational reports), or REST APIs.

For analytics at scale, BICC is the path: it extracts a PVO (public view object) on a schedule, full or incremental, and lands files you convert to Delta. That is why every table page here carries an Extract access panel naming the PVO and OTBI subject areas that reach it — the table name alone is not an access path.

The flip side: a documented table with no documented PVO (the item-revisions table and the FND lookup view are this wave's examples) has no delivered bulk path — plan on OTBI or BIP for those, and treat any gap as a design input, not a surprise.

-- Everything on this site reads the LANDED copy of a table — the Delta (or
-- CSV-then-Delta) output of a BICC extract in your own lakehouse. There is
-- no connection string to the Fusion database itself.
SELECT
  t.TRANSACTION_ID,
  t.INVENTORY_ITEM_ID,
  t.ORGANIZATION_ID,
  t.PRIMARY_QUANTITY,
  t.TRANSACTION_DATE
FROM <catalog>.<schema>.INV_MATERIAL_TXNS t
WHERE t.ORGANIZATION_ID = <inventory_org_id>;

-- The four delivered ways data leaves Fusion Cloud:
--   BICC  - bulk extracts of public view objects (PVOs) to object storage;
--           the analytics path, and what this reference's extract map covers
--   OTBI  - real-time subject-area queries; operational reporting, not bulk
--   BIP   - operational reports with SQL-shaped data models; small volumes
--   REST  - transactional APIs; integration, not analytics
-- If a table has no documented PVO, its Extract access panel is absent here
-- and OTBI/BIP are the fallbacks - see the extract map notes per table.

3 parameters not filled: <catalog>, <schema>, <inventory_org_id>

BICC headers are PVO attributes, not columns

A BICC extract file is shaped by the ViewObject, not the table: headers arrive as camel-case attribute names (InventoryItemId), sometimes prefixed by their entity object, while Oracle's Tables and Views documentation — and every snippet on this site — speaks in column names (INVENTORY_ITEM_ID).

Map the names back once, at the bronze-to-silver boundary, and do it from the data store's documented attribute list rather than by de-camel-casing on instinct — a PVO can rename, prefix, or join in attributes that have no counterpart on the base table.

Every generated SQL header on this site carries the reminder: if your landed data still shows PVO attribute headers, map names first.

-- BICC extracts are named and shaped by the PVO, not the table. The file for
-- FscmTopModelAM.ScmExtractAM.InvBiccExtractAM.InventoryOnhandExtractPVO
-- arrives with ViewObject ATTRIBUTE headers - InventoryItemId,
-- OrganizationId, PrimaryTransactionQuantity - not the table's column names.
-- Map names back to the documented columns once, in bronze-to-silver, so
-- everything downstream (including this site's boilerplate SQL) matches
-- Oracle's table documentation.
CREATE OR REPLACE VIEW <catalog>.<schema>.INV_ONHAND_QUANTITIES_DETAIL AS
SELECT
  OnhandQuantitiesId          AS ONHAND_QUANTITIES_ID,
  InventoryItemId             AS INVENTORY_ITEM_ID,
  OrganizationId              AS ORGANIZATION_ID,
  SubinventoryCode            AS SUBINVENTORY_CODE,
  PrimaryTransactionQuantity  AS PRIMARY_TRANSACTION_QUANTITY,
  DateReceived                AS DATE_RECEIVED
FROM <catalog>.<schema>.inventory_onhand_extract_raw;

-- Two more drift traps:
--   1. Some PVO attributes are prefixed by their entity object (a PK can
--      arrive as InvOnhandQuantityPEOOnhandQuantitiesId) - check the data
--      store's attribute list, not just camel-case intuition.
--   2. A PVO can join several tables - extra attributes in the file are not
--      extra columns on the base table.

2 parameters not filled: <catalog>, <schema>

_ALL now means business unit

EBS practitioners know ORG_ID as the operating unit. Fusion kept the column name and the _ALL table suffix but changed the concept underneath: the stripe is now the business unit. A migrated filter list, a copied join, or an old runbook that says “operating unit” will type-check perfectly and filter wrongly.

This wave's tables make the shift visible in a different way: none of them carries ORG_ID at all. The BU appears under explicit names — BUSINESS_UNIT_ID on the org parameters, REQ_BU_ID on transfer orders — and the id domain they hold is BU_ID from FUN_ALL_BUSINESS_UNITS_V.

When the order-management and procurement waves land their _ALL tables, the generated SQL will anchor ORG_ID to a <business_unit_id> placeholder — reading it as an EBS operating unit is the migration's most durable habit, and it is wrong here.

-- In EBS, ORG_ID meant the operating unit. In Fusion the same column name
-- (and the _ALL suffix on the tables that carry it) means the BUSINESS UNIT.
-- Same name, different concept - migrated filter lists do not carry over.
--
-- None of this wave's foundation/product/inventory tables carries ORG_ID -
-- the BU appears under explicit names instead. Enumerate business units:
SELECT
  bu.BU_ID,
  bu.BU_NAME,
  bu.STATUS
FROM FUN_ALL_BUSINESS_UNITS_V bu;

-- Map each inventory org to its business unit (the org's BU id is a named
-- column, not a stripe):
SELECT
  iop.ORGANIZATION_ID,
  iop.ORGANIZATION_CODE,
  iop.BUSINESS_UNIT_ID,
  bu.BU_NAME
FROM INV_ORG_PARAMETERS iop
JOIN FUN_ALL_BUSINESS_UNITS_V bu
  ON bu.BU_ID = iop.BUSINESS_UNIT_ID;

-- When the order-to-cash and procure-to-pay waves land their _ALL tables,
-- the generated SQL here will anchor t.ORG_ID = <business_unit_id> - the
-- value comes from BU_ID above, never from an EBS operating-unit id.

1 parameter not filled: <business_unit_id>

Item-org striping and the master org

The item master keeps EBS's shape: one row per item per inventory organization (ORGANIZATION_ID), with a master-org row holding the definition and child-org rows carrying overrides. Which org is the master is configuration — it lives in INV_ORG_PARAMETERS.MASTER_ORGANIZATION_ID, not on the item. Every item-level join carries both INVENTORY_ITEM_ID and ORGANIZATION_ID, always.

What changed in the migration: the item number left the key flexfield for a real ITEM_NUMBER column, and the description left the base table entirely — it exists only on EGP_SYSTEM_ITEMS_TL, so any readable item list is a language-filtered join. Extended and user-defined attributes live in the EGO extensible-flexfield tables, driven by the item class — a whole product family this catalog doesn't cover yet.

One striping surprise inside the same product: item structures (EGP_STRUCTURES_B, EGP_COMPONENTS_B) carry no item or org id columns at all — the linkage hides in text-typed object/key columns, which is why this reference draws no structure-to-item join edge.

-- Items repeat per inventory organization: the master-org row is the
-- definition, child-org rows carry org-level overrides. WHICH org is the
-- master is configuration - read it from the org parameters, not the item.
SELECT
  iop.ORGANIZATION_ID,
  iop.ORGANIZATION_CODE,
  iop.MASTER_ORGANIZATION_ID   -- the item-master org this org points to
FROM INV_ORG_PARAMETERS iop;

-- Every item-level join carries BOTH columns - the item id alone fans out
-- across every org that holds the item:
SELECT
  itm.ITEM_NUMBER,             -- a real column in Fusion, not a flexfield
  tl.DESCRIPTION,
  ohd.PRIMARY_TRANSACTION_QUANTITY
FROM EGP_SYSTEM_ITEMS_B itm
JOIN EGP_SYSTEM_ITEMS_TL tl
  ON  tl.INVENTORY_ITEM_ID = itm.INVENTORY_ITEM_ID
  AND tl.ORGANIZATION_ID   = itm.ORGANIZATION_ID
  AND tl.LANGUAGE = '<language>'         -- one language or rows multiply
JOIN INV_ONHAND_QUANTITIES_DETAIL ohd
  ON  ohd.INVENTORY_ITEM_ID = itm.INVENTORY_ITEM_ID
  AND ohd.ORGANIZATION_ID   = itm.ORGANIZATION_ID   -- always both columns
WHERE itm.ORGANIZATION_ID = <inventory_org_id>;

-- What moved where in the migration: the item number left the key flexfield
-- for a real ITEM_NUMBER column, the description left the base table for the
-- _TL companion, and extended/user-defined attributes live in the EGO
-- extensible-flexfield tables (item-class driven - not yet cataloged here).

2 parameters not filled: <language>, <inventory_org_id>

Date-effective _F tables

Tables suffixed _F are date-effective: one row per entity per effectivity window, with EFFECTIVE_START_DATE and EFFECTIVE_END_DATE in the primary key. The org master this wave catalogs (HR_ALL_ORGANIZATION_UNITS_F) is the canonical example — an org renamed twice carries three rows, and an unfiltered join triples every fact it touches.

Filter to the current row for state-of-today reporting, or pin the window to the fact's own date for as-of history — the snippet shows both. The generated SQL on this site emits the current-row anchor as an active filter on every date-effective table, so the default copy-paste is safe.

Watch the double multiplication: the date-effective org master's name lives on a translation companion that is itself date-effective and language-striped — a name lookup that forgets either filter multiplies twice.

-- _F tables are date-effective: one row per entity per effectivity window,
-- and the window dates are part of the primary key. Joining without a window
-- filter multiplies rows by history.
SELECT
  org.ORGANIZATION_ID,
  org.ORGANIZATION_CODE,
  org.LEGAL_ENTITY_ID
FROM HR_ALL_ORGANIZATION_UNITS_F org
WHERE CURRENT_DATE BETWEEN org.EFFECTIVE_START_DATE AND org.EFFECTIVE_END_DATE;

-- As-of joins pin the window to the fact's date instead of today:
SELECT
  txn.TRANSACTION_ID,
  txn.TRANSACTION_DATE,
  org.ORGANIZATION_CODE
FROM INV_MATERIAL_TXNS txn
JOIN HR_ALL_ORGANIZATION_UNITS_F org
  ON  org.ORGANIZATION_ID = txn.ORGANIZATION_ID
  AND txn.TRANSACTION_DATE BETWEEN org.EFFECTIVE_START_DATE
                               AND org.EFFECTIVE_END_DATE
WHERE txn.ORGANIZATION_ID = <inventory_org_id>;

-- The generated SQL on this site emits the CURRENT_DATE window anchor as an
-- ACTIVE filter on every date-effective table - swap it for the as-of
-- pattern when you need history. Note the org NAME is not on this table; it
-- lives on the date-effective translation companion, so a name lookup
-- filters both the window and LANGUAGE.

1 parameter not filled: <inventory_org_id>

Maintained by Summit Analytics, a supply chain analytics practice. The tools and references are free — the consulting is selective.

Part of the Summit Analytics reference library.

Work with the practice →

Not affiliated with or endorsed by Oracle. Oracle and Oracle Fusion Cloud Applications are registered trademarks of Oracle and/or its affiliates.