If you have ever browsed the Oracle Fusion Cloud HCM schema, you have seen table names like PER_ALL_PEOPLE_F, PER_ALL_PEOPLE_TL, and PER_ALL_PEOPLE_VL. The suffix at the end is not random. It encodes critical information about what the table stores and how it behaves.
Understanding these suffixes is essential for writing correct queries, building OTBI reports, and setting up HCM Extract or BIP data models. This guide covers every suffix you will encounter.
Quick Reference: All Table Suffixes
| Suffix | Meaning | Example | When to Use |
|---|---|---|---|
| _F | Date-Effective (Fusion) | PER_ALL_PEOPLE_F | When you need historical rows with EFFECTIVE_START_DATE / EFFECTIVE_END_DATE |
| _TL | Translation | PER_ALL_PEOPLE_TL | When you need translated (language-specific) values like names in multiple languages |
| _VL | View (Language) | PER_ALL_PEOPLE_VL | Convenience view joining _F + _TL for current session language |
| _ALL | All Records (No Security) | HR_LOCATIONS_ALL | When you need all rows without business-unit/security filtering |
| _B | Base Table | PER_PERIODS_OF_SERVICE_B | Core storage table, non-date-effective version |
| _PEO | Person Entity Object (EO) | PER_ALL_PEOPLE_PEO | Used internally by the ADF entity framework; avoid querying directly |
| _EO | Entity Object | PAY_PAYROLL_ACTIONS_EO | ADF framework internal use; prefer the base table instead |
| _V | View | PER_PERSON_NAMES_V | Pre-built view, sometimes includes joins or filters |
| _S | Secured View | PER_ALL_ASSIGNMENTS_S | View with Oracle data security (FNDDS) applied |
_F: Date-Effective Tables
The _F suffix is the most important suffix in Oracle Fusion HCM. It stands for "Fusion" (historically debated, but functionally it means date-effective). These tables track how data changes over time using two key columns:
EFFECTIVE_START_DATE— when this row's version becomes activeEFFECTIVE_END_DATE— when this row's version expires (default: 4712-12-31)
A single person in PER_ALL_PEOPLE_F may have dozens of rows, each representing a different time period. For example, when someone changes their last name, Oracle does not overwrite the old row. Instead, it end-dates the current row and inserts a new one.
Getting the Current Row
To get only the currently-active row, filter like this:
SELECT *
FROM PER_ALL_PEOPLE_F
WHERE PERSON_ID = :person_id
AND TRUNC(SYSDATE) BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE;
Common mistake: Forgetting the date filter on _F tables. Without it, you get duplicate rows for every historical change, inflating record counts in your reports.
Key _F Tables
_TL: Translation Tables
The _TL suffix means Translation. Oracle Fusion supports multi-language deployments, so any text that could be translated (names, descriptions, job titles) is stored in a separate _TL table. These tables always have a LANGUAGE column and a SOURCE_LANG column.
SELECT first_name, last_name, language
FROM PER_ALL_PEOPLE_TL
WHERE PERSON_ID = :person_id
AND LANGUAGE = 'US';
For every row in the base table, there will be one row per installed language in the _TL table. If your instance supports English and French, each person will have two _TL rows.
_VL: View + Language (Convenience View)
The _VL suffix stands for View Language. These are database views (not tables) that join the base _F table with its corresponding _TL table, automatically filtering to the user's session language.
Instead of writing the join yourself:
-- Manual join (what _VL does internally)
SELECT f.*, tl.first_name, tl.last_name
FROM PER_ALL_PEOPLE_F f
JOIN PER_ALL_PEOPLE_TL tl
ON f.PERSON_ID = tl.PERSON_ID
AND tl.LANGUAGE = USERENV('LANG')
WHERE TRUNC(SYSDATE) BETWEEN f.EFFECTIVE_START_DATE
AND f.EFFECTIVE_END_DATE;
You can just query the _VL view:
-- Equivalent using _VL view
SELECT *
FROM PER_ALL_PEOPLE_VL
WHERE PERSON_ID = :person_id;
Pro tip: _VL views are the best choice for OTBI reports and most application queries. They handle both the date-effective filter and the language join automatically.
_ALL: All Records (No Security)
Tables ending in _ALL return all rows without any business-unit or data-security filtering. The most common example is HR_LOCATIONS_ALL, which shows every location in the system regardless of which business unit owns it.
In Oracle E-Business Suite (the predecessor to Fusion), the _ALL suffix was extremely common (e.g., HR_ALL_ORGANIZATION_UNITS). In Fusion, it is less prevalent but still appears in legacy-style tables and cross-module reference tables.
Some _ALL tables you will encounter:
Note that PER_ALL_PEOPLE_F and PER_ALL_ASSIGNMENTS_F use "ALL" as part of the table name (not a suffix). These tables still contain all persons/assignments without security filtering, plus they are date-effective (_F).
_B: Base Tables
The _B suffix denotes a base table, the primary storage table without date-effective behavior. Where _F tables have EFFECTIVE_START_DATE and EFFECTIVE_END_DATE, _B tables simply have the current state of the data.
Example: PER_PERIODS_OF_SERVICE_B stores each person's employment period (hire date, termination date) as a single row, not multiple date-effective rows.
_PEO and _EO: Entity Objects (Internal)
Tables and views ending in _PEO or _EO are ADF Entity Object artifacts. These are used internally by Oracle's Application Development Framework. You should generally avoid querying these directly because:
- They may include internal framework columns not meant for reporting
- They can change between patch levels without notice
- The base _F or _B tables contain the same data in a more stable format
_S: Secured Views
Views ending in _S have Oracle Data Security (FND Data Security / FNDDS) applied. They automatically filter rows based on the current user's security profile, business unit access, and data role.
When building reports for end users, _S views ensure users only see data they are authorized to access. When building system-level integrations (running as a service account), you typically use the _F or _ALL table instead.
How to Choose the Right Table
Use this decision tree:
- Need translated text? Use the
_VLview (joins base + translation automatically) - Need historical data? Use the
_Ftable with date filters - Need security-filtered results? Use the
_Sview - Need all records regardless of business unit? Use the
_ALLtable - Writing an integration or extract? Use the
_Ftable directly - Building an OTBI report? Use the
_VLview when available
Search Any Oracle Table
Look up columns, types, and schema for 35,000+ Oracle Fusion Cloud tables.
Search Tables