If you've been writing Oracle Fusion HCM SQL since before Release 13, your queries probably reference PER_ALL_ASSIGNMENTS_F. It's been the go-to assignments table for years. But starting with Oracle's 24A and 24B quarterly releases, the recommended pattern has shifted โ and if you're still writing new reports against _F, you're doing it the hard way.
This guide covers what changed, why PER_ALL_ASSIGNMENTS_M is now Oracle's preferred table for most reporting scenarios, and the exact patterns to migrate your existing SQL and OTBI reports.
PER_ALL_ASSIGNMENTS_F is not removed or officially deprecated in Oracle 24B. Existing queries that work correctly will continue to work. This is about best practices for new development and fixing the edge cases where _F queries return incorrect results.
The _F vs _M Difference (Quick Recap)
In Oracle Fusion HCM, most core tables come in two variants:
| Suffix | Name | How to Filter for Current Row |
|---|---|---|
_F |
Date-effective (Fused) | TRUNC(SYSDATE) BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE |
_M |
Merged (with metadata) | EFFECTIVE_LATEST_CHANGE = 'Y' |
The _F table stores every date-effective version of a record. To get today's row you filter by date range. The _M table contains the same data but adds EFFECTIVE_LATEST_CHANGE โ an Oracle-managed flag that marks the most recently entered row as 'Y'.
That one column change has significant implications for how queries behave, especially when future-dated changes are involved.
Why _F Queries Break with Future-Dated Changes
This is the root cause of most assignment query bugs reported after 24B upgrades.
When an HR administrator enters a change with a future effective date โ a promotion that starts next quarter, a grade change effective next month โ Oracle creates a new row in the assignments table immediately. That row has a future EFFECTIVE_START_DATE.
Here's what happens with each filter approach:
The behavior difference matters: _F with date-range gives you "what's active today." _M with EFFECTIVE_LATEST_CHANGE gives you "what is the most recently entered state." For current-state headcount reports, _M is the correct choice in almost every case.
What Oracle Changed in 24A/24B
Oracle's quarterly releases don't always announce schema changes in headlines โ they show up in the OTBI subject area updates, the Oracle-delivered report redesigns, and the technical documentation revisions.
In the 24A and 24B cycles, Oracle updated:
- OTBI Worker Real Time subject area โ underlying view objects now reference
_Mtables for assignment data. Custom reports using direct SQL overrides toPER_ALL_ASSIGNMENTS_Fmay produce different row counts than Oracle-delivered reports. - Worker Assignment Real Time subject area โ assignment history dimensions now expose
EFFECTIVE_LATEST_CHANGEas a filterable attribute. Historical queries should use date-range; current-state queries should use this flag. - Oracle-delivered headcount analytics โ rebuilt on
_Mtables. If your custom reports produce different headcount numbers than Oracle's delivered workforce analytics, this is the likely cause. - HCM Data Loader validations โ 24B tightened assignment data validation to align with the
_Mdata model. Some HDL loads that previously succeeded now require explicit effective dating.
The Full Migration Pattern
Replacing PER_ALL_ASSIGNMENTS_F with PER_ALL_ASSIGNMENTS_M requires three changes:
1. Replace the table reference
2. Replace the date-range filter with EFFECTIVE_LATEST_CHANGE
3. Keep (or add) the assignment type and status filters
Complete Before/After Example
Both queries return active employees, but the _M version is more reliable when future-dated changes exist in the system โ which in any active Oracle HCM implementation, they almost certainly do.
When to Keep Using PER_ALL_ASSIGNMENTS_F
The _F table is still the right choice for point-in-time historical queries. If you need to answer "what was this person's assignment as of December 31, 2024?", the date-range filter on _F is correct:
The _M table's EFFECTIVE_LATEST_CHANGE flag reflects the most recently entered row, not the row active on a specific historical date. For historical as-of queries, _F with explicit date filtering is still the correct approach.
Key Columns Compared
| Column | PER_ALL_ASSIGNMENTS_F | PER_ALL_ASSIGNMENTS_M |
|---|---|---|
| EFFECTIVE_START_DATE | Present โ use for historical queries | Present โ use for historical queries |
| EFFECTIVE_END_DATE | Present โ 4712-12-31 = open-ended | Present โ same semantics |
| EFFECTIVE_LATEST_CHANGE | Not available | 'Y' = most recently entered row |
| EFFECTIVE_SEQUENCE | Not available | Ordering number for same-date changes |
| ASSIGNMENT_TYPE | E/C/N/B/P/O | Same values, same semantics |
| ASSIGNMENT_STATUS_TYPE | ACTIVE_ASSIGN, INACTIVE, etc. | Same values, same semantics |
| PRIMARY_FLAG | Y/N โ primary assignment indicator | Same values, same semantics |
OTBI Report Migration
If you have custom OTBI reports that use logical SQL overrides or direct database joins referencing PER_ALL_ASSIGNMENTS_F, you'll need to update these manually.
For reports using standard OTBI subject area columns (no custom SQL), the underlying view objects were updated by Oracle. You may still see behavioral differences if:
- Your report uses an assignment date filter built before 24B โ check if the filter logic was date-range based and whether it now needs to reference the
Effective Latest Changeattribute - Your headcount totals differ from Oracle's delivered analytics โ run the same query on both
_F(date-range) and_M(EFFECTIVE_LATEST_CHANGE = 'Y') and compare; the difference is future-dated rows - You use the Worker Assignment Real Time subject area with custom assignment date dimensions โ verify these dimensions resolve correctly after the 24B update
Migration Checklist
- Audit all custom SQL reports for
PER_ALL_ASSIGNMENTS_Freferences - Replace date-range filters with
EFFECTIVE_LATEST_CHANGE = 'Y'for current-state queries - Keep date-range filters for historical point-in-time queries
- Verify headcount numbers match Oracle-delivered analytics after migration
- Test against employees with pending future-dated assignment changes
- Check HDL load templates โ update effective date logic if loads are failing validation
- Review OTBI report custom SQL overrides for direct table references
Related Changes: EFFECTIVE_SEQUENCE
The _M table also exposes EFFECTIVE_SEQUENCE, which becomes important when multiple assignment changes are entered on the same calendar date. In _F, same-day changes share the same EFFECTIVE_START_DATE, which can produce ambiguous results. In _M, EFFECTIVE_SEQUENCE provides an ordering number to break ties:
Explore PER_ALL_ASSIGNMENTS_M and Every Oracle HCM Table
Search all columns for PER_ALL_ASSIGNMENTS_M, PER_ALL_ASSIGNMENTS_F, and 14,950+ Oracle Fusion HCM tables. Find join paths, data types, and FK relationships between assignment, person, and payroll tables.
Search Oracle HCM Tables โSummary
Oracle's 24A/24B releases formalized the shift toward _M tables for assignment reporting. The practical impact:
- New reports โ always use
PER_ALL_ASSIGNMENTS_MwithEFFECTIVE_LATEST_CHANGE = 'Y'for current-state queries - Existing reports that work โ no urgency to migrate unless you're seeing headcount discrepancies or future-dated row issues
- Historical queries โ keep using
PER_ALL_ASSIGNMENTS_Fwith explicit date-range filters;_M'sEFFECTIVE_LATEST_CHANGEdoes not apply to historical as-of queries - OTBI reports โ audit custom SQL overrides; Oracle-delivered reports were updated but custom logical SQL may not have been
The easiest way to validate your migration: run both the old query (PER_ALL_ASSIGNMENTS_F + date-range) and the new query (PER_ALL_ASSIGNMENTS_M + EFFECTIVE_LATEST_CHANGE) against the same dataset. If results differ, you have future-dated assignment changes in the system โ the _M version is correct.