Guides / Reference
Reference

Oracle Fusion Tables Reference: Complete Guide to the Oracle Fusion Data Model

July 16, 2026 Comprehensive reference — best used as a bookmark, not a single read
Back to Guides
Foundation Series — Comprehensive Reference Guide

The complete reference for how Oracle Fusion organizes, relates, and secures its data — the second Foundation guide in FusionLens's Oracle Fusion Knowledge Hub, built to complement the SQL Guide rather than repeat it.

In This GuideYou'll Be Able To
Naming conventionsRecognize what _F, _M, _TL, _VL and _ALL indicate
Relationship patternsPredict which tables belong together
Module referenceFind the correct table much faster
Oracle Fusion data modelUnderstand how business data is organized
Common mistakesAvoid the reporting errors we see most often

Why This Reference Exists

Writing SQL usually isn't the hardest part of an Oracle Fusion reporting project. Finding the right table is.

If you've already worked through our SQL Guide, you know how to write a WHERE clause that survives effective-dating, how to pick the primary assignment, how to scope a query to the right business unit — the syntax problem is solved, and what's left is quieter: knowing which table to open in the first place. If you're arriving here first, that's fine too — think of this reference as the foundation worth having before you write anything more complex than a single-table SELECT.

Oracle Fusion contains thousands of tables, but there isn't a single practical reference that explains how they fit together from a reporting perspective — most of what exists is documented only as a column list, in a naming pattern that only makes sense once someone's already explained it to you.

So people default to guessing. PER_ALL_PEOPLE_F feels obviously right for "the employee table" — and it is, for the person's core identity. But department, manager, job, and business unit don't live there; they're assignment attributes, tracked on a separate table that can change independently of who the person is. An hour disappears before a single line of SQL gets written, not because the SQL is hard, but because nobody could say with confidence where the data actually lives.

This reference exists to close that gap. By the end of this Guide, you should be able to look at an unfamiliar Oracle Fusion table name and make an educated guess about its purpose, relationships, and reporting role before opening the documentation.

Why Oracle Fusion's Data Model Is Hard to Learn

Part of it is scale — thousands of tables across a dozen product families. But scale alone isn't the real obstacle; people learn large schemas all the time. What makes Fusion's data model specifically hard is that it was built cloud-native and multi-tenant from the ground up, and that decision shows up directly in the schema: business objects are split across base tables, translation tables, and effective-dated version tables, because Fusion has to support simultaneous customers, languages, and historical versions in a way most schemas never had to.

The result is a naming convention that's genuinely logical once you know it — _TL really does mean "translation," _M really does mean a newer effective-dating model than _F — and genuinely opaque until then. That's the part this reference is built to teach: not just what's in each table, but why the schema is shaped this way, so the next table you've never seen still makes sense on sight.

What Makes This Reference Different

Search "Oracle Fusion tables" and most of what comes back is one of two things: Oracle's own documentation, or a scraped table dump with no narrative at all. Oracle's documentation is excellent as a technical reference — it's the right place to confirm a column exists. This Guide focuses on the architectural reasoning and practical relationships that developers usually learn only through project experience: why a table is split the way it is, which of three plausible-looking tables an experienced consultant would actually join to, and where people get bitten.

Every table here explains its business purpose in plain language, states its primary key explicitly, names the tables it actually joins to and why, and — where it matters — flags the mistake people make with it most often. It's organized by module the way a consultant actually thinks about the system, not alphabetically the way a database catalog does.

The goal isn't simply to document 150 Oracle Fusion tables. It's to give you the mental model that helps you understand the next 150 you haven't seen yet.

How This Reference Complements the SQL Guide

The SQL Guide answers "how do I write this query." This reference answers "where does this data live, and how is it related." They're built to be used together, not read as substitutes for each other.

Where a SQL example genuinely helps here, you'll see one — short, just enough to show a join in action — with a link to the fuller, explained version in the SQL Guide when one exists. This reference won't re-teach the effective-date WHERE-clause pattern or re-explain primary_flag = 'Y'; that's already covered in full there, and repeating it here would just be the same page twice under a different title.

Before we look at individual modules or tables, we first need to understand the language Oracle Fusion uses to describe its data model. Once you recognize those naming patterns, thousands of tables become far less intimidating. That's where we'll begin — by learning the small set of conventions Oracle uses repeatedly throughout the entire application.

Table Naming Conventions: The Complete Decoder

Oracle Fusion table names look cryptic until you realize they're not names at all — they're a compact description of how Oracle chose to store that business object. Once you know the seven patterns that repeat across literally every module, an unfamiliar table name stops being a mystery and starts being a set of testable predictions.

How to Read an Oracle Fusion Table Name — PER_ALL_ASSIGNMENTS_M

PartMeaning
PERHuman Resources
ALLEvery worker/person type in one table (employee, contingent worker, non-worker) — not the multi-business-unit meaning ALL carries in Financials tables. Same three letters, different job, depending on module.
ASSIGNMENTSThe business object
MEffective-dated (newer model)

Read left to right and you already know, before opening a single column: this is HR data, covering every worker type, about assignments specifically, and it changes over time. That's the skill the rest of this section builds.

_B — Base Table

What it means: _B tables typically store the core structural attributes of a business object — IDs, dates, flags, and other numeric/structural columns. Human-readable values are often stored separately in the corresponding _TL table.

Why: Oracle generally separates "what this record fundamentally is" (identical across languages) from "what it's called" (varies by session language) at the table level, rather than storing a dozen language columns on one row.

When it appears: on objects with a human-readable name that needs to display in multiple languages — jobs, positions, projects, categories, most lookup-style master data.

Reporting impact: querying a _B table alone typically gets you IDs and structural data but not the display name a report needs — you'll usually need the paired _TL or _VL object too.

Example: PER_JOBS_B holds a job's ID and structural attributes; the job title lives in PER_JOBS_TL.

_TL — Translation

What it means: translation table — one row per business-object ID per installed language.

Why: Fusion is multi-language by design from day one, so translatable objects generally follow this same table shape rather than a special case per module.

When it appears: paired with most _B tables across every module.

Reporting impact: filter by LANGUAGE = 'US' (your session's language code) or you get one row per installed language per record — a guaranteed row-multiplication bug that looks like a join problem but is actually a missing language filter.

Example: PER_JOBS_TL holds the job title — one row where LANGUAGE = 'US', another where LANGUAGE = 'FR', for every job in PER_JOBS_B.

_VL — Translated View

What it means: a database view — not a table — that pre-joins the _B and _TL objects and filters to your session's language for you.

Why: so query authors don't have to hand-write the base+TL+language-filter join themselves every time.

When it appears: Oracle frequently provides a corresponding _VL view for a _B/_TL pair, although not every object exposes one — worth checking rather than assuming.

Example: PER_JOBS_VL returns one row per job, already resolved to your session language — see Retrieve Active Employees with Their Current Assignment and Headcount by Grade in the SQL Guide for this in a working query.

_F — Effective-Dated (Date-Track)

What it means: an effective-dated table — it stores every version a record has ever had, not just its current state, each row bounded by EFFECTIVE_START_DATE and EFFECTIVE_END_DATE.

Why: Fusion needs to answer "what did this look like on any given date," not just "what does it look like today" — for audit, retroactive corrections, and future-dated changes entered ahead of time.

When it appears: on anything that changes over time and where history matters — people, assignments, jobs, organizations, positions, and a long list of related HCM objects.

Reporting impact: every query against a _F table needs a date predicate, or you get every historical version back instead of the one true today.

Example: PER_ALL_PEOPLE_F — the exact pattern behind Retrieve Active Employees with Their Current Assignment in the SQL Guide.

_M — Effective-Dated (Newer Model)

What it means: also an effective-dated table, using a related but structurally newer versioning approach than the classic _F pattern.

Why: Oracle doesn't publicly document the internal rationale behind the _M suffix in detail. What's reliably observable — and what matters for reporting — is that these tables still follow the same effective-dating principles described above.

When it appears: most visibly on assignments (PER_ALL_ASSIGNMENTS_M) and a handful of related, newer objects — not a wholesale replacement of _F.

Reporting impact: identical to _F from a query-writing standpoint — a date predicate is required, and primary_flag still needs checking where multiple rows can be genuinely active at once.

Example: PER_ALL_ASSIGNMENTS_M, behind nearly every query in the SQL Guide's HCM section, including Employees with Their Direct Manager.

_ALL — Multi-Org

What it means: in Financials and Procurement, the table holds data for every business unit or legal entity in the same physical table, distinguished only by a scoping column.

Why: rather than replicate a separate physical table per business unit, Fusion's financial and procurement objects generally share one table across the enterprise and rely on an org-scoping column, enforced through security and expected in every query.

When it appears: mainly Financials and Procurement — invoices, purchase orders, receivables transactions, and their related tables.

Reporting impact: leave the business-unit filter out and you're not looking at "all the invoices" in any useful sense — you're looking at every legal entity's invoices merged together.

Example: AP_INVOICES_ALL — behind the Accounts Payable queries in the SQL Guide.

_ALL_M — Multi-Org and Effective-Dated

What it means: both conventions stacked on one table — multi-org scoping and the newer effective-dating model together.

Why: some objects are genuinely both — they vary by business unit and change over time, so Oracle combines the two suffixes rather than inventing a third scheme.

When it appears: less common than either convention alone — supplier sites are the clearest example.

Reporting impact: both predicates are required, and dropping either produces the same category of wrong-scope result described above.

Example: POZ_SUPPLIER_SITES_ALL_M.

Putting It All Together — POZ_SUPPLIER_SITES_ALL_M

PartMeaning
POZProcurement
SUPPLIER_SITESThe business object
ALLMulti-org — here it genuinely does mean every business unit, unlike the HCM example above
MEffective-dated

Two predicates, no exceptions: a business-unit filter and a date filter, or the row count is wrong twice over.

Module Prefixes — A Quick Decoder

Beyond suffixes, the first few characters tell you which module owns a table.

PrefixTypical ObjectsExample
PER_People, assignments, jobsPER_ALL_ASSIGNMENTS_M
HR_Organizations, positionsHR_ALL_ORGANIZATION_UNITS_F
PAY_Payroll runs and resultsPAY_RUN_RESULTS
BEN_Benefits enrollment and eligibilityBEN_PGM_F
GL_Journals, ledgers, balancesGL_JE_HEADERS
XLA_Subledger AccountingXLA_AE_HEADERS
AP_Invoices, paymentsAP_INVOICES_ALL
AR_ / RA_Receivables transactionsRA_CUSTOMER_TRX_ALL
IBY_Payment processingIBY_DOCS_PAYABLE_ALL
ZX_TaxZX_LINES
FA_Fixed AssetsFA_ADDITIONS_B
HZ_Parties, customersHZ_PARTIES
PO_Purchase ordersPO_HEADERS_ALL
POZ_SuppliersPOZ_SUPPLIERS
POR_RequisitionsPOR_REQUISITION_HEADERS_ALL
RCV_ReceivingRCV_TRANSACTIONS
INV_Inventory (on-hand, transactions)INV_ONHAND_QUANTITIES_DETAIL
EGP_Product Hub / item definition (current)EGP_SYSTEM_ITEMS_B
CST_Cost ManagementCST_COST_PROFILES
DOO_Order ManagementDOO_HEADERS_ALL
WSH_ShippingWSH_DELIVERY_DETAILS
PJF_ / PJC_Projects, project costsPJF_PROJECTS_ALL_B
OKC_ContractsOKC_K_HEADERS_ALL_B
FND_Security, foundationFND_GRANTS

That's the real purpose of Oracle Fusion's naming conventions. They aren't there to make table names longer — they're there to encode information. Once you learn how to read that information, the data model becomes far easier to navigate, and it sets up the next question: what's actually the difference between a business object, a table, and a view in Oracle Fusion?

Understanding the Oracle Fusion Data Model: Business Objects vs. Tables vs. Views

A functional consultant asks for "the Employee record." A developer asks which table holds it. Both are asking about the same thing, and the honest answer is that there isn't one table that holds it — there are several, and the "Employee" the business talks about only exists as the sum of them.

That gap — between how the business describes data and how the database actually stores it — is worth naming explicitly, because it's the single biggest reason people get lost in Oracle Fusion's schema. Three layers are doing three different jobs:

Business Objects

A Business Object is the functional concept — Employee, Supplier, Purchase Order, Invoice — the thing a business user, a functional consultant, or a requirement document refers to by name. It's also, generally, the level Oracle's own REST API resources and BI Publisher data models are built to expose: ask the REST API for a "worker," and it hands back an assembled record, even though that record didn't live in one place internally.

A Business Object typically has no single home in the database. It's assembled — often from several tables spanning identity, assignment, organization, and translation — the moment someone actually needs to see it as one thing.

Tables

Tables are where the data physically lives, and this is where the naming conventions from the previous section stop being trivia and start being useful: a _B table holds structural identity, a paired _TL table holds the display name in every installed language, an _F or _M table holds the version that's true as of a given date, and an _ALL table holds every business unit's rows in one place.

None of those tables, on its own, is "the Employee." Together, joined correctly, they are.

The "Employee" Business Object, Assembled

PieceTableWhat It Contributes
Core identityPER_ALL_PEOPLE_FPerson ID, birth date, national identifier
Display namePER_PERSON_NAMES_FThe name as it should be shown
Current rolePER_ALL_ASSIGNMENTS_MDepartment, job, grade, manager resolution
Department nameHR_ALL_ORGANIZATION_UNITS_FResolves the department ID to a name
Job titlePER_JOBS_VLResolves the job ID to a name, in your language

No single row, anywhere, is "the Employee." This table is the join list — the same one behind Retrieve Active Employees with Their Current Assignment in the SQL Guide.

Views

Views sit between the two — built from one or more tables, exposed as something easier to query than the raw physical layer underneath. Some exist purely for convenience (the _VL translated views from the previous section). Some exist to enforce security, filtering rows based on who's asking before the data ever reaches the query (covered in full later in this Guide). And some exist to get closer to the Business Object layer for reporting specifically — OTBI's subject areas are themselves a curated, pre-joined view layer, built so a report author doesn't have to reconstruct "Employee" from five tables by hand. Oracle Fusion OTBI Subject Areas covers how those subject areas map back down to the tables underneath them, for readers building reports through OTBI rather than direct SQL.

Why the Layers Don't Line Up

None of this is Oracle making things needlessly complicated. Splitting a Business Object across tables is what makes multi-language support, historical tracking, and multi-org sharing possible without duplicating the entire record for every language, every date, and every business unit. The cost is that "the Employee" stops being one row anywhere — the benefit is everything the naming conventions in the previous section exist to solve.

If you're writing SQL against these tables directly, the SQL Guide shows exactly how that assembly happens, query by query, for fifty real business objects. This reference is about recognizing the layers before you get there — so that when a query joins five tables together, you understand why, instead of just copying the pattern.

Effective-dating is the layer that causes the most confusion in practice, and it deserves its own complete treatment — not just the suffix, but the full model behind it.

Effective-Dated Tables: The Complete Model

Why can HR schedule a promotion that becomes effective next month? Why can Procurement activate a supplier site from a future date? Why can Finance reproduce the exact organizational structure that existed when an invoice was approved?

None of those is a small trick, and none of them is HCM-specific — they're the same capability showing up in three different modules. A traditional system that just stores "the current record" can tell you what's true right now, and nothing else — update a value, and the old one is gone. Fusion needs both directions at once: the ability to enter a change today that shouldn't take effect until later, and the ability to reconstruct exactly what was true on any past date, for audit, for reprocessing, for a dispute about what a record actually said on a specific day.

How Fusion Makes This Possible

From the application's perspective, users never think about rows or history tables. They simply open a worker record, update a job, schedule a future change, or correct an existing one. Oracle Fusion decides whether that action creates a new effective-dated version, updates an existing row, or preserves history behind the scenes. The database model exists to support those application behaviors, not the other way around.

Underneath, Fusion solves this by never overwriting a record — it adds a new version of it instead. Every change to an effective-dated business object (a person's assignment, a job definition, a supplier site, an organization) creates a new row bounded by a start date and an end date, rather than updating the existing row in place. The old version isn't deleted; it's just no longer the version that's "current" as of today. This is what Oracle calls date-tracking, and it's the single most consequential design decision behind Fusion's schema.

Practically, this is what makes all three opening questions possible in the same system: a promotion or a supplier-site activation entered today with a future start date sits in the table as a row that isn't "current" yet, and won't become current until its start date arrives. A record from two years ago never disappeared — it's a row whose end date has already passed, still sitting there, still queryable, if you ask for the date it applied.

How Oracle Stores Historical Versions

Effective-dated tables (the _F and _M tables from the naming conventions section) implement this with two columns on every row: EFFECTIVE_START_DATE and EFFECTIVE_END_DATE. A row is the "true" version of a record for any date between those two bounds. A person's assignment history might have five rows in PER_ALL_ASSIGNMENTS_M — one per change — each with its own start and end date, together covering that person's entire assignment history without a gap.

A few mechanics worth knowing at this layer, because they explain behavior that otherwise looks like a bug:

  • Correction rows. Fixing a mistake in a past-dated row doesn't edit that row — it typically creates a new version covering the same period. Oracle doesn't publish a separately-documented "correction" mechanism distinct from ordinary date-tracking; which version applies as of a given date generally follows the same effective-date resolution as any other row.
  • Future-dated rows. A row with a start date later than today is a real, saved row — it's just not the current one yet. Query "today" and you correctly won't see it. Query as of its start date (or later) and you will.
  • No gaps, by convention. A well-maintained effective-dated history has no date gap between consecutive rows for the same record — the end date of one version is typically one day before the start date of the next. A gap usually means missing history, not an intentional absence of data.

Reporting Implications

This is where the mechanism stops being a database detail and starts being something every kind of reader runs into directly. Whether you're validating an OTBI analysis, building a BI Publisher report, extracting data through REST, or writing SQL directly, the same rule applies: if you don't define "as of when," Fusion may legitimately return multiple historical versions of the same business object. An employee who changed departments three times this year doesn't show up as one row with the current department; they show up three times, once per version, unless something in the query, data model, or extract definition specifically asks for "today's" row.

This is the most common reason a Tester validating a report sees a headcount that doesn't match what the business expects, and it's also the most common reason two people troubleshooting the same report land on different explanations — one assumes a join problem, when the actual issue is a missing date filter.

Where the SQL Lives

This Guide intentionally doesn't repeat the SQL implementation in detail — that's the SQL Guide's job, starting with Retrieve Active Employees with Their Current Assignment. The short version, for context: a query against PER_ALL_PEOPLE_F needs a condition like :as_of_date BETWEEN effective_start_date AND effective_end_date on every effective-dated table it joins, not just one of them.

Key Takeaways

  • Fusion never overwrites history — it adds a new version instead.
  • Every version has its own effective period, bounded by a start and end date.
  • Reports, dashboards, extracts, and queries must all answer "as of when?"
  • Effective-dating isn't a database feature that Oracle Fusion happens to use — it's a core Oracle Fusion capability that the database is designed to support.

Effective dating explains when a row is valid. The next concept — translations — explains how the same row can appear differently to different users without duplicating the underlying business data.

Translation Tables & Multi-Language Design

Why can two users looking at the same job see two different titles — one in English, one in French — without Oracle maintaining two separate jobs? Why can a project name entered by a US project manager appear in Spanish to a team member in Mexico, without anyone translating it by hand?

Both are the same underlying capability, and neither is specific to HCM or Projects. Oracle Fusion is built to run for organizations operating across countries and languages at once — the same organizational unit, job, or project has to mean the same thing to everyone, while displaying in whatever language each person's session is set to.

How Fusion Makes This Possible

From the application's perspective, nobody managing a job, a project, or a category ever thinks about translation logic directly. Someone enters a name once, in whatever language they're working in, and Oracle Fusion is designed to store it per installed language the environment needs to support — with every language's version tied back to the same underlying record. A user in Paris and a user in Chicago aren't looking at two different jobs; they're looking at the same job, through two different language versions of its name.

How Oracle Stores Translated Text

This is the _B / _TL / _VL pattern from the naming conventions section, in full. A base (_B) table holds the language-independent structural attributes — the ID, the dates, the flags — and a paired translation (_TL) table holds one row per installed language for anything that needs to display as text. Each _TL row is tied back to the base record by its ID, plus a LANGUAGE column identifying which language that particular row is in. Translation tables also typically carry a SOURCE_LANG column, identifying which language the text was originally entered in — useful for distinguishing an authoritative entry from a translated copy of it, though this is worth confirming against your own instance rather than assumed universal.

A _VL view generally sits on top of both, pre-joined and filtered to the session's language, so a report or query gets one row per record, already in the right language, without needing to write that join by hand.

Reporting Implications

This shows up identically across every reporting tool, not just SQL. An OTBI analysis, a BI Publisher data model, or a direct query built against a _TL table without a language constraint will return the same underlying record once per installed language it has a translation for — the same kind of duplication effective-dating causes, just triggered by language instead of time. A global report that genuinely needs to show a name in more than one language at once is a different, deliberate case — but showing it once, correctly, in the viewer's language, requires the language filter (or the pre-built _VL view) every time.

Where the SQL Lives

This Guide intentionally doesn't repeat the SQL implementation in detail — the SQL Guide covers the _VL join pattern directly, including Headcount by Grade, which resolves a grade name through per_grades_vl using exactly this mechanism.

Key Takeaways

  • Oracle Fusion stores a translatable record once per installed language, not once per record.
  • A base table holds the structural data; a translation table holds the language-specific text.
  • Missing a language filter causes the same kind of duplicate-row problem as missing a date filter.
  • Translation isn't a workaround Oracle bolted on — it's a foundational design choice, because Fusion was built multi-language from day one.

Once you understand when a row is valid and how it appears in different languages, the next question is who is allowed to see it. That's where Oracle Fusion's security model comes in.

Data Visibility & Security in Oracle Fusion

Two managers open the same OTBI analysis. One sees 12 employees. The other sees 43.

Neither report is wrong.

Why This Happens

Oracle Fusion doesn't show every user the same data just because they're running the same report, the same analysis, or the same query. Each user is assigned a data role or security profile that defines the population of data they're allowed to see — a manager sees their own team, an HR business partner sees their assigned population, a Procurement approver sees purchase orders within their approval hierarchy. Administrators configure security through roles, security profiles, and related configuration. Once that model is in place, report authors typically don't enable or disable data security per report.

How Oracle Implements This

Oracle Fusion enforces data security through multiple application and database mechanisms, and the exact implementation varies by product area — not something most report authors need to understand. What matters, from a report author's perspective, is that security acts as an additional filter on the data returned to each user, regardless of the reporting tool being used.

Reporting Implications

A tester compares a report against production. The numbers don't match. The SQL is identical. The report definition is identical. The underlying data is identical. The missing piece is security — the test account and the production comparison account simply don't have the same data-visibility scope, and no amount of checking the report logic will explain the gap.

This same pattern shows up across every tool, not just SQL: an OTBI analysis run by two different users, a BI Publisher report scheduled under a service account versus run manually by an end user, a REST API call authenticated as different users — all of them can legitimately return different row counts for what is, on paper, "the same" request.

What This Means for Integrations

REST illustrates the read side of this. REST integrations are typically executed under the identity of a user or integration account, and the data available through those APIs is subject to the security assigned to that identity. The exact authentication model depends on how the integration is configured.

HDL illustrates the write side, and it's a different kind of access control — not about which rows a loading account can see, but which business objects and data it's permitted to create or change. Worth keeping these two directions distinct rather than treating them as the same concern.

Key Takeaways

  • Two users can legitimately see different data from the exact same report — that's the system working as designed, not a bug.
  • From a report author's perspective, security is a filter applied to what comes back, regardless of which tool built the report.
  • When results don't match between two accounts, check data-visibility scope before checking the report itself.
  • REST integrations inherit the calling identity's read access; HDL loading permissions are a separate, write-side concern.
Learn Next
This section maps directly to:
Business Objects vs. Tables vs. Views (secured views are the "views" layer) · Security & Identity module reference (PER_SECURITY_PROFILES, FND_GRANTS)
ToolHow Security Affects You
OTBISubject areas commonly return data within the user's permitted organizational scope.
BI PublisherA scheduled run under a service account may see a different population than the same report run interactively — worth confirming which identity a scheduled job runs under.
RESTREST resources commonly respect the access scope of the authenticated identity, although the exact behavior depends on the API and product area.
Direct SQLQuerying tables directly, outside the application layer, may not apply the same row-level restrictions as the UI or OTBI. The answer depends on how your database connection is authenticated and what security mechanisms apply in that environment — verify against your specific connection before treating raw query results as equivalent to what an end user sees.

Related FusionLens Guides: SQL Guide (SQL-level access-control queries) · Oracle Fusion SQL Security Explained · Oracle Fusion Security Guide (coming soon)

After understanding when, how, and who, the final architectural layer is scope — how Oracle Fusion keeps multiple business units and legal entities inside the same application instance without mixing their data.

How can one Oracle Fusion environment serve dozens of companies, hundreds of departments, and thousands of users — without mixing their transactions?

The answer isn't separate databases. It's Oracle Fusion's organizational model, which separates legal responsibility, operational ownership, and financial accounting while keeping them inside a single application instance.

How This Plays Out in the Application

Users generally work within a Business Unit context. Depending on the product area and transaction type, related organizational structures — such as the associated Legal Entity — are derived through the application's configuration rather than selected directly on every transaction.

The Three Concepts Worth Keeping Straight

  • Legal Entity — the legal/tax structure. A registered company or subsidiary with its own statutory and tax reporting obligations.
  • Business Unit — the operational transaction scope. Where day-to-day transactions actually get processed and reported.
  • Ledger — the financial record-keeping structure. Where accounting entries land, defined by a chart of accounts, currency, and calendar.

Manufacturing and Supply Chain modules introduce additional organizational concepts such as Inventory Organizations and Cost Organizations. Those are intentionally outside the scope of this Foundation Guide.

Why This Lives in Shared Tables

Oracle could have created separate tables for every Business Unit or Legal Entity. Instead, it stores many organizations together in shared tables and distinguishes them through organizational attributes. That design keeps one application instance scalable while allowing organizational separation through configuration, security, and reporting — the same _ALL pattern from the naming conventions section, now with the business reason behind it.

Reporting Implications

A Finance user asks: "Why does my invoice report contain invoices from three countries?" The report isn't necessarily wrong. It may simply not have been scoped to the intended Business Unit.

The same pattern shows up in Procurement: a buyer asks why their requisition list only shows requests from their own Business Unit, when they expected to see the whole company's activity — that's the scope working as designed, not a missing requisition.

Where the SQL Lives

The SQL implementation of organizational scoping belongs in the SQL Guide. This Guide focuses on understanding why organizational scope exists before showing how it's queried.

Key Takeaways

  • One Oracle Fusion instance can serve many legally distinct companies without mixing their data.
  • Legal Entity handles legal/tax structure, Business Unit handles operational scope, Ledger handles accounting.
  • For many transactions, the Business Unit provides the operational context that influences processing, reporting, and related organizational relationships.
  • Unexpected row counts across organizations are usually a scoping question, not a bug.
ToolHow Multi-Org Affects You
OTBISubject areas commonly return data within the user's permitted organizational scope.
BI PublisherA data model built without an explicit BU parameter can return a cross-entity result set that looks like a data error but is actually a missing scope.
RESTREST resources commonly respect the access scope of the authenticated identity, although the exact behavior depends on the API and product area.
Direct SQLMany _ALL tables store rows for multiple organizational units in the same physical table, making organizational scoping an important part of SQL reporting (see the SQL Guide).

Related FusionLens Guides: SQL Guide — for the _ALL-table scoping pattern in a working query

Relationship Archetypes

Oracle Fusion doesn't invent a new relationship shape for every module. The relationship patterns below appear again and again across HCM, Financials, Procurement, SCM, and Projects. They aren't the only patterns you'll ever encounter, but they're among the most common — and once you recognize one, an unfamiliar table stops being a blank slate.

Pattern — Master → Translation

Covered in full in the Translation Tables section earlier in this Guide — this pattern is the _B/_TL/_VL structure you already know, showing up again here as the first of several recurring shapes.

Pattern — Header → Lines

You'll see this in: an AP Invoice, a Purchase Order, a GL Journal Entry — a single document with one set of header-level facts (who, when, status) and a variable number of line-level facts (what, how much) underneath it.

Typical tables: AP_INVOICES_ALLAP_INVOICE_LINES_ALL (Financials); PO_HEADERS_ALLPO_LINES_ALL (Procurement).

Pattern — Person → Assignment

You'll see this in: an employee's core identity versus their department, job, and manager — this pattern is genuinely HCM-specific rather than something that repeats identically elsewhere, and it's worth learning as its own shape rather than forcing a parallel that doesn't quite hold in other modules.

Typical tables: PER_ALL_PEOPLE_FPER_ALL_ASSIGNMENTS_M.

Pattern — Organization → Hierarchy

Hierarchies appear throughout Oracle Fusion wherever one business object can contain another of the same kind — a department containing sub-departments, a project containing tasks and sub-tasks, a category containing sub-categories. The shape is self-referencing: the same table, pointing back to itself, one level at a time. In database terms, this is commonly implemented as a row pointing to another row in the same table.

Pattern — Transaction → Distribution

You'll see this in: an AP invoice and a Purchase Order, both of which need to answer "which GL account does this actually hit," a question the transaction itself doesn't answer directly.

Typical tables: AP_INVOICE_DISTRIBUTIONS_ALL (Financials); PO_DISTRIBUTIONS_ALL (Procurement).

Pattern — Party → Account/Site

Typical examples:

  • Customer: HZ_PARTIESHZ_CUST_ACCOUNTS → Customer Sites
  • Supplier: Supplier → Supplier Sites

The party is one thing; the accounts and sites built on top of it are how that one thing actually transacts. The two chains aren't identical in shape to each other — the pattern is "one entity, several operational manifestations," not one specific table pair repeated verbatim.

Pattern — Lookup → Meaning

You'll see this in: almost every status field you'll ever query — the honest, common question behind this pattern is "why is STATUS = 'A' instead of just saying 'Approved'?" The stored code is compact and stable across languages; the meaning attached to it is what a human actually reads. Unlike translation tables, lookup meanings usually represent business semantics rather than language variants.

These relationships are what SQL JOINs actually encode — see the SQL Guide for them written out as working queries.

By this point, individual table names should matter less than they did at the start of this guide. Once you recognize the relationship pattern, an unfamiliar table often becomes much easier to understand. That's the goal of this guide — not to memorize Oracle Fusion's schema, but to recognize the design patterns behind it.

Continue Learning — Foundation: Oracle Fusion Tables Reference
✓ Naming Conventions ✓ Business Objects vs. Tables vs. Views ✓ Effective-Dated Tables ✓ Translation Tables ✓ Data Visibility & Security ✓ Multi-Org & Business Units ✓ Relationship Archetypes □ Module-by-Module Table Reference ← next

Related FusionLens Guides: SQL Guide — every pattern above, written out as a working query


Part II
Module Reference

Up to this point, you've learned the architectural patterns that repeat throughout Oracle Fusion. From here onward, those same patterns are applied module by module. These chapters are designed as a working reference. Rather than introducing new concepts, they show where the concepts you've already learned appear in the schema you'll use every day.

Module Reference

HCM

How HCM Thinks

Every HCM process — hiring, promotions, transfers, payroll, absences, performance, and talent — ultimately revolves around the same business object: the worker.

That doesn't mean Oracle stores a worker in one table. As you learned in the Business Objects section, a business object is assembled from multiple related tables, and HCM is one of the clearest examples of that design.

Core Business Objects: Worker · Assignment · Job · Department (Organization) · Position

Recurring Patterns

  • ✓ Effective Dating — Worker, Assignment, Job, Department are all date-tracked
  • ✓ Translation — Job/Department names resolve through _TL/_VL
  • ✓ Person → Assignment — this is where that archetype was introduced
  • ✓ Organization → Hierarchy — Department structures nest

If you've understood the previous five sections, very little in the HCM schema should feel completely unfamiliar. You'll mostly be recognizing patterns you've already seen.

Tables You'll Meet Most Often (in the order you'll actually need them, not alphabetical)

  • PER_ALL_PEOPLE_F — a worker's identity
  • PER_ALL_ASSIGNMENTS_M — their current role
  • PER_PERSON_NAMES_F — their display name
  • HR_ALL_ORGANIZATION_UNITS_F — their department
  • PER_JOBS_VL — their job title

Need primary keys, join paths, reporting scenarios, and common mistakes? Expand the detailed reference below.

▼ Detailed Table Reference — HCM

Tier 1 — Essential Tables

PER_ALL_PEOPLE_F

Purpose
Stores the core identity of a person. Other business information — such as names, assignments, email addresses, and national identifiers — is stored in related objects linked through PERSON_ID.
Why it exists
Oracle separates identity from employment, names, contact information, and assignments so each can evolve independently while remaining linked to the same person.
Key identifier
PERSON_ID. This is an effective-dated object, so multiple rows can exist for the same person across different effective periods.
Common joins
PER_ALL_ASSIGNMENTS_M (via person_id, same-date) · → PER_PERSON_NAMES_F (via person_id, same-date)
Common reporting use
Headcount, worker directories.
Common mistake
Assuming the display name lives here — it's one join away, in PER_PERSON_NAMES_F.
SQL Guide
Retrieve Active Employees with Their Current Assignment
Usually your starting table?
✓ Usually starts here

PER_ALL_ASSIGNMENTS_M

Purpose
The assignment — department, job, grade, status, and the path to manager resolution.
Why it exists
Separates who someone is from what role they currently hold, because the role changes independently of identity, and — for many workers — more than once over a career.
Key identifier
ASSIGNMENT_ID. This is an effective-dated object, so multiple rows can exist for the same assignment across different effective periods.
Common joins
PER_ALL_PEOPLE_F (person_id) · → HR_ALL_ORGANIZATION_UNITS_F (organization_id) · → PER_JOBS_VL (job_id) · → PER_ASSIGNMENT_SUPERVISORS_F (manager resolution, see Tier 2)
Common reporting use
Headcount by department/job, org charts.
Common mistake
Assuming every assignment is relevant. Many worker reports need the primary assignment only (primary_flag = 'Y'), but the correct filter depends on the business question — not every report should default to it.
SQL Guide
Retrieve Active Employees with Their Current Assignment; Employees with Their Direct Manager
Usually your starting table?
Sometimes starts here

PER_PERSON_NAMES_F

Purpose
The display name, kept separate from core identity.
Why it exists
Name types (legal, display, and others) can vary independently of identity, following the same effective-dating pattern as everything else in HCM.
Key identifier
PERSON_ID plus name type. This is an effective-dated object, so multiple rows can exist for the same person across different effective periods.
Common joins
PER_ALL_PEOPLE_F (person_id)
Common reporting use
Any report that needs to display a worker's name.
Common mistake
A person can have more than one name row for the same date, distinguished by name type — worth filtering explicitly rather than assuming one row per person per date.
SQL Guide
Retrieve Active Employees with Their Current Assignment
Usually your starting table?
Usually joined

HR_ALL_ORGANIZATION_UNITS_F

Purpose
Departments and other organizational units.
Why it exists
Effective-dated because org structures change through reorganizations. Many organizational concepts are ultimately represented through this broader organizational model, although the exact usage varies across product areas.
Key identifier
ORGANIZATION_ID. This is an effective-dated object, so multiple rows can exist for the same organization across different effective periods.
Common joins
Referenced from PER_ALL_ASSIGNMENTS_M via organization_id; self-referencing for parent-child hierarchy.
Common reporting use
Headcount by department, org-structure reports.
Common mistake
Treating the result as a flat list when it's actually a hierarchy — a department's own row doesn't show you its place in the structure without following the parent reference.
SQL Guide
Retrieve Active Employees with Their Current Assignment
Usually your starting table?
Reference object

PER_JOBS_VL

Purpose
Job title, already resolved to your session's language.
Why it exists
The _VL pattern from the naming conventions and translation sections — a pre-built, pre-joined view so nobody has to hand-join base and translation tables for something as routine as a job title.
Common joins
Referenced from PER_ALL_ASSIGNMENTS_M via job_id.
Common reporting use
Headcount by job, any job-title display.
Common mistake
Querying PER_JOBS_B directly and getting no name back, or hand-joining PER_JOBS_TL without a language filter when PER_JOBS_VL already does that correctly.
SQL Guide
Retrieve Active Employees with Their Current Assignment; Headcount by Grade (same pattern applied to grades)
Usually your starting table?
Lookup object

Tier 2 — Supporting Tables

🟢 Frequently Used

🟢PER_ASSIGNMENT_SUPERVISORS_F — Resolves an assignment's manager. Usually joined with: PER_ALL_ASSIGNMENTS_M. Used in: manager/direct-report reporting (Employees with Their Direct Manager). Usually your starting table? Never — always reached from an assignment.
🟢PER_PERIODS_OF_SERVICE — Hire, termination, and rehire dates. Usually joined with: PER_ALL_PEOPLE_F. Used in: tenure, attrition, and rehire reporting.
🟢PER_EMAIL_ADDRESSES — Worker email addresses. Usually joined with: PER_ALL_PEOPLE_F. Used in: worker directories, notifications.

🟡 Sometimes Used

🟡PER_GRADES_VL — Grade name, resolved to session language. Usually joined with: PER_ALL_ASSIGNMENTS_M. Used in: compensation planning, grade-structure reviews (Headcount by Grade).
🟡HR_ALL_POSITIONS_F — Position definitions, for implementations that use position-based structures rather than job-based only. Usually joined with: PER_ALL_ASSIGNMENTS_M. Used in: position-based headcount and budgeting reports.
🟡PER_ALL_WORK_RELATIONSHIPS_F — The employment relationship layer above an assignment. Usually joined with: PER_ALL_PEOPLE_F, PER_ALL_ASSIGNMENTS_M. Used in: work-relationship and multi-assignment reporting.
🟡PER_PHONES — Worker phone numbers. Usually joined with: PER_ALL_PEOPLE_F. Used in: worker directories.
🟡PER_ADDRESSES — Worker home/mailing addresses. Usually joined with: PER_ALL_PEOPLE_F. Used in: worker directories, statutory reporting.
🟡PER_NATIONAL_IDENTIFIERS — National identifier values, kept separate for privacy/security handling. Usually joined with: PER_ALL_PEOPLE_F. Used in: statutory and compliance reporting.

⚪ Specialized

PER_JOBS_B — The base (language-independent) job record behind PER_JOBS_VL. Usually joined with: PER_JOBS_TL. Used in: rarely queried directly.
PAY_RUN_RESULTS — Payroll calculation output, per element, per person, per run. Usually joined with: PAY_RUN_RESULT_VALUES. Used in: payroll-specific data structures beyond this Foundation Guide's scope.
Continue Learning — Foundation: Oracle Fusion Tables Reference
✓ Part I complete ✓ HCM □ General Ledger, AP & AR ← next □ Procurement & Inventory □ Projects & Security
Module Reference

Financials: General Ledger, Accounts Payable, Accounts Receivable

How Financials Thinks

Every financial transaction eventually answers the same question: which GL account does this hit? An AP invoice, an AR transaction, and a GL journal entry are three different starting points that all converge on the same ledger — this is the Transaction → Distribution pattern, applied at the scale of an entire company's books.

Financials also leans harder on the Multi-Org pattern than HCM does — nearly everything here is an _ALL table, because invoices, receivables, and journals are exactly the kind of data that has to stay separated by business unit and legal entity while still living in one shared schema.

Core Business Objects: Journal Entry (GL) · Invoice (AP) · Customer Transaction (AR) · Chart of Accounts

Recurring Patterns

  • ✓ Header → Lines — journal headers/lines, invoice headers/lines, AR transaction headers/lines
  • ✓ Transaction → Distribution — the AP/AR-to-GL bridge, the defining shape of this whole module
  • ✓ Party → Account/Site — suppliers and customers, both built on the party pattern
  • ✓ Multi-Org — almost every table here is _ALL
  • ✗ Person → Assignment, Organization → Hierarchy — not natural fits here; if you're looking for those, they belong in HCM

General Ledger — Tables You'll Meet Most Often

GL_JE_HEADERSGL_JE_LINESGL_CODE_COMBINATIONSGL_BALANCES

The four General Ledger tables below are enough to understand how journals move through Oracle Fusion. The detailed reference expands each one.

▼ Detailed Table Reference — General Ledger

Tier 1 — Essential Tables

GL_JE_HEADERS

Purpose
Journal entry headers — batch, source, accounting period, and status.
Why it exists
Separates the journal entry as a whole (when it was created, whether it's posted) from the individual account movements inside it, the same Header → Lines shape used everywhere else in Financials.
Key identifier
JE_HEADER_ID.
Common joins
GL_JE_LINES (je_header_id)
Common reporting use
Journal listings, posting-status reports.
Common mistake
Not filtering by status and period_name — an unfiltered query pulls unposted and historical-period journals along with the current ones.
SQL Guide
Journal Entries for a Specific Accounting Period
Usually your starting table?
Usually starts here

GL_JE_LINES

Purpose
Individual journal lines — account, debit, credit, description.
Why it exists
One journal entry routinely touches many accounts at once; each account movement needs its own row.
Key identifier
JE_HEADER_ID + JE_LINE_NUM.
Common joins
GL_JE_HEADERS (je_header_id) · → GL_CODE_COMBINATIONS (code_combination_id)
Common reporting use
Account-level detail, trial balances built from source lines.
Common mistake
Aggregating without deliberate grouping — one header can carry hundreds of lines, and summing them naively can double-count what a well-formed report should be grouping by account.
SQL Guide
Journal Entries for a Specific Accounting Period
Usually your starting table?
Usually joined

GL_CODE_COMBINATIONS

Purpose
The chart of accounts — each row is one valid combination of segments (company, account, cost center, and whatever else a given chart of accounts defines).
Why it exists
Rather than storing account, cost center, and other segments as separate columns on every transaction, Fusion resolves the whole combination to one ID, reused everywhere a transaction needs to post to the ledger.
Key identifier
CODE_COMBINATION_ID.
Common joins
Referenced from GL_JE_LINES and from every module's distribution tables (AP_INVOICE_DISTRIBUTIONS_ALL, PO_DISTRIBUTIONS_ALL).
Common reporting use
Resolving a transaction's account/cost-center detail for reporting.
Common mistake
Assuming the generically-named segment columns (segment1, segment2...) mean the same thing in every implementation — confirm what each maps to per ledger before reusing a query elsewhere.
SQL Guide
Trial Balance by Account, via GL_BALANCES
Usually your starting table?
Usually joined

GL_BALANCES

Purpose
Summarized period balances by account and currency.
Why it exists
Summing GL_JE_LINES for a period-end balance works but is expensive at scale; Fusion maintains pre-summarized balances for exactly this kind of reporting.
Key identifier
Combination of code_combination_id, period_name, and currency.
Common joins
GL_CODE_COMBINATIONS · → GL_PERIODS (see Tier 2)
Common reporting use
Period-end balance reporting, trial balances at scale.
Common mistake
Using GL_JE_LINES for balance reporting when GL_BALANCES already has the summarized answer, much faster.
SQL Guide
Trial Balance by Account, via GL_BALANCES
Usually your starting table?
Usually starts here (balance-only reporting)

Tier 2 — Supporting Tables

🟢 Frequently Used

🟢GL_PERIODS — Accounting period definitions and status (open/closed/future). Usually joined with: GL_JE_HEADERS, GL_BALANCES. Used in: period-status validation before trusting a report's completeness.

🟡 Sometimes Used

🟡GL_LEDGERS — The ledger definition itself — chart of accounts, currency, and calendar. Usually joined with: GL_JE_HEADERS. Used in: multi-ledger environments where a report needs to confirm which ledger it's scoped to.

⚪ Specialized

GL_DAILY_RATES — Currency conversion rates by date. Usually joined with: transactions crossing currencies. Used in: multi-currency reporting only.

Accounts Payable — Tables You'll Meet Most Often

AP_INVOICES_ALLAP_INVOICE_LINES_ALLAP_INVOICE_DISTRIBUTIONS_ALL → Supplier

These four tables cover most invoice-to-payment reporting. The detailed reference below fills in the rest.

▼ Detailed Table Reference — Accounts Payable

Tier 1 — Essential Tables

AP_INVOICES_ALL

Purpose
Invoice headers — supplier, amount, status, dates.
Why it exists
The Header → Lines pattern again, plus Multi-Org — an _ALL table because invoices are scoped by business unit.
Key identifier
INVOICE_ID.
Common joins
AP_INVOICE_LINES_ALL (invoice_id)
Common reporting use
Invoice listings, AP aging inputs.
Common mistake
Querying without a business-unit filter — the same Multi-Org mistake covered earlier, applied to invoices specifically.
SQL Guide
Open AP Invoices Awaiting Payment
Usually your starting table?
Usually starts here

AP_INVOICE_LINES_ALL

Purpose
Invoice line detail — item, amount, distribution reference, and often a match back to a purchase order line.
Why it exists
An invoice header rarely represents one flat charge; the lines are where that detail actually lives.
Key identifier
INVOICE_ID + LINE_NUMBER.
Common joins
AP_INVOICES_ALL · → PO_LINES_ALL (when matched to a purchase order)
Common reporting use
Line-level spend analysis, PO-match reporting.
SQL Guide
AP Invoice Line and Distribution Detail
Usually your starting table?
Usually joined

AP_INVOICE_DISTRIBUTIONS_ALL

Purpose
GL distribution detail behind each invoice line — this is the Transaction → Distribution archetype, in its most direct form.
Why it exists
An invoice line and its GL impact are two different questions — this table is where "which account did this invoice actually hit" gets answered.
Key identifier
INVOICE_ID + DISTRIBUTION_LINE_NUMBER.
Common joins
AP_INVOICE_LINES_ALL · → GL_CODE_COMBINATIONS
Common reporting use
Reconciling AP to GL.
Common mistake
Treating this as a simple 1:1 extension of the invoice line — one line can generate multiple distributions (tax, freight, multiple accounts).
SQL Guide
AP Invoice Line and Distribution Detail; Reconciling an AP Invoice Distribution to Its Subledger Accounting Entry
Usually your starting table?
Usually joined

POZ_SUPPLIERS

Purpose
Unified supplier master — the current Procurement-owned supplier model.
Why it exists
The Party → Account/Site pattern — a supplier is one party, potentially operating from several sites.
Common joins
POZ_SUPPLIER_SITES_ALL_M for site-level detail (address, payment terms).
Common mistake
Oracle Fusion implementations may expose supplier information through different objects depending on the product family and release. Focus on the business pattern first rather than memorizing one physical table — the legacy AP_SUPPLIERS object still exists in some environments, but POZ_SUPPLIERS is the current, unified model.
SQL Guide
Active Suppliers and Their Payment Terms
Usually your starting table?
Sometimes starts here

Tier 2 — Supporting Tables

🟢 Frequently Used

🟢AP_SUPPLIER_SITES_ALL — Site-level supplier detail — address, payment terms. Usually joined with: POZ_SUPPLIERS. Used in: payment processing, remit-to reporting.

🟡 Sometimes Used

🟡AP_PAYMENT_SCHEDULES_ALL — Amount due, amount paid, and due dates — the AP-side counterpart to AR's aging engine. Usually joined with: AP_INVOICES_ALL. Used in: cash-flow and payables-aging reporting.

Accounts Receivable — Tables You'll Meet Most Often

RA_CUSTOMER_TRX_ALLRA_CUSTOMER_TRX_LINES_ALLAR_PAYMENT_SCHEDULES_ALL → Customer

These four tables cover most billing-to-collection reporting. The detailed reference below fills in the rest.

▼ Detailed Table Reference — Accounts Receivable

Tier 1 — Essential Tables

RA_CUSTOMER_TRX_ALL

Purpose
AR transaction headers — invoices, credit memos, debit memos.
Why it exists
Header → Lines and Multi-Org again, mirroring the AP side from the customer's direction instead of the supplier's.
Key identifier
CUSTOMER_TRX_ID.
Common joins
RA_CUSTOMER_TRX_LINES_ALL
Common reporting use
AR transaction listings.
Common mistake
The same business-unit scoping mistake as AP_INVOICES_ALL — this is also an _ALL table.
SQL Guide
Open Customer Invoices and Balances Due
Usually your starting table?
Usually starts here

RA_CUSTOMER_TRX_LINES_ALL

Purpose
Line-level detail — item, revenue amount, tax and freight lines.
Why it exists
A transaction header covers the whole bill; line type distinguishes revenue lines from tax and freight, which behave differently in reporting.
Key identifier
CUSTOMER_TRX_ID + CUSTOMER_TRX_LINE_ID.
Common mistake
Summing all lines without filtering by line type, mixing revenue with tax/freight in a total that's supposed to be revenue-only.
SQL Guide
Open Customer Invoices and Balances Due
Usually your starting table?
Usually joined

AR_PAYMENT_SCHEDULES_ALL

Purpose
Amount due, amount paid, and due dates.
Why it exists
"Overdue" and "outstanding balance" are calculated here, not on the transaction table itself — a distinct object for a distinct question.
Key identifier
PAYMENT_SCHEDULE_ID.
Common joins
RA_CUSTOMER_TRX_ALL
Common reporting use
AR aging, collections reporting.
Common mistake
Calculating "overdue" from the transaction table instead of this one — the transaction table doesn't track payment status.
SQL Guide
AR Aging by Customer
Usually your starting table?
Sometimes starts here (aging-specific reports)

HZ_CUST_ACCOUNTS

Purpose
Customer account records.
Why it exists
The Party → Account/Site pattern's customer side — the account sits on top of the underlying party.
Key identifier
CUST_ACCOUNT_ID.
Common joins
HZ_PARTIES for the underlying party name (person or organization).
Common mistake
Expecting the customer name directly on this table — it usually requires the join to HZ_PARTIES.
SQL Guide
Customer Account and Contact Detail
Usually your starting table?
Sometimes starts here

Tier 2 — Supporting Tables

🟢 Frequently Used

🟢HZ_PARTIES — The underlying party record (person or organization) behind a customer account. Usually joined with: HZ_CUST_ACCOUNTS. Used in: customer-name resolution.

🟡 Sometimes Used

🟡HZ_CUST_ACCT_SITES_ALL — Customer site-level detail. Usually joined with: HZ_CUST_ACCOUNTS. Used in: billing/shipping-address reporting.
Continue Learning — Foundation: Oracle Fusion Tables Reference
✓ Part I complete ✓ HCM ✓ General Ledger, AP & AR □ Procurement & Inventory ← next □ Projects & Security
Module Reference

Procurement & Inventory/SCM

How Procurement Thinks

Every purchased item follows the same journey: request → order → receipt → invoice → payment. Procurement owns only part of that journey. Receiving completes the purchasing process, while invoicing and payment continue in Accounts Payable (see the Financials module above). Requisition and Purchase Order are Procurement's own objects; Invoice and Supplier are the same objects already covered there — Procurement doesn't duplicate them, it hands off to them at the end of the journey.

Core Business Objects: Requisition · Purchase Order · Receipt (Invoice and Supplier — see Financials)

Recurring Patterns

  • ✓ Header → Lines — requisition header/lines, PO header/lines
  • ✓ Transaction → Distribution — PO → GL, the same shape as AP → GL
  • ✓ Party → Account/Site — Supplier, already introduced in Financials
  • ✓ Multi-Org — _ALL tables again

Tables You'll Meet Most Often

POR_REQUISITION_HEADERS_ALLPO_HEADERS_ALLPO_LINES_ALLRCV_TRANSACTIONSPO_DISTRIBUTIONS_ALL

These five tables cover the requisition-to-receipt journey. The detailed reference below fills in the rest.

▼ Detailed Table Reference — Procurement

Tier 1 — Essential Tables

POR_REQUISITION_HEADERS_ALL

Purpose
Requisition headers — the request that precedes a PO.
Why it exists
Separates the internal request from the PO it may become, useful for cycle-time reporting.
Key identifier
REQUISITION_HEADER_ID.
Common joins
POR_REQUISITION_LINES_ALL; lines can reference the PO lines they became.
Common reporting use
Approval-pending requisitions, requisition-to-PO cycle time.
SQL Guide
Requisitions Pending Approval; Requisition Cycle Time: Creation to Approval
Usually your starting table?
Usually starts here

PO_HEADERS_ALL

Purpose
Purchase order headers — supplier, status, PO number, type.
Why it exists
Header → Lines again, plus Multi-Org.
Key identifier
PO_HEADER_ID.
Common joins
PO_LINES_ALL
Common reporting use
Open-PO listings by supplier.
Common mistake
The same business-unit scoping mistake as every other _ALL table here.
SQL Guide
Open Purchase Orders by Supplier
Usually your starting table?
Usually starts here

PO_LINES_ALL

Purpose
PO line detail — item, quantity, price.
Why it exists
Quantity and amount exist at multiple levels (line, shipment); the lines are the anchor.
Key identifier
PO_LINE_ID.
Common joins
PO_LINE_LOCATIONS_ALL for shipment-level detail.
Common reporting use
Line-level spend and pricing analysis.
SQL Guide
PO Line Detail with Quantity and Price
Usually your starting table?
Usually joined

RCV_TRANSACTIONS

Purpose
Receiving transaction history.
Why it exists
A PO and its physical receipt are two different events, often on different dates by different people — this table is where "did it actually arrive" gets answered.
Key identifier
TRANSACTION_ID.
Common joins
PO_LINES_ALL; → PO_LINE_LOCATIONS_ALL (shipment schedules).
Common reporting use
Receiving detail, three-way-match support.
Common mistake
Treating this as a complete receiving model — the full receiving schema (shipment headers, lots, serials) goes considerably deeper than this table alone.
SQL Guide
Receiving Transactions Detail
Usually your starting table?
Sometimes starts here

PO_DISTRIBUTIONS_ALL

Purpose
GL distribution detail behind each PO line — the Transaction → Distribution archetype again.
Why it exists
Also the bridge referenced from AP invoice matching, connecting a PO to both the ledger and its eventual invoice.
Key identifier
PO_DISTRIBUTION_ID.
Common joins
GL_CODE_COMBINATIONS; referenced from AP_INVOICE_DISTRIBUTIONS_ALL when matched.
Common reporting use
PO-to-GL validation.
SQL Guide
Validating That Every PO Distribution Has a Valid GL Account
Usually your starting table?
Usually joined

Tier 2 — Supporting Tables

🟢 Frequently Used

🟢POR_REQUISITION_LINES_ALL — Requisition line detail. Usually joined with: POR_REQUISITION_HEADERS_ALL. Used in: cycle-time and demand reporting.

🟡 Sometimes Used

🟡PO_LINE_LOCATIONS_ALL — Shipment-level PO detail. Usually joined with: PO_LINES_ALL. Used in: delivery-schedule reporting (PO Shipment and Delivery Detail).
🟡POZ_SUPPLIERS — Procurement's supplier object. Closely related to the supplier objects discussed in the Financials module above.

How Inventory Thinks

Inventory doesn't primarily track products. It tracks where those products are, how they move, and how much of them exists at a given point in time. That's a different question from "what is this item," and Fusion answers it with different tables for each part.

Inventory introduces its own organizational scoping concept, the Inventory Organization — a physical or logical location distinct from the Business Unit scoping covered earlier. This Guide doesn't go deep on Inventory Organization's full configuration, but it's worth knowing it exists as the "where" behind every inventory table below.

Core Business Objects: Item · On-Hand Quantity · Material Transaction

Recurring Patterns

  • ✓ Organization-specific master data — the same item can look different per inventory organization
  • ✓ Current State ↔ Transaction History — on-hand quantity vs. the movements that produced it
  • ✓ Multi-Org (Inventory Organization) — a different scope than Business Unit
  • ✓ Translation — item descriptions, the least distinctive pattern here, listed last on purpose

Tables You'll Meet Most Often

EGP_SYSTEM_ITEMS_BEGP_ITEM_CAT_ASSIGNMENTSINV_ONHAND_QUANTITIES_DETAILINV_MATERIAL_TXNS

These four tables cover most item and stock-level reporting. The detailed reference below fills in the rest.

▼ Detailed Table Reference — Inventory

Tier 1 — Essential Tables

EGP_SYSTEM_ITEMS_B

Purpose
Item master — one row per item, managed through Product Hub rather than the legacy Inventory schema.
Why it exists
The same item can have different attributes per organization (a plant vs. a warehouse), so the row is keyed by both.
Key identifier
INVENTORY_ITEM_ID + ORGANIZATION_ID.
Common joins
Referenced by nearly every inventory, order, and cost query.
Common reporting use
Item master listings.
Common mistake
Referencing MTL_SYSTEM_ITEMS_B from older documentation or training material — the item master has moved to EGP_SYSTEM_ITEMS_B in current Oracle Fusion Cloud. Also, expecting the item description here — it lives in the paired translation object, not the base table.
Usually your starting table?
Usually starts here

EGP_ITEM_CAT_ASSIGNMENTS

Purpose
Category assignment for each item.
Why it exists
An item can belong to multiple category sets simultaneously, so category isn't a single column on the item itself.
Common joins
EGP_SYSTEM_ITEMS_B; category definitions live in EGP_CATEGORIES_B/EGP_CATEGORIES_TL.
Common mistake
Filtering by category without also filtering by category set.
Usually your starting table?
Usually joined

INV_ONHAND_QUANTITIES_DETAIL

Purpose
Current on-hand quantity by item, subinventory, and lot/serial where applicable.
Why it exists
A current-state snapshot, distinct from the transaction history that produced it.
Key identifier
Composite, item + organization + subinventory.
Common joins
EGP_SYSTEM_ITEMS_B
Common reporting use
Stock-level reporting.
Common mistake
Using this table for movement history — it reflects current state only.
Usually your starting table?
Usually starts here (stock reports)

INV_MATERIAL_TXNS

Purpose
Transaction history — receipts, issues, transfers, adjustments.
Why it exists
The audit trail behind on-hand quantity, answering "how did it get there" rather than "how much is there."
Key identifier
TRANSACTION_ID.
Common joins
EGP_SYSTEM_ITEMS_B; to source documents (PO, sales order) where applicable.
Common reporting use
Movement history, reconciliation.
Usually your starting table?
Sometimes starts here (movement history)
Continue Learning — Foundation: Oracle Fusion Tables Reference
✓ Part I complete ✓ HCM ✓ General Ledger, AP & AR ✓ Procurement & Inventory □ Projects & Security ← next
Module Reference

Projects & Security

How Projects Thinks

Every cost, time entry, and invoice belongs to a project structure. Projects doesn't originate most of its own transactions — it's where costs that started in AP, Payroll, or Expenses ultimately get organized, by project and by task.

Core Business Objects: Project · Project Element (Task/WBS) · Expenditure Item

Recurring Patterns

  • ✓ Organization → Hierarchy — this is the same self-referencing shape covered earlier, and Projects is where that pattern's second worked example came from: a project containing tasks, tasks containing sub-tasks.
  • ✓ Transaction → Distribution — expenditure items connect back to the ledger, the same shape as AP and PO.
  • ✓ Multi-Org — _ALL tables again.
  • 🟡 Translation — a project name likely resolves through a paired translation object, following the same pattern as everything else in this Guide, though this Guide hasn't independently verified the exact translation table name for Projects.

Tables You'll Meet Most Often

PJF_PROJECTS_ALL_BPJF_PROJ_ELEMENTS_BPJC_EXPENDITURE_ITEMS_ALL

These three tables cover most project-cost reporting. The detailed reference below fills in the rest.

▼ Detailed Table Reference — Projects

Tier 1 — Essential Tables

PJF_PROJECTS_ALL_B

Purpose
Defines the project itself — its identity, type, status, and lifecycle.
Why it exists
Projects separate the project from the work performed within it, allowing planning, costing, and reporting at multiple levels.
Key identifier
PROJECT_ID.
Common joins
PJF_PROJ_ELEMENTS_B for the work breakdown structure underneath it.
Common reporting use
Project listings, portfolio reporting.
Common mistake
Expecting the project name directly on this base table — it likely lives in a paired translation object, the same pattern taught earlier.
Usually your starting table?
Usually starts here

PJF_PROJ_ELEMENTS_B

Purpose
Work breakdown structure — tasks and sub-tasks within a project.
Why it exists
A project's work is rarely one undifferentiated block; it needs its own internal hierarchy to track cost and time at the task level.
Key identifier
PROJ_ELEMENT_ID.
Common joins
Self-referencing back to the parent project element.
Common reporting use
Task-level cost and schedule reporting.
Usually your starting table?
Usually joined

PJC_EXPENDITURE_ITEMS_ALL

Purpose
Cost transactions charged to a project task — labor, expense, or supplier cost.
Why it exists
This is where project cost actually connects to the rest of the ledger, and to AP invoice distributions for supplier-sourced project cost.
Key identifier
EXPENDITURE_ITEM_ID.
Common joins
PJF_PROJ_ELEMENTS_B; → AP_INVOICE_DISTRIBUTIONS_ALL for supplier-sourced cost.
Common reporting use
Project cost reporting, budget-vs-actual. May originate from AP, Payroll, Expenses, or other integrated sources.
Usually your starting table?
Sometimes starts here

How Security Thinks

Every action begins with identity, then permission, then data visibility. This section doesn't introduce a new security model; it maps the concepts from the Data Visibility & Security section to the tables that implement them.

Core Business Objects: Application User · Role · Security Profile

Recurring Patterns

  • ✓ Everything from the Security section earlier — this section is the table-level companion to that chapter, not a fresh introduction.
  • 🟡 Person → Assignment-adjacent — an application user is optionally linked to an HCM person, but the link is nullable; service and integration accounts legitimately have no person behind them.

Tables You'll Meet Most Often

PER_USERSFND_GRANTSPER_SECURITY_PROFILES

These three tables cover most access and grant reporting. The detailed reference below fills in the rest.

▼ Detailed Table Reference — Security

Tier 1 — Essential Tables

PER_USERS

Purpose
Application user accounts — username and account lifecycle.
Why it exists
An application login and an HCM person are two different concepts that happen to often be linked — this table represents the login, not the person.
Key identifier
USER_ID.
Common joins
Optionally → PER_ALL_PEOPLE_F via person_id (nullable).
Common reporting use
User account audits.
Common mistake
Assuming every user has a linked person — service and integration accounts don't.
SQL Guide
Active Application Users; Mapping an Application User to an HCM Person; Users Without a Linked Person Record; Application User Account Lifecycle
Usually your starting table?
Usually starts here

FND_GRANTS

Purpose
Stores grant information used by Oracle's authorization framework.
Why it exists
Function access (can this role open this page, run this process) is a different question from row-level data visibility, which security profiles handle instead.
Common joins
To role and user definitions.
Common reporting use
Access and grant audits.
Common mistake
Treating this as the complete security picture — it's about function access, not which rows a user can see.
SQL Guide
Role and Duty Grants for a User
Usually your starting table?
Sometimes starts here

PER_SECURITY_PROFILES

Purpose
Defines security profile objects used to scope data visibility, particularly within HCM.
Common joins
Referenced by HCM data role assignments.
Common reporting use
Explaining why two users see different row counts from the same report.
SQL Guide
HCM Data Role Security Profiles Defined in the System
Usually your starting table?
Sometimes starts here
Continue Learning — Foundation: Oracle Fusion Tables Reference
✓ Part I complete ✓ All 8 modules complete □ Quick Reference & Cheat Sheets ← next

Quick Reference Index

Every table this Guide covers, grouped by module. Jump to the module for full context — this index is for when you already know roughly what you're looking for.

TableModulePrimary Purpose
PER_ALL_PEOPLE_FHCMWorker identity
PER_ALL_ASSIGNMENTS_MHCMWorker assignment
PER_PERSON_NAMES_FHCMWorker display name
HR_ALL_ORGANIZATION_UNITS_FHCMDepartment
PER_JOBS_VLHCMJob title
PER_ASSIGNMENT_SUPERVISORS_FHCMManager resolution
PER_PERIODS_OF_SERVICEHCMHire/termination dates
PER_EMAIL_ADDRESSESHCMWorker email
PER_GRADES_VLHCMGrade name
HR_ALL_POSITIONS_FHCMPosition definition
PER_ALL_WORK_RELATIONSHIPS_FHCMEmployment relationship
PER_PHONESHCMWorker phone
PER_ADDRESSESHCMWorker address
PER_NATIONAL_IDENTIFIERSHCMNational ID
PER_JOBS_BHCMJob base record
PAY_RUN_RESULTSHCMPayroll output
GL_JE_HEADERSGeneral LedgerJournal header
GL_JE_LINESGeneral LedgerJournal lines
GL_CODE_COMBINATIONSGeneral LedgerChart of accounts
GL_BALANCESGeneral LedgerPeriod balances
GL_PERIODSGeneral LedgerPeriod status
GL_LEDGERSGeneral LedgerLedger definition
GL_DAILY_RATESGeneral LedgerCurrency rates
AP_INVOICES_ALLAccounts PayableInvoice header
AP_INVOICE_LINES_ALLAccounts PayableInvoice lines
AP_INVOICE_DISTRIBUTIONS_ALLAccounts PayableInvoice-to-GL bridge
POZ_SUPPLIERSAccounts PayableSupplier master
AP_SUPPLIER_SITES_ALLAccounts PayableSupplier site detail
AP_PAYMENT_SCHEDULES_ALLAccounts PayableAmount due/paid
RA_CUSTOMER_TRX_ALLAccounts ReceivableAR transaction header
RA_CUSTOMER_TRX_LINES_ALLAccounts ReceivableAR transaction lines
AR_PAYMENT_SCHEDULES_ALLAccounts ReceivableAging/collections
HZ_CUST_ACCOUNTSAccounts ReceivableCustomer account
HZ_PARTIESAccounts ReceivableUnderlying party
HZ_CUST_ACCT_SITES_ALLAccounts ReceivableCustomer site detail
POR_REQUISITION_HEADERS_ALLProcurementRequisition header
PO_HEADERS_ALLProcurementPurchase order header
PO_LINES_ALLProcurementPO line detail
RCV_TRANSACTIONSProcurementReceiving history
PO_DISTRIBUTIONS_ALLProcurementPO-to-GL bridge
POR_REQUISITION_LINES_ALLProcurementRequisition lines
PO_LINE_LOCATIONS_ALLProcurementPO shipment detail
EGP_SYSTEM_ITEMS_BInventoryItem master
EGP_ITEM_CAT_ASSIGNMENTSInventoryItem category
INV_ONHAND_QUANTITIES_DETAILInventoryCurrent stock level
INV_MATERIAL_TXNSInventoryMovement history
PJF_PROJECTS_ALL_BProjectsProject identity
PJF_PROJ_ELEMENTS_BProjectsWork breakdown structure
PJC_EXPENDITURE_ITEMS_ALLProjectsProject cost
PER_USERSSecurityApplication login
FND_GRANTSSecurityFunction access grant
PER_SECURITY_PROFILESSecurityData visibility scope

Find by Business Question

"I need employee information" → PER_ALL_PEOPLE_F
"I need current assignments" → PER_ALL_ASSIGNMENTS_M
"I need who someone's manager is" → PER_ASSIGNMENT_SUPERVISORS_F
"I need AP invoices" → AP_INVOICES_ALL
"I need customer invoices" → RA_CUSTOMER_TRX_ALL
"I need supplier information" → POZ_SUPPLIERS
"I need journal entries" → GL_JE_HEADERS
"I need account balances" → GL_BALANCES
"I need purchase orders" → PO_HEADERS_ALL
"I need what's been received against a PO" → RCV_TRANSACTIONS
"I need current inventory levels" → INV_ONHAND_QUANTITIES_DETAIL
"I need project cost detail" → PJC_EXPENDITURE_ITEMS_ALL
"I need why two users see different data" → PER_SECURITY_PROFILES

Common Join Paths

The Quick Reference Index above answers "which module is this table in?" This section answers a different question: "I need to build this report — where do I start, and what do I join to?" Nobody starts writing a query by asking "what can I join to PER_ALL_PEOPLE_F?" You start with a business question. Full worked queries with WHERE clauses and effective-date filters live in the SQL Guide — this is your structural map, not the finished query.

1. Employee Directory

I need names, active jobs, and current departments.

PER_ALL_PEOPLE_FPER_PERSON_NAMES_FPER_ALL_ASSIGNMENTS_MPER_JOBS_VLHR_ALL_ORGANIZATION_UNITS_F

Pattern: ✓ Person → Assignment ✓ Master → Translation
Crucial Rule: apply the same TRUNC(SYSDATE) BETWEEN effective_start_date AND effective_end_date filter to every _F/_M table in the chain, not just one.
SQL Guide → Retrieve Active Employees with Their Current Assignment

2. Employee → Manager

I need the direct line manager for an active employee.

PER_ALL_PEOPLE_FPER_ALL_ASSIGNMENTS_MPER_ASSIGNMENT_SUPERVISORS_FPER_PERSON_NAMES_F

Pattern: ✓ Person → Assignment
Crucial Rule: filtering to supervisor_type = 'LINE_MANAGER' is the general pattern — the exact seeded value can vary by release, worth confirming against your instance.
SQL Guide → Employees with Their Direct Manager

3. Supplier Invoice → GL Account

AP_INVOICES_ALLAP_INVOICE_LINES_ALLAP_INVOICE_DISTRIBUTIONS_ALLGL_CODE_COMBINATIONS

Pattern: ✓ Header → Lines ✓ Transaction → Distribution
SQL Guide → AP Invoice Line and Distribution Detail

4. Purchase Order → Receipt

I want to see if ordered items actually arrived.

PO_HEADERS_ALLPO_LINES_ALLPO_LINE_LOCATIONS_ALLRCV_TRANSACTIONS

SQL Guide → Receiving Transactions Detail; PO Shipment and Delivery Detail

5. Purchase Order → GL Distribution

PO_HEADERS_ALLPO_LINES_ALLPO_DISTRIBUTIONS_ALLGL_CODE_COMBINATIONS

Pattern: ✓ Transaction → Distribution
SQL Guide → Validating That Every PO Distribution Has a Valid GL Account

6. Customer Invoice → Payment Status

RA_CUSTOMER_TRX_ALLAR_PAYMENT_SCHEDULES_ALL

SQL Guide → AR Aging by Customer

7. Customer Account → Customer Name

HZ_CUST_ACCOUNTSHZ_PARTIES

Pattern: ✓ Party → Account
SQL Guide → Customer Account and Contact Detail

8. Journal → Chart of Accounts

GL_JE_HEADERSGL_JE_LINESGL_CODE_COMBINATIONS

Pattern: ✓ Header → Lines
SQL Guide → Journal Entries for a Specific Accounting Period

9. Item → Current Stock

EGP_SYSTEM_ITEMS_BINV_ONHAND_QUANTITIES_DETAIL

10. Project → Task → Cost

PJF_PROJECTS_ALL_BPJF_PROJ_ELEMENTS_BPJC_EXPENDITURE_ITEMS_ALL

Pattern: ✓ Organization → Hierarchy ✓ Transaction → Distribution

If You Want to Report On...

If you want to report on...Anchor Table
Employees & ContractorsPER_ALL_PEOPLE_F
Jobs, Grades & AssignmentsPER_ALL_ASSIGNMENTS_M
Departments & OrganizationsHR_ALL_ORGANIZATION_UNITS_F
General Ledger JournalsGL_JE_HEADERS
Trial / Account BalancesGL_BALANCES
Supplier (AP) InvoicesAP_INVOICES_ALL
Customer (AR) InvoicesRA_CUSTOMER_TRX_ALL
Procurement (Purchase Orders)PO_HEADERS_ALL
Procurement (Requisitions)POR_REQUISITION_HEADERS_ALL
Inventory Master ItemsEGP_SYSTEM_ITEMS_B
Project Costing & BillingPJF_PROJECTS_ALL_B
Application Users & LoginsPER_USERS

Common Mistakes About the Schema Itself

The SQL Guide's own "Common Mistakes" sections are usually about queries — a missing date filter, a forgotten primary_flag, or a bad join. This section is different. These are mistaken assumptions about the schema itself, made before a single line of SQL gets written, and they are just as costly.

1. Assuming an EBS table name carries over unchanged.

Oracle Fusion evolved from, but isn't identical to, E-Business Suite (EBS). Some objects kept their EBS-era names; others moved entirely. The item master's migration from the legacy MTL_SYSTEM_ITEMS_B to EGP_SYSTEM_ITEMS_B under Product Hub is a live, current example. A table name that "feels standard" from general Oracle Applications experience is exactly the kind of assumption worth verifying rather than trusting blindly.

2. Assuming _ALL always means the same thing.

The _ALL suffix means multi-business-unit (multi-org) in Financials and Procurement (e.g., AP_INVOICES_ALL). However, it means something entirely different in HCM, where it signals "every worker type in one table" (e.g., PER_ALL_PEOPLE_F). Reading the suffix without checking the module it belongs to produces a confident but completely wrong assumption.

3. Assuming the base table holds the display name.

A _B (Base) table holds structural identity and internal IDs. The human-readable name or description almost always lives in the paired _TL (Translation) or _VL (View Language) object. Querying a _B table alone and getting no name back isn't a bug — it is the Fusion architecture working exactly as designed.

4. Treating a _VL view as a permanent, stable contract.

A view can be rebuilt, and the underlying columns it exposes can shift in ways a base table's structure typically won't. "Convenient" does not mean "guaranteed." It is always worth doing a quick sanity check on your views after a major release upgrade, not just at initial implementation time.

5. Assuming one canonical table version exists forever.

Oracle Fusion Cloud is updated quarterly. A table, column, or relationship that works perfectly today isn't automatically guaranteed to behave the exact same way on a future release. Re-verify your critical queries after major upgrades rather than assuming absolute stability by default.

6. Relying on a column just because it "happens to work."

An undocumented or clearly internal-purpose column holding a useful value today is not the same thing as a supported reporting column. It can change or disappear without notice in a future patch — a distinction that matters most when a critical production report suddenly breaks and nobody remembers how it was built.

Key Takeaways

  • Most schema-level mistakes come from assuming familiarity instead of actively verifying it.
  • Past EBS experience is a great starting instinct, but it is not a substitute for checking the actual Fusion table names.
  • Table suffixes and views encode real architectural information, but they only make sense when read in context, not in isolation.

The remaining open questions readers tend to have aren't about any one specific table — they are about how to use this Guide day to day. That is exactly what the FAQ is for.

FAQ

What does _ALL mean in Oracle Fusion table names?

It depends on the module. In Financials and Procurement, it means multi-business-unit — the table holds every business unit's rows together. In HCM, it means "every worker type in one table," an entirely different concept using the exact same three letters.

What is the difference between _F and _M tables?

Both are effective-dated — both require a date predicate, and both can hold multiple historical versions of the same record. _M is a newer versioning model, most visible on assignments. The practical querying rule is identical for both.

How do I find which table stores a specific piece of data?

Start with the Business Object it belongs to, not the column name. Ask, "Which business concept is this part of?" Then check the Quick Reference Index or the Common Join Paths section for that object's anchor table.

Is there an official Oracle Fusion ERD?

There is not a single comprehensive Entity-Relationship Diagram covering the whole application the way this Guide's patterns do. Oracle's own documentation is strong on individual objects; this Guide focuses on the relationships and reasoning between them.

Why can't I find a column that documentation says should exist?

Columns and views can shift between quarterly releases. Always confirm against your specific environment before assuming documentation is perfectly aligned — including this Guide's current release.

What is the difference between a base table and a view?

A base (_B) table holds structural, language-independent data. A _VL object is a view, not a table; it is pre-joined to the translation layer and automatically filtered to your session's language.

Are Oracle Fusion table names stable across releases?

Generally yes, but it is not guaranteed. This Guide assumes current Oracle Fusion Cloud releases throughout, and flags anywhere behavior is known to vary.

What does _TL mean, and when do I need it?

It stands for Translation — one row per record per installed language. You only need to query it directly when a _VL view doesn't already exist for that object; otherwise, the view does the heavy lifting for you.

Why do two people running the same report see different results?

This is data security at work, not a bug. Each user's assigned security profile scopes what they can see, applied before the results reach them — the exact mechanism varies by tool and product area, but the outcome is consistent: security is a filter on the data, not a flaw in the report.

What is the difference between a Business Object and a table?

A Business Object (like Employee, Invoice, or Purchase Order) is the functional concept a business user thinks in terms of. It is almost never one table — it is assembled from multiple relational tables joining together.

Why does a query sometimes return duplicate rows?

It is usually a missing scope, not a wrong join. A missing effective-date filter, a missing language filter, or a missing business-unit filter can each produce duplicates for entirely different reasons.

Is this Guide's table list complete?

No, and it isn't trying to be. It covers the tables that come up constantly, with enough depth to help you build a real mental model — it is not meant to be a catalog of every single table.

How is this Guide different from Oracle's official documentation?

Oracle's documentation is the right place to confirm a specific column exists. This Guide focuses on why the schema is shaped the way it is and how tables relate — the architectural reasoning that standard documentation doesn't cover.

Should I read this Schema Guide or the SQL Guide first?

Either one — they are designed to work from both directions. Arriving here first gives you the foundation before writing complex SQL; arriving from the SQL Guide means you are getting the full explanation for the tables you have already been joining.

What if a table name in this Guide doesn't match my environment?

Oracle Fusion evolves, and this Guide is explicit about anywhere it isn't fully confident. Treat a mismatch as a signal to verify against your specific release — the exact critical thinking this Guide tries to model throughout.

What does it mean when a table has both _ALL and _M?

It means both conventions are stacked (e.g., PER_ALL_ASSIGNMENTS_M). You are seeing multi-org scoping and the newer effective-dating model applied together, because some objects genuinely require both.

What is the difference between a Legal Entity, Business Unit, and Ledger?

The Legal Entity represents the legal and tax structure, the Business Unit is the operational transaction scope, and the Ledger is where the accounting entries land. They are three different concepts that interact constantly.

Do I need to memorize all these tables?

No — that is explicitly not the goal. Recognizing the structural patterns behind them is what lets an unfamiliar table make sense on sight.

Conclusion

Go back to the opening line of this Guide: finding the right table is usually the hardest part. That is still true —but it should feel different now than it did on page one.

PER_ALL_PEOPLE_F no longer looks like "the employee table" in some vague, catch-all sense. It looks like exactly what it is: one piece of a Business Object, holding identity and nothing else, with the department, job, and manager living deliberately elsewhere. An unfamiliar table like EGP_ITEM_CAT_ASSIGNMENTS or PJC_EXPENDITURE_ITEMS_ALL shouldn't feel like a cold start anymore either — you now recognize a _B / _ALL combination, a Header → Lines shape, or a Transaction → Distribution bridge.

The vocabulary from the naming conventions section and the patterns from the Relationship Archetypes section don't just explain the fifty-some tables this Guide actually covers. They are what make the next table — the one this Guide never mentioned — readable on sight.

That was always the actual goal: not a longer table list, but a shorter list of ideas that explain a longer list of tables.

Naming conventions that encode real information instead of adding noise.

A schema split across _F, _TL, and _ALL not because Oracle likes complexity, but because multi-language, multi-org, effective-dated software genuinely needs that split to work at all.

Business Objects that live nowhere and everywhere at once, assembled fresh every time someone actually needs to see one as a whole.

Security applied as a filter before anyone's report logic gets a say.

A handful of relationship shapes standing in for what would otherwise be hundreds of one-off joins to memorize.

If you came here first, the Oracle Fusion SQL Guide is where fifty of these patterns turn into working queries — the same tables, the same joins, written out in full.

If you came here from the SQL Guide, you now have the reasoning behind the joins you were already writing — the primary keys, the relationships, and the "why" that wasn't strictly necessary mid-query, but was always worth having.

Neither guide is the complete picture on its own. They are the two core references this Guide's architecture assumes you will actually use: one for what the data means, and one for how to ask it a question.

You Now Understand How Oracle Fusion Organizes Its Data

The SQL that acts on it is still the fastest part to write, as long as you know where to look. With FusionLens SQL, these patterns don't need to be re-derived from memory every time. You don't have to waste time manually looking up a table, checking whether it is effective-dated, or trying to remember the exact join you already learned here. FusionLens provides the context, the schema exploration, and the autocomplete you need to run direct queries in seconds.