🔄 Complete Oracle HCM → Payroll Flow
Employee Created
(PER_ALL_PEOPLE_F)
↓
Assignment Created
(PER_ALL_ASSIGNMENTS_F)
↓
Element Assigned
(PAY_ELEMENT_ENTRIES_F)
↓
Payroll Run Triggered
(PAY_PAYROLL_ACTIONS)
↓
Employee Level Processing
(PAY_PAYROLL_REL_ACTIONS)
↓
Element Calculation
(PAY_RUN_RESULTS)
↓
Final Output
(PAY_RUN_BALANCES)
PER_ALL_PEOPLE_F (Core Employee Table)
PER_ALL_PEOPLE_F is a date-effective table that stores core person information in Oracle HCM.
Each record is maintained with effective start and end dates, allowing tracking of historical changes.
Important Columns
| Column | Description |
| PERSON_ID | Unique system-generated identifier for a person (Primary Key) |
| PERSON_NUMBER | Unique employee number used across the application |
| EFFECTIVE_START_DATE | Start date of the record (used for date-effective logic) |
| EFFECTIVE_END_DATE | End date of the record |
| BUSINESS_GROUP_ID | Enterprise identifier (used for multi-tenancy) |
| START_DATE | Earliest record start date for the person |
| APPLICANT_NUMBER | Unique number assigned for applicants |
| PRIMARY_EMAIL_ID | Reference to primary email in PER_EMAIL_ADDRESSES |
| PRIMARY_PHONE_ID | Reference to primary phone in PER_PHONES |
| MAILING_ADDRESS_ID | Reference to mailing address in PER_ADDRESSES |
| PRIMARY_NID_ID | Reference to primary national identifier |
| PRIMARY_NID_NUMBER | Denormalized national ID value |
| OBJECT_VERSION_NUMBER | Used for optimistic locking during updates |
| CREATED_BY | User who created the record |
| CREATION_DATE | Record creation timestamp |
| LAST_UPDATED_BY | User who last updated the record |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
| WAIVE_DATA_PROTECT | Currently unused column |
Joins
- Join with PER_PERSON_NAMES_F using PERSON_ID → to get employee name
- Join with PER_ALL_ASSIGNMENTS_F using PERSON_ID → to get job & department
- Join with PER_EMAIL_ADDRESSES using PRIMARY_EMAIL_ID → email
- Join with PER_PHONES using PRIMARY_PHONE_ID → phone
- Join with PER_NATIONAL_IDENTIFIERS using PRIMARY_NID_ID → national ID
Duplicate Handling (Very Important)
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE
Since this is a date-effective table, always apply this condition to avoid duplicate historical records.
Example Query
SELECT
papf.person_id,
papf.person_number,
papf.creation_date
FROM per_all_people_f papf
WHERE SYSDATE BETWEEN papf.effective_start_date
AND papf.effective_end_date;
PER_PERSONS (Person Core Details)
PER_PERSONS stores basic personal and demographic information of a person.
Unlike PER_ALL_PEOPLE_F, this table is NOT date-effective and holds static attributes
such as date of birth, blood group, and place of birth.
Important Columns
| Column | Description |
| PERSON_ID | System-generated primary key (links to all HCM tables) |
| BUSINESS_GROUP_ID | Enterprise identifier (multi-tenancy partition key) |
| START_DATE | Date when the person record was first created |
| CORRESPONDENCE_LANGUAGE | Preferred communication language |
| BLOOD_TYPE | Blood group of the person |
| DATE_OF_BIRTH | Employee date of birth |
| DATE_OF_DEATH | Date of death (if applicable) |
| COUNTRY_OF_BIRTH | Country where the person was born |
| REGION_OF_BIRTH | Region/state of birth |
| TOWN_OF_BIRTH | City/town of birth |
| OBJECT_VERSION_NUMBER | Used for optimistic locking |
| CREATED_BY | User who created the record |
| CREATION_DATE | Record creation date |
| LAST_UPDATED_BY | Last updated by user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
| CATEGORY_CODE | Extensible flexfield category code |
Important Notes
- PARTY_ID is obsolete and not used in current implementations
- This table is NOT date-effective (no effective dates)
- Use PER_ALL_PEOPLE_F for date-effective reporting
Joins
- Join with PER_ALL_PEOPLE_F using PERSON_ID → core employee info
- Join with PER_PERSON_NAMES_F → to fetch names
- Join with PER_CITIZENSHIPS → nationality
- Join with PER_NATIONAL_IDENTIFIERS → ID details
Example Query
SELECT
per.person_id,
per.date_of_birth,
per.country_of_birth
FROM per_persons per
WHERE per.date_of_birth IS NOT NULL;
PER_PERSON_NAMES_F (Employee Name Details)
PER_PERSON_NAMES_F is a date-effective table that stores employee names in different formats.
It supports multiple name types such as Global and Local names and maintains history using
effective start and end dates.
Important Columns
| Column | Description |
| PERSON_NAME_ID | Unique identifier for each name record |
| PERSON_ID | Links to employee in PER_ALL_PEOPLE_F |
| EFFECTIVE_START_DATE | Start date of name record |
| EFFECTIVE_END_DATE | End date of name record |
| BUSINESS_GROUP_ID | Enterprise identifier |
| LEGISLATION_CODE | Country context for name format |
| NAME_TYPE | Indicates Global or Local name |
| FIRST_NAME | Employee first name |
| LAST_NAME | Employee last name |
| MIDDLE_NAMES | Middle names |
| TITLE | Prefix like Mr, Ms, Dr |
| PRE_NAME_ADJUNCT | Prefix attached to last name |
| SUFFIX | Suffix like Jr, Sr |
| KNOWN_AS | Preferred name |
| PREVIOUS_LAST_NAME | Old last name (if changed) |
| HONORS | Qualifications included in name |
| MILITARY_RANK | Military designation |
| DISPLAY_NAME | Formatted name used in UI (most used) |
| FULL_NAME | Formal full name |
| LIST_NAME | Name used in sorted lists |
| ORDER_NAME | Name used for sorting (mandatory) |
| OBJECT_VERSION_NUMBER | Used for optimistic locking |
| CREATED_BY | User who created record |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
| CHAR_SET_CONTEXT | Character set context |
Important Notes
- This is a date-effective table
- Always filter using EFFECTIVE_START_DATE and END_DATE
- Multiple records may exist for same PERSON_ID
- Use DISPLAY_NAME for reporting (recommended)
Joins
- Join with PER_ALL_PEOPLE_F using PERSON_ID → employee data
- Join with PER_ALL_ASSIGNMENTS_F → job and department
- Join with PER_PERSONS → personal details (DOB, etc.)
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE
This ensures only the current active name record is returned.
Example Query
SELECT
papf.person_number,
ppnf.display_name,
ppnf.full_name
FROM per_all_people_f papf
JOIN per_person_names_f ppnf
ON papf.person_id = ppnf.person_id
WHERE SYSDATE BETWEEN ppnf.effective_start_date
AND ppnf.effective_end_date;
PER_ALL_ASSIGNMENTS_F (Employee Assignment Table)
PER_ALL_ASSIGNMENTS_F is one of the most important tables in Oracle HCM.
It stores assignment-level details such as job, department, position, salary structure,
and employment status.
Each employee can have multiple assignments, and this table is date-effective,
meaning it keeps historical records of assignment changes.
Core Identifiers
| Column | Description |
| ASSIGNMENT_ID | Unique identifier for assignment |
| PERSON_ID | Employee reference |
| ASSIGNMENT_NUMBER | Assignment number used in UI |
| ASSIGNMENT_NAME | Name of assignment |
| ASSIGNMENT_SEQUENCE | Sequence of assignment changes |
| PARENT_ASSIGNMENT_ID | Parent assignment (hierarchy) |
Status & Type
| Column | Description |
| ASSIGNMENT_STATUS_TYPE | Status (Active, Suspended, etc.) |
| ASSIGNMENT_STATUS_TYPE_ID | Status ID reference |
| ASSIGNMENT_TYPE | Employee, Contractor, etc. |
| SYSTEM_PERSON_TYPE | System-level person classification |
| PRIMARY_ASSIGNMENT_FLAG | Indicates main assignment |
| PRIMARY_WORK_TERMS_FLAG | Main work terms |
| PRIMARY_WORK_RELATION_FLAG | Primary work relationship |
| PRIMARY_FLAG | Generic primary flag |
| MANAGER_FLAG | Indicates if employee is a manager |
Dates & Effective Logic
| Column | Description |
| EFFECTIVE_START_DATE | Start date of assignment |
| EFFECTIVE_END_DATE | End date of assignment |
| EFFECTIVE_SEQUENCE | Sequence for changes on same date |
| EFFECTIVE_LATEST_CHANGE | Latest record indicator |
| PROJECTED_START_DATE | Planned start |
| PROJECTED_ASSIGNMENT_END | Planned end |
| DATE_PROBATION_END | Probation end date |
| FREEZE_START_DATE | Freeze period start |
| FREEZE_UNTIL_DATE | Freeze end date |
Job, Department & Organization
| Column | Description |
| JOB_ID | Links to PER_JOBS |
| POSITION_ID | Links to HR_ALL_POSITIONS |
| ORGANIZATION_ID | Department |
| BUSINESS_UNIT_ID | Business unit |
| LEGAL_ENTITY_ID | Legal entity |
| ESTABLISHMENT_ID | Establishment reference |
| LOCATION_ID | Work location |
Grade & Salary Info
| Column | Description |
| GRADE_ID | Employee grade |
| GRADE_LADDER_PGM_ID | Grade ladder |
| CAGR_ID_FLEX_NUM | Grade flexfield |
| CAGR_GRADE_DEF_ID | Grade definition |
| HOURLY_SALARIED_CODE | Hourly or salaried |
| NORMAL_HOURS | Working hours |
| FREQUENCY | Salary frequency |
Employment Details
| Column | Description |
| EMPLOYEE_CATEGORY | Employee classification |
| EMPLOYMENT_CATEGORY | Full-time / Part-time |
| WORK_TERMS_ASSIGNMENT_ID | Work terms link |
| PERIOD_OF_SERVICE_ID | Service period |
| NOTICE_PERIOD | Notice duration |
| NOTICE_PERIOD_UOM | Unit (Days/Months) |
| PROBATION_PERIOD | Probation duration |
| PROBATION_UNIT | Unit of probation |
Recruitment & Hiring
| Column | Description |
| RECRUITER_ID | Recruiter reference |
| RECRUITMENT_ACTIVITY_ID | Recruitment activity |
| APPLICANT_RANK | Candidate ranking |
| JOB_POST_SOURCE_NAME | Source of job posting |
| PERSON_REFERRED_BY_ID | Referral employee |
Vendor / Contract Info
| Column | Description |
| VENDOR_ID | Supplier |
| VENDOR_SITE_ID | Supplier site |
| VENDOR_EMPLOYEE_NUMBER | Vendor employee |
| VENDOR_ASSIGNMENT_NUMBER | Vendor assignment |
| CONTRACT_ID | Contract reference |
Additional Important Fields
| Column | Description |
| ACTION_CODE | HR action (Hire, Transfer, etc.) |
| ACTION_OCCURRENCE_ID | Action instance |
| REASON_CODE | Reason for change |
| PROJECT_TITLE | Project name |
| WORK_AT_HOME | Remote work flag |
| RETIREMENT_DATE | Retirement date |
| RETIREMENT_AGE | Retirement age |
Audit Columns
| Column | Description |
| CREATED_BY | Created by user |
| CREATION_DATE | Created date |
| LAST_UPDATED_BY | Updated by |
| LAST_UPDATE_DATE | Update date |
| LAST_UPDATE_LOGIN | Session |
| OBJECT_VERSION_NUMBER | Version control |
Joins
- PER_ALL_PEOPLE_F → PERSON_ID
- PER_PERSON_NAMES_F → PERSON_ID
- PER_JOBS → JOB_ID
- PER_DEPARTMENTS → ORGANIZATION_ID
- HR_ALL_POSITIONS → POSITION_ID
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE
Example Query
SELECT
papf.person_number,
ppnf.display_name,
paaf.assignment_number,
pj.name job_name
FROM per_all_people_f papf
JOIN per_person_names_f ppnf
ON papf.person_id = ppnf.person_id
JOIN per_all_assignments_f paaf
ON papf.person_id = paaf.person_id
LEFT JOIN per_jobs pj
ON paaf.job_id = pj.job_id
WHERE SYSDATE BETWEEN paaf.effective_start_date
AND paaf.effective_end_date;
PER_JOBS (Job Definition Table)
PER_JOBS stores job definitions used across the organization in Oracle HCM.
Each job represents a role (e.g., Software Engineer, HR Manager) and is assigned
to employees through PER_ALL_ASSIGNMENTS_F.
This table is date-effective, meaning job details can change over time
and historical records are maintained.
Core Identifiers
| Column | Description |
| JOB_ID | Unique identifier for job |
| JOB_CODE | Business-friendly job code |
| NAME | Job title (used in UI and reports) |
Date Effectivity
| Column | Description |
| EFFECTIVE_START_DATE | Start date of job record |
| EFFECTIVE_END_DATE | End date of job record |
Organization & Structure
| Column | Description |
| BUSINESS_GROUP_ID | Enterprise identifier |
| SET_ID | Reference data set (used for sharing jobs across BUs) |
| JOB_FAMILY_ID | Groups similar jobs together |
Job Classification & Flags
| Column | Description |
| ACTIVE_STATUS | Indicates if job is active |
| BENCHMARK_JOB_FLAG | Marks job as benchmark job |
| BENCHMARK_JOB_ID | Reference benchmark job |
| REGULAR_TEMPORARY | Indicates permanent or temporary job |
| FULL_PART_TIME | Full-time or part-time job |
| MANAGER_LEVEL | Defines management level |
| APPROVAL_AUTHORITY | Approval authority level |
| MED_CHECKUP_REQ | Indicates if medical checkup required |
| JOB_FUNCTION_CODE | Job function classification |
Action Tracking
| Column | Description |
| ACTION_OCCURRENCE_ID | Tracks job-related actions (create/update) |
Joins
- PER_ALL_ASSIGNMENTS_F → JOB_ID (to get employee job)
- PER_ALL_PEOPLE_F → via assignments
- PER_JOB_FAMILIES → JOB_FAMILY_ID (if used)
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE
Since this is a date-effective table, always filter active records.
Example Query
SELECT
papf.person_number,
ppnf.display_name,
pj.name job_name
FROM per_all_people_f papf
JOIN per_person_names_f ppnf
ON papf.person_id = ppnf.person_id
JOIN per_all_assignments_f paaf
ON papf.person_id = paaf.person_id
JOIN per_jobs pj
ON paaf.job_id = pj.job_id
WHERE SYSDATE BETWEEN pj.effective_start_date
AND pj.effective_end_date;
PER_DEPARTMENTS (Department / Organization Table)
PER_DEPARTMENTS stores department-level information in Oracle HCM.
Each department is identified by ORGANIZATION_ID and is used to group employees
within the organization structure.
This table is date-effective, meaning department details can change over time.
Core Identifiers
| Column | Description |
| ORGANIZATION_ID | Unique identifier for department |
| ORGANIZATION_CODE | Short code used for department |
| NAME | Department name (used in reports/UI) |
| TITLE | Formal title of department |
Date Effectivity
| Column | Description |
| EFFECTIVE_START_DATE | Start date of department record |
| EFFECTIVE_END_DATE | End date of department record |
Organization Details
| Column | Description |
| BUSINESS_GROUP_ID | Enterprise identifier |
| SET_ID | Reference data set (used for sharing departments) |
| LOCATION_ID | Location assigned to department |
| STATUS | Indicates if department is active/inactive |
| TYPE | Type of organization (Department, Division, etc.) |
Audit Columns
| Column | Description |
| CREATED_BY | User who created record |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
| OBJECT_VERSION_NUMBER | Version control for updates |
Joins
- PER_ALL_ASSIGNMENTS_F → ORGANIZATION_ID (to get employee department)
- HR_ORGANIZATION_UNITS → ORGANIZATION_ID (for hierarchy)
- PER_ALL_PEOPLE_F → via assignments
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE
Since this is a date-effective table, always filter active records.
Example Query
SELECT
papf.person_number,
ppnf.display_name,
pd.name department_name
FROM per_all_people_f papf
JOIN per_person_names_f ppnf
ON papf.person_id = ppnf.person_id
JOIN per_all_assignments_f paaf
ON papf.person_id = paaf.person_id
LEFT JOIN per_departments pd
ON paaf.organization_id = pd.organization_id
WHERE SYSDATE BETWEEN pd.effective_start_date
AND pd.effective_end_date;
Real Usage
PER_DEPARTMENTS is mainly used in reporting to display department names.
It is typically joined with PER_ALL_ASSIGNMENTS_F using ORGANIZATION_ID.
PER_ASSIGNMENT_SUPERVISORS_F (Manager Relationship Table)
PER_ASSIGNMENT_SUPERVISORS_F stores the relationship between employees and their managers.
It defines reporting hierarchy such as Line Manager, Project Manager, etc.
This table is date-effective, meaning manager relationships can change over time.
Core Columns
| Column | Description |
| ASSIGNMENT_SUPERVISOR_ID | Unique identifier for supervisor record |
| PERSON_ID | Employee ID |
| ASSIGNMENT_ID | Employee assignment |
| MANAGER_ID | Manager person ID |
| MANAGER_ASSIGNMENT_ID | Manager assignment ID |
| MANAGER_TYPE | Type of manager (LINE_MANAGER, PROJECT_MANAGER) |
| PRIMARY_FLAG | Indicates primary manager (Y/N) |
| BUSINESS_GROUP_ID | Enterprise identifier |
Date Effectivity
| Column | Description |
| EFFECTIVE_START_DATE | Start date of manager relationship |
| EFFECTIVE_END_DATE | End date of manager relationship |
Action Tracking
| Column | Description |
| ACTION_OCCURRENCE_ID | Tracks changes in hierarchy |
Joins
- PER_ALL_ASSIGNMENTS_F → ASSIGNMENT_ID
- PER_ALL_PEOPLE_F → PERSON_ID
- PER_PERSON_NAMES_F → for employee name
- PER_ALL_PEOPLE_F (again) → MANAGER_ID for manager name
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE
Example Query
SELECT
emp.person_number,
emp_name.display_name employee_name,
mgr_name.display_name manager_name
FROM per_assignment_supervisors_f pasf
JOIN per_all_people_f emp
ON pasf.person_id = emp.person_id
JOIN per_person_names_f emp_name
ON emp.person_id = emp_name.person_id
JOIN per_all_people_f mgr
ON pasf.manager_id = mgr.person_id
JOIN per_person_names_f mgr_name
ON mgr.person_id = mgr_name.person_id
WHERE pasf.manager_type = 'LINE_MANAGER'
AND SYSDATE BETWEEN pasf.effective_start_date
AND pasf.effective_end_date;
PER_ASSIGNMENT_SUPERVISORS_F_ (Audit / History Table)
PER_ASSIGNMENT_SUPERVISORS_F_ is the audit version of the supervisors table.
It stores historical changes including updates, inserts, and deletions.
This table is mainly used for:
- Audit tracking
- Debugging hierarchy changes
- Tracking historical updates
Core Columns (Same as F Table)
| Column | Description |
| ASSIGNMENT_SUPERVISOR_ID | Supervisor record ID |
| PERSON_ID | Employee |
| ASSIGNMENT_ID | Assignment |
| MANAGER_ID | Manager |
| MANAGER_ASSIGNMENT_ID | Manager assignment |
| MANAGER_TYPE | Manager type |
Additional Audit Columns (Only in F_)
| Column | Description |
| CREATED_BY | User who created record |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
| AUDIT_ACTION_TYPE | Type of change (INSERT, UPDATE, DELETE) |
| AUDIT_CHANGE_BIT_MAP_ | Tracks changed columns |
| WORKING_PERCENTAGE | Manager responsibility percentage |
| FREEZE_START_DATE | Freeze start |
| FREEZE_UNTIL_DATE | Freeze end |
| ACTION_OCCURRENCE_ID | Action reference |
Important Notes
- This table contains multiple records for same row due to updates
- Do NOT use for normal reporting
- Use only for audit/debugging
Example Use Case
SELECT *
FROM per_assignment_supervisors_f_
WHERE audit_action_type = 'UPDATE';
PAY_ELEMENT_ENTRIES_F (Payroll Element Entry Table)
PAY_ELEMENT_ENTRIES_F stores element entries assigned to employees.
Each row represents a payroll element (e.g., Basic Salary, Allowance, Deduction)
assigned to a person.
This table is date-effective, meaning element entries can change over time
and historical records are maintained.
Core Identifiers
| Column | Description |
| ELEMENT_ENTRY_ID | Unique identifier for element entry |
| PERSON_ID | Employee reference |
| ELEMENT_TYPE_ID | Element type (Basic, HRA, Bonus, etc.) |
| ENTRY_TYPE | Type of entry (E = Entry, B = Balance Adjustment) |
Date Effectivity
| Column | Description |
| EFFECTIVE_START_DATE | Start date of element entry |
| EFFECTIVE_END_DATE | End date of element entry |
| DATE_EARNED | Date when earning applies (important in payroll runs) |
Entry Source & Processing
| Column | Description |
| CREATOR_TYPE | Source of entry (USER, SYSTEM, BATCH) |
| CREATOR_ID | ID of creator |
| BATCH_ID | Batch reference for bulk load |
| BATCH_ACTION_ID | Batch action reference |
| REASON | Reason for entry (adjustment, correction, etc.) |
| TARGET_ENTRY_ID | Reference entry (used in updates/corrections) |
| SUBPRIORITY | Execution priority within payroll processing |
| MULTIPLE_ENTRY_COUNT | Number of entries created together |
| BALANCE_ADJ_COST_FLAG | Indicates cost adjustment flag |
Control & Technical Columns
| Column | Description |
| OBJECT_VERSION_NUMBER | Used for optimistic locking |
| ENTERPRISE_ID | Enterprise reference |
Audit Columns
| Column | Description |
| CREATED_BY | User who created entry |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
Important Notes
- This table stores input data, not calculated payroll results
- Actual calculated values come from PAY_RUN_RESULTS
- Each entry links to element type and input values
- Multiple entries can exist per employee
Joins
- PER_ALL_PEOPLE_F → PERSON_ID
- PER_ALL_ASSIGNMENTS_F → via PERSON_ID
- PAY_ELEMENT_TYPES_F → ELEMENT_TYPE_ID
- PAY_INPUT_VALUES_F → ELEMENT_TYPE_ID
- PAY_RUN_RESULTS → ELEMENT_ENTRY_ID
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE
Example Query
SELECT
papf.person_number,
ppnf.display_name,
pet.element_name,
penf.element_entry_id
FROM pay_element_entries_f penf
JOIN per_all_people_f papf
ON penf.person_id = papf.person_id
JOIN per_person_names_f ppnf
ON papf.person_id = ppnf.person_id
JOIN pay_element_types_tl pet
ON penf.element_type_id = pet.element_type_id
WHERE SYSDATE BETWEEN penf.effective_start_date
AND penf.effective_end_date;
PAY_RUN_BALANCES (Payroll Balance Table)
PAY_RUN_BALANCES stores calculated payroll balance values such as Gross Pay, Net Pay,
Tax, and other accumulated balances.
This table represents aggregated results from payroll processing and is used
for reporting, reconciliation, and statutory calculations.
Core Identifiers
| Column | Description |
| RUN_BALANCE_ID | System-generated primary key |
| DEFINED_BALANCE_ID | Links to PAY_DEFINED_BALANCES (defines balance type) |
| PAYROLL_REL_ACTION_ID | Payroll relationship action reference |
| PAYROLL_ACTION_ID | Payroll run identifier |
Balance Values
| Column | Description |
| BALANCE_VALUE | Calculated balance amount (Net Pay, Tax, etc.) |
| BALANCE_DATE | Contextual date of balance |
| EFFECTIVE_DATE | Date of payroll action |
Payroll Context
| Column | Description |
| PAYROLL_RELATIONSHIP_ID | Payroll relationship reference |
| PAYROLL_TERM_ID | Payroll term |
| PAYROLL_ASSIGNMENT_ID | Payroll assignment |
| PAYROLL_ID | Payroll definition |
| ACTION_SEQUENCE | Sequence of payroll processing |
Legal & Tax Context
| Column | Description |
| TAX_UNIT_ID | Tax reporting unit (Legal entity context) |
| LEGAL_EMPLOYER_ID | Legal employer |
| DEDUCTION_TYPE_ID | Type of deduction |
Element & Processing Details
| Column | Description |
| ELEMENT_ENTRY_ID | Element entry reference |
| CALC_BREAKDOWN_ID | Calculation breakdown reference |
| PROCESSING_SPAN | Payroll processing span |
| TIME_DEFINITION_ID | Time definition reference |
Additional Context Fields
| Column | Description |
| AREA1 | Additional context (custom usage) |
| AREA2 | Additional context |
| AREA3 | Additional context |
| AREA4 | Additional context |
| CONTEXT_VALUE1 | Context-specific value |
| CONTEXT_VALUE2 | Context-specific value |
| CONTEXT_VALUE3 | Context-specific value |
| CONTEXT_VALUE4 | Context-specific value |
| CONTEXT_VALUE5 | Context-specific value |
| CONTEXT_VALUE6 | Context-specific value |
Other References
| Column | Description |
| THIRD_PARTY_PAYEE_ID | Third-party payment reference |
| ENTERPRISE_ID | Enterprise identifier |
| ORA_PART_KEY | Partition key used internally for performance |
Important Notes
- This table stores aggregated balances, not individual element results
- Balances are defined in PAY_DEFINED_BALANCES
- Used heavily in payroll reporting (Net Pay, Gross Pay, Tax)
- Data is generated during payroll run
Joins
- PAY_DEFINED_BALANCES → DEFINED_BALANCE_ID
- PAY_PAYROLL_REL_ACTIONS → PAYROLL_REL_ACTION_ID
- PER_ALL_PEOPLE_F → via payroll relationship
- PAY_RUN_RESULTS → ELEMENT_ENTRY_ID
Example Query
SELECT
papf.person_number,
prb.balance_value,
prb.effective_date
FROM pay_run_balances prb
JOIN pay_payroll_rel_actions pra
ON prb.payroll_rel_action_id = pra.payroll_rel_action_id
JOIN per_all_people_f papf
ON pra.payroll_relationship_id = papf.person_id
WHERE prb.balance_value IS NOT NULL;
Note: Difference between key payroll tables
PAY_ELEMENT_ENTRIES_F → Input (what you assign)
PAY_RUN_RESULTS → Calculation result (per element)
PAY_RUN_BALANCES → Final aggregated balances (Net, Gross, Tax)
PAY_ELEMENT_TYPES_TL (Element Translation Table)
PAY_ELEMENT_TYPES_TL stores the translated names and descriptions of payroll elements.
It is used to display element names in different languages (US, UK, Arabic, etc.).
This table is NOT date-effective but supports multiple rows per element
based on language.
Core Columns
| Column | Description |
| ELEMENT_TYPE_ID | Links to PAY_ELEMENT_TYPES_F |
| ELEMENT_NAME | User-friendly element name (shown in UI) |
| REPORTING_NAME | Name used in reports |
| DESCRIPTION | Description of the element |
| LANGUAGE | Language code (e.g., US, AR) |
| SOURCE_LANG | Original language of record |
System & Audit Columns
| Column | Description |
| ENTERPRISE_ID | Enterprise reference |
| OBJECT_VERSION_NUMBER | Used for optimistic locking |
| CREATED_BY | User who created record |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
| SEED_DATA_SOURCE | Source of seed data |
| ORA_SEED_SET1 | Oracle internal use |
| ORA_SEED_SET2 | Oracle internal use |
Important Notes
- Each ELEMENT_TYPE_ID can have multiple rows (one per language)
- Always filter using LANGUAGE = USERENV('LANG')
- This table provides display names, not configuration logic
Joins
- PAY_ELEMENT_TYPES_F → ELEMENT_TYPE_ID
- PAY_ELEMENT_ENTRIES_F → ELEMENT_TYPE_ID
- PAY_RUN_RESULTS → ELEMENT_TYPE_ID
Best Practice (Important)
WHERE pet_tl.language = USERENV('LANG')
This ensures the correct language is displayed based on user session.
Example Query
SELECT
papf.person_number,
pet_tl.element_name,
rrv.result_value
FROM pay_run_results prr
JOIN pay_run_result_values rrv
ON prr.run_result_id = rrv.run_result_id
JOIN pay_element_types_tl pet_tl
ON prr.element_type_id = pet_tl.element_type_id
JOIN per_all_people_f papf
ON papf.person_id = prr.element_entry_id
WHERE pet_tl.language = USERENV('LANG');
PAY_ENTRY_USAGES (Element Entry Usage Table)
PAY_ENTRY_USAGES defines how and where an element entry is applied in payroll.
It links an element entry to payroll relationship, term, or assignment level.
This table helps Oracle determine the scope of element processing.
Core Identifiers
| Column | Description |
| ENTRY_USAGE_ID | Primary key for entry usage |
| ELEMENT_ENTRY_ID | Links to PAY_ELEMENT_ENTRIES_F |
| USAGE_LEVEL | Defines level (RELATIONSHIP / TERM / ASSIGNMENT) |
Date Range
| Column | Description |
| DATE_FROM | Start date of usage |
| DATE_TO | End date of usage |
Payroll Context
| Column | Description |
| PAYROLL_RELATIONSHIP_ID | Payroll relationship level |
| PAYROLL_TERM_ID | Payroll term level |
| PAYROLL_ASSIGNMENT_ID | Assignment level |
| ASSIGNED_PAYROLL_ID | Payroll definition assigned |
Technical Columns
| Column | Description |
| OBJECT_VERSION_NUMBER | Used for optimistic locking |
| ENTERPRISE_ID | Enterprise reference |
Audit Columns
| Column | Description |
| CREATED_BY | User who created record |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
Important Notes
- This table defines where an element is applied
- USAGE_LEVEL determines processing scope
- Not always required in basic reports, but important in advanced payroll logic
Usage Level Meaning
| Value | Meaning |
| RELATIONSHIP | Applies at payroll relationship level |
| TERM | Applies at payroll term level |
| ASSIGNMENT | Applies at assignment level |
Joins
- PAY_ELEMENT_ENTRIES_F → ELEMENT_ENTRY_ID
- PAY_PAYROLL_ASSIGNMENTS → PAYROLL_ASSIGNMENT_ID
- PAY_PAYROLL_REL_ACTIONS → PAYROLL_RELATIONSHIP_ID
Example Query
SELECT
penf.element_entry_id,
peu.usage_level,
peu.payroll_assignment_id
FROM pay_element_entries_f penf
JOIN pay_entry_usages peu
ON penf.element_entry_id = peu.element_entry_id
WHERE peu.usage_level = 'ASSIGNMENT';
PAY_INPUT_VALUES_F (Element Input Values Table)
PAY_INPUT_VALUES_F defines the input values required for payroll elements.
Each element can have multiple input values such as Amount, Hours, Rate, etc.
This table controls:
- What values users can enter
- Validation rules
- Default values
- Formula-driven calculations
This table is
date-effective.
Core Identifiers
| Column | Description |
| INPUT_VALUE_ID | Primary key |
| ELEMENT_TYPE_ID | Links to PAY_ELEMENT_TYPES_F |
| BASE_NAME | Internal name (e.g., Amount, Hours) |
| DISPLAY_SEQUENCE | Order of display in UI |
Date Effectivity
| Column | Description |
| EFFECTIVE_START_DATE | Start date |
| EFFECTIVE_END_DATE | End date |
User Entry & Behavior
| Column | Description |
| USER_ENTERABLE_FLAG | Indicates if user can enter value |
| MANDATORY_FLAG | Indicates if value is required |
| USER_DISPLAY_FLAG | Visible in UI |
| GENERATE_DB_ITEMS_FLAG | Generates database items for formulas |
| HOT_DEFAULT_FLAG | Uses dynamic default logic |
Value & Units
| Column | Description |
| UOM | Unit of measure (Money, Hours, etc.) |
| DEFAULT_VALUE | Default value for input |
| MIN_VALUE | Minimum allowed value |
| MAX_VALUE | Maximum allowed value |
Validation & Lookup
| Column | Description |
| LOOKUP_TYPE | Lookup for allowed values |
| VALUE_SET_CODE | Value set for validation |
| VO_NAME | View object for validation |
| WARNING_OR_ERROR | Validation behavior (warning/error) |
| VALIDATION_OVERRIDE_MESSAGE | Override validation message |
Formula Configuration
| Column | Description |
| FORMULA_ID | Formula to derive value |
| RATE_FORMULA_ID | Rate calculation formula |
| CONTEXT_ID | Fast formula context |
Advanced Processing
| Column | Description |
| RETRO_STATIC_FLAG | Controls retro processing behavior |
| FORCE_RRV_MODE | Forces run result value creation |
| RESERVED_INPUT_VALUE | Reserved for system usage |
Audit Columns
| Column | Description |
| CREATED_BY | Created by user |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Updated by user |
| LAST_UPDATE_DATE | Update timestamp |
| LAST_UPDATE_LOGIN | Session login |
| OBJECT_VERSION_NUMBER | Version control |
| ENTERPRISE_ID | Enterprise reference |
System Columns
| Column | Description |
| SGUID | Seed unique identifier |
| SEED_DATA_SOURCE | Seed data source |
| ORA_SEED_SET1 | Oracle internal use |
| ORA_SEED_SET2 | Oracle internal use |
Important Notes
- This table defines what values an element can take
- Each element can have multiple input values
- Used heavily in Fast Formula calculations
- Controls validation, defaults, and UI behavior
Joins
- PAY_ELEMENT_TYPES_F → ELEMENT_TYPE_ID
- PAY_ELEMENT_ENTRIES_F → ELEMENT_TYPE_ID
- PAY_RUN_RESULT_VALUES → INPUT_VALUE_ID
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE
Example Query
SELECT
pet.base_element_name,
piv.base_name,
piv.uom,
piv.default_value
FROM pay_input_values_f piv
JOIN pay_element_types_f pet
ON piv.element_type_id = pet.element_type_id
WHERE SYSDATE BETWEEN piv.effective_start_date
AND piv.effective_end_date;
PAY_ELEMENT_TYPES_F (Payroll Element Definition Table)
PAY_ELEMENT_TYPES_F defines payroll elements such as Basic Salary, Allowances,
Bonuses, and Deductions.
It controls:
- Element behavior
- Processing rules
- Formulas and validations
- Payroll execution order
This table is
date-effective and is one of the core configuration tables in Oracle Payroll.
Core Identifiers
| Column | Description |
| ELEMENT_TYPE_ID | Primary key |
| BASE_ELEMENT_NAME | Internal element name |
| LEGISLATIVE_DATA_GROUP_ID | Payroll legislative group |
| LEGISLATION_CODE | Country code |
| ENTERPRISE_ID | Enterprise reference |
Date Effectivity
| Column | Description |
| EFFECTIVE_START_DATE | Start date |
| EFFECTIVE_END_DATE | End date |
Element Behavior & Flags
| Column | Description |
| PROCESSING_TYPE | Recurring or Non-recurring |
| PROCESSING_PRIORITY | Execution order in payroll |
| PROCESS_IN_RUN_FLAG | Processed in payroll run |
| STANDARD_LINK_FLAG | Standard eligibility link |
| ADDITIONAL_ENTRY_ALLOWED_FLAG | Allows additional entries |
| MULTIPLE_ENTRIES_ALLOWED_FLAG | Multiple entries allowed |
| ADJUSTMENT_ONLY_FLAG | Used only for adjustments |
| CLOSED_FOR_ENTRY_FLAG | Prevents new entries |
| INDIRECT_ONLY_FLAG | System-generated only |
Processing Scope
| Column | Description |
| USE_AT_REL_LEVEL | Used at relationship level |
| USE_AT_TERM_LEVEL | Used at term level |
| USE_AT_ASG_LEVEL | Used at assignment level |
Classification
| Column | Description |
| CLASSIFICATION_ID | Earnings / Deduction classification |
| SECONDARY_CLASSIFICATION_ID | Secondary classification |
| CATEGORY | Element category |
| DEDUCTION_TYPE_ID | Deduction type |
| DEDUCTION_OR_EXEMPTION | Deduction or exemption flag |
Currency & Time
| Column | Description |
| INPUT_CURRENCY_CODE | Input currency |
| OUTPUT_CURRENCY_CODE | Output currency |
| TIME_DEFINITION_ID | Time definition |
| TIME_DEFINITION_TYPE | Time type |
| STARTING_TIME_DEF_ID | Start time definition |
| ENDING_TIME_DEF_ID | End time definition |
Formula Configuration
| Column | Description |
| FORMULA_ID | Main Fast Formula |
| CALCULATION_FORMULA_ID | Calculation formula |
| DEFAULTING_FORMULA_ID | Default value formula |
| VALIDATION_FORMULA_ID | Validation formula |
| PRORATION_FORMULA_ID | Proration logic |
| ITERATIVE_FORMULA_ID | Iterative formula |
Advanced Processing
| Column | Description |
| GROSSUP_FLAG | Gross-up calculation |
| ITERATIVE_FLAG | Iterative processing |
| ITERATIVE_PRIORITY | Priority for iterative logic |
| ONCE_EACH_PERIOD_FLAG | Run once per period |
| PROCESS_MODE | Processing mode |
| PRORATION_GROUP_ID | Proration group |
| RECALC_EVENT_GROUP_ID | Recalculation triggers |
| EXPEDITED_MODE | Expedited payroll processing |
| PARENT_BASE_ELEMENT_NAME | Parent element |
Technical Columns
| Column | Description |
| MODULE_ID | Seed data module |
| OBJECT_VERSION_NUMBER | Optimistic locking |
Audit Columns
| Column | Description |
| CREATED_BY | Created by |
| CREATION_DATE | Creation date |
| LAST_UPDATED_BY | Updated by |
| LAST_UPDATE_DATE | Update date |
| LAST_UPDATE_LOGIN | Session |
Flexfields (Grouped)
This table includes Descriptive Flexfields (DFF & DDF):
- ATTRIBUTE1 – ATTRIBUTE30
- ATTRIBUTE_NUMBER1 – ATTRIBUTE_NUMBER20
- ATTRIBUTE_DATE1 – ATTRIBUTE_DATE15
- ELEMENT_INFORMATION1 – ELEMENT_INFORMATION30
These are used for client-specific customizations and should not be used in generic reporting.
Joins
- PAY_ELEMENT_ENTRIES_F → ELEMENT_TYPE_ID
- PAY_INPUT_VALUES_F → ELEMENT_TYPE_ID
- PAY_RUN_RESULTS → ELEMENT_TYPE_ID
- PAY_ELEMENT_TYPES_TL → ELEMENT_TYPE_ID (display name)
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE
AND EFFECTIVE_END_DATE
Example Query
SELECT
pet.base_element_name,
pet.processing_type,
pet.processing_priority
FROM pay_element_types_f pet
WHERE SYSDATE BETWEEN pet.effective_start_date
AND pet.effective_end_date;
PAY_PAYROLL_ACTIONS (Payroll Process Execution Table)
PAY_PAYROLL_ACTIONS stores details of payroll processes such as payroll runs,
quick pay, retro runs, and costing.
Each row represents a payroll process execution.
Core Identifiers
| Column | Description |
| PAYROLL_ACTION_ID | Primary key for payroll run |
| PAY_REQUEST_ID | Request ID (ESS Job) |
| PAYROLL_ID | Payroll definition |
Action Details
| Column | Description |
| ACTION_TYPE | Type of action (RUN, QUICKPAY, RETRO) |
| ACTION_STATUS | Status (C = Completed, U = Running, E = Error) |
| ACTION_SEQUENCE | Execution sequence |
| DISPLAY_RUN_NUMBER | Run number shown in UI |
| CURRENT_CHUNK_NUMBER | Processing chunk number |
| PAYROLL_ACTION_STATUS | Overall payroll status |
Dates
| Column | Description |
| EFFECTIVE_DATE | Payroll effective date |
| START_DATE | Process start date |
| END_DATE | Process end date |
| DATE_EARNED | Date earnings apply |
Legislation Context
| Column | Description |
| LEGISLATIVE_DATA_GROUP_ID | Legislative group |
| LEGISLATION_CODE | Country code |
| ACTION_POPULATION_STATUS | Population processing status |
Processing Info
| Column | Description |
| CONSOLIDATION_SET_ID | Consolidation set |
| ELEMENT_SET_ID | Element set processed |
| PARAMETER_GROUP_ID | Parameter group |
Audit Columns
| Column | Description |
| CREATED_BY | Created by user |
| CREATION_DATE | Creation date |
| LAST_UPDATED_BY | Updated by user |
| LAST_UPDATE_DATE | Last update date |
| OBJECT_VERSION_NUMBER | Version control |
| ENTERPRISE_ID | Enterprise reference |
Important Notes
- Each row represents one payroll process run
- Used to track payroll execution status
- Links to PAY_RUN_RESULTS and PAY_RUN_BALANCES
Joins
- PAY_PAYROLL_REL_ACTIONS → PAYROLL_ACTION_ID
- PAY_RUN_RESULTS → PAYROLL_ACTION_ID
- PER_ALL_PEOPLE_F → via payroll relationship
Example Query
SELECT
ppa.payroll_action_id,
ppa.action_type,
ppa.action_status,
ppa.effective_date
FROM pay_payroll_actions ppa
WHERE ppa.action_status = 'C';
PAY_ALL_PAYROLL_ACTIONS_V (Payroll Actions View)
PAY_ALL_PAYROLL_ACTIONS_V is a view built on top of PAY_PAYROLL_ACTIONS
that provides additional readable and joined data.
It simplifies reporting by combining multiple payroll action details.
Key Columns
| Column | Description |
| PAYROLL_ACTION_ID | Payroll run ID |
| PAYROLL_ID | Payroll definition |
| ACTION_TYPE | Type of payroll process |
| ACTION_STATUS | Status of process |
| EFFECTIVE_DATE | Payroll effective date |
| DISPLAY_RUN_NUMBER | Run number |
| LEGISLATION_CODE | Country |
Why This View is Used
- Provides cleaner reporting structure
- Reduces need for multiple joins
- Used in OTBI and reporting queries
Important Notes
- This is a view, not a table
- Recommended for reporting instead of base table
- Performance optimized
* Payroll Action Flow (PAY_ALL_PAYROLL_ACTIONS_V)
Payroll Run
↓
PAY_PAYROLL_ACTIONS
↓
PAY_PAYROLL_REL_ACTIONS
↓
PAY_PAYROLL_ASSIGNMENTS
↓
PAY_ELEMENT_ENTRIES_F
↓
PAY_RUN_RESULTS
↓
PAY_RUN_RESULT_VALUES
↓
PAY_RUN_BALANCES
Example Query
SELECT
payroll_action_id,
action_type,
action_status,
effective_date
FROM pay_all_payroll_actions_v
WHERE action_status = 'C';
PAY_PAYROLL_ASSIGNMENTS (Payroll Assignment Mapping Table)
PAY_PAYROLL_ASSIGNMENTS links HR assignments with payroll structures.
It acts as a bridge between employee assignment and payroll processing entities.
This table is essential for understanding how an employee is mapped into payroll.
Core Identifiers
| Column | Description |
| PAYROLL_ASSIGNMENT_ID | Payroll assignment identifier |
| HR_ASSIGNMENT_ID | Links to PER_ALL_ASSIGNMENTS_F |
| PAYROLL_RELATIONSHIP_ID | Payroll relationship identifier |
| PAYROLL_TERM_ID | Payroll term identifier |
| HR_TERM_ID | HR term reference |
Employee Context
| Column | Description |
| PERSON_ID | Employee identifier |
| LEGAL_EMPLOYER_ID | Legal employer |
Date Range
| Column | Description |
| START_DATE | Start date of payroll assignment |
| END_DATE | End date of payroll assignment |
Important Notes
- This table connects HR assignment with payroll structure
- Used internally by payroll engine
- Required for linking payroll results to employees
Joins
- PER_ALL_ASSIGNMENTS_F → HR_ASSIGNMENT_ID
- PER_ALL_PEOPLE_F → PERSON_ID
- PAY_PAYROLL_REL_ACTIONS → PAYROLL_RELATIONSHIP_ID
- PAY_RUN_RESULTS → PAYROLL_ASSIGNMENT_ID
Example Query
SELECT
ppa.person_id,
ppa.payroll_assignment_id,
ppa.hr_assignment_id,
ppa.payroll_relationship_id
FROM pay_payroll_assignments ppa;
PAY_RUN_RESULTS (Payroll Calculation Results Table)
PAY_RUN_RESULTS stores calculated results of payroll elements for each payroll run.
Each row represents the processed result of an element entry.
This table is a core payroll processing table used to store calculation outputs
before final balances are derived.
Core Identifiers
| Column | Description |
| RUN_RESULT_ID | Primary key |
| ELEMENT_TYPE_ID | Element type (Basic, Tax, etc.) |
| ELEMENT_ENTRY_ID | Source element entry |
| SOURCE_ID | Reference to original entry |
| SOURCE_TYPE | E = Entry, I = Indirect result |
| ENTRY_TYPE | Entry type from element entry |
| STATUS | Processing status |
| SEQUENCE_NUMBER | Execution order |
Payroll Context
| Column | Description |
| PAYROLL_REL_ACTION_ID | Payroll relationship action |
| PAYROLL_ASSIGNMENT_ID | Payroll assignment |
| PAYROLL_TERM_ID | Payroll term |
| LEGAL_EMPLOYER_ID | Legal employer |
| TAX_UNIT_ID | Tax reporting unit |
Processing Details
| Column | Description |
| START_DATE | Start date (for proration) |
| END_DATE | End date (for proration) |
| PROCESSING_SPAN | Processing duration |
| CALC_BREAKDOWN_ID | Calculation breakdown reference |
| TIME_DEFINITION_ID | Time definition |
Additional Context
| Column | Description |
| DEDUCTION_TYPE_ID | Deduction type |
| THIRD_PARTY_PAYEE_ID | Third-party payment |
| DIR_CARD_COMP_ID | Card component reference |
| SOURCE_RESULT_ID | Reference to original result |
| AREA_CODE1 | Additional context |
| AREA_CODE2 | Additional context |
| AREA_CODE3 | Additional context |
| AREA_CODE4 | Additional context |
Technical Columns
| Column | Description |
| ENTERPRISE_ID | Enterprise reference |
| ORA_PART_KEY | Partition key (performance) |
Important Notes
- This table stores element-level calculated results
- One row per element per payroll run
- Does NOT store final values (see PAY_RUN_RESULT_VALUES)
- Used heavily in payroll calculations and debugging
Joins
- PAY_RUN_RESULT_VALUES → RUN_RESULT_ID
- PAY_ELEMENT_TYPES_F → ELEMENT_TYPE_ID
- PAY_ELEMENT_ENTRIES_F → ELEMENT_ENTRY_ID
- PAY_PAYROLL_REL_ACTIONS → PAYROLL_REL_ACTION_ID
Example Query
SELECT
prr.run_result_id,
prr.element_type_id,
prr.payroll_assignment_id,
prr.status
FROM pay_run_results prr
WHERE prr.status = 'C';
PAY_PAYROLL_REL_ACTIONS (Payroll Relationship Actions Table)
PAY_PAYROLL_REL_ACTIONS stores payroll processing details at the employee
(payroll relationship) level.
Each row represents the execution of a payroll run for a specific employee.
Core Identifiers
| Column | Description |
| PAYROLL_REL_ACTION_ID | Primary key |
| PAYROLL_ACTION_ID | Links to PAY_PAYROLL_ACTIONS |
| PAYROLL_RELATIONSHIP_ID | Employee payroll relationship |
Processing Status
| Column | Description |
| ACTION_STATUS | Status (C = Complete, U = Running, E = Error) |
| ACTION_SEQUENCE | Execution order |
| CHUNK_NUMBER | Batch/chunk processing identifier |
Processing Details
| Column | Description |
| START_DATE | Processing start date |
| END_DATE | Processing end date |
| SOURCE_ACTION_ID | Reference to source action |
| RUN_TYPE_ID | Payroll run type |
| PRE_PAYMENT_ID | Pre-payment reference |
| RETRO_COMPONENT_ID | Retro processing component |
| SOURCE_ID | Source reference |
| PARENT_OBJECT_ID | Parent process reference |
| PROCESS_PATH | Processing path identifier |
| SERIAL_NUMBER | Unique processing reference |
Technical Columns
| Column | Description |
| OBJECT_VERSION_NUMBER | Version control |
| ENTERPRISE_ID | Enterprise reference |
| ORA_PART_KEY | Partition key for performance |
Important Notes
- This table represents employee-level payroll processing
- Each PAYROLL_ACTION_ID will have multiple rows here (one per employee)
- Acts as the main bridge between payroll run and results
Joins
- PAY_PAYROLL_ACTIONS → PAYROLL_ACTION_ID
- PAY_RUN_RESULTS → PAYROLL_REL_ACTION_ID
- PAY_RUN_BALANCES → PAYROLL_REL_ACTION_ID
- PAY_PAYROLL_ASSIGNMENTS → PAYROLL_RELATIONSHIP_ID
Example Query
SELECT
pra.payroll_rel_action_id,
pra.payroll_action_id,
pra.payroll_relationship_id,
pra.action_status
FROM pay_payroll_rel_actions pra
WHERE pra.action_status = 'C';
Payroll Processing Flow (End-to-End)
The following flow explains how payroll data moves across Oracle Payroll tables:
1. PAY_PAYROLL_ACTIONS
→ Payroll run created (header level)
2. PAY_PAYROLL_REL_ACTIONS
→ Employee-level processing for that run
3. PAY_PAYROLL_ASSIGNMENTS
→ Maps HR assignment to payroll structure
4. PAY_ELEMENT_ENTRIES_F
→ Input values assigned to employee
5. PAY_INPUT_VALUES_F
→ Defines what values element accepts
6. PAY_RUN_RESULTS
→ Element calculation results (per element)
7. PAY_RUN_RESULT_VALUES
→ Actual calculated values (amount, hours, etc.)
8. PAY_RUN_BALANCES
→ Final aggregated balances (Net Pay, Gross Pay)
Flow Diagram (Simplified)
Payroll Run
↓
PAY_PAYROLL_ACTIONS
↓
PAY_PAYROLL_REL_ACTIONS
↓
PAY_PAYROLL_ASSIGNMENTS
↓
PAY_ELEMENT_ENTRIES_F
↓
PAY_RUN_RESULTS
↓
PAY_RUN_RESULT_VALUES
↓
PAY_RUN_BALANCES
Important Understanding
- Payroll runs start at header level and go down to employee level
- Each employee gets processed separately
- Results are stored in multiple stages (results → values → balances)
- This structure allows flexibility, auditing, and recalculation
PAY_SEARCH_ACTIONS_V (Payroll Search View)
PAY_SEARCH_ACTIONS_V is a reporting view that combines payroll action, employee,
and assignment data into a single searchable structure.
It is primarily used in UI screens and reports to quickly fetch payroll processing details.
Employee Information
| Column | Description |
| PERSON_ID | Employee identifier |
| PERSON_NUMBER | Employee number |
| FULL_NAME | Full employee name |
| TITLE | Title (Mr, Ms, etc.) |
| FIRST_NAME | First name |
| MIDDLE_NAMES | Middle name |
| LAST_NAME | Last name |
| ASSIGNMENT_ID | Employee assignment |
Payroll Action Details
| Column | Description |
| PAYROLL_ACTION_ID | Payroll run identifier |
| PAYROLL_REL_ACTION_ID | Employee-level payroll action |
| ACTION_TYPE | Payroll process type |
| ACTION_TYPE_CODE | Internal action type code |
| ACTION_CODE | Action reference code |
| STATUS | Status description |
| ACTION_STATUS_CODE | Status code (C, U, E) |
| OBJECT_TYPE | Type of object processed |
| OBJECT_ACTION_ID | Object action reference |
| SOURCE_ACTION_ID | Source action reference |
| CHILD_ACTION_ID | Child process action |
| TASK_NAME | Name of payroll task |
Payroll Context
| Column | Description |
| PAYROLL_RELATIONSHIP_ID | Payroll relationship |
| PAYROLL_RELATIONSHIP_NUMBER | Relationship number |
| PAYROLL_ID | Payroll identifier |
| PAYROLL_NAME | Payroll name |
| OBJECT_ID | Generic object reference |
Dates & Periods
| Column | Description |
| DATE_EARNED | Date earnings apply |
| PROCESS_DATE | Processing date |
| STATUTORY_PERIOD_NAME | Statutory payroll period |
| EARN_PERIOD_NAME | Earnings period |
| EARN_PERIOD_NUM | Earnings period number |
| STAT_PERIOD_NUM | Statutory period number |
Other Details
| Column | Description |
| LIST_NAME | Search list name |
| LEGISLATIVE_DATA_GROUP_ID | Legislation group |
| LOCKINGFLAG | Indicates record lock |
| LOCKINGSTATUS | Lock status |
Important Notes
- This is a view, not a base table
- Combines data from multiple payroll tables
- Used for searching payroll runs and employee processing
- Good for reporting, not for heavy joins
Joins (Internal)
- PAY_PAYROLL_ACTIONS
- PAY_PAYROLL_REL_ACTIONS
- PER_ALL_PEOPLE_F
- PER_PERSON_NAMES_F
- PER_ALL_ASSIGNMENTS_F
Example Query
SELECT
person_number,
full_name,
payroll_name,
action_type,
action_status_code,
process_date
FROM pay_search_actions_v
WHERE action_status_code = 'C';
PAY_CE_TRANSACTIONS (Payroll Payment Transactions Table)
PAY_CE_TRANSACTIONS stores payroll payment details such as bank transfers,
checks, and other payment methods.
Each row represents a payment transaction generated after payroll processing.
Core Identifiers
| Column | Description |
| PAYROLL_REL_ACTION_ID | Links to employee payroll processing |
| PAYROLL_ACTION_ID | Payroll run reference |
| PRE_PAYMENT_ID | Pre-payment process reference |
Payment Details
| Column | Description |
| AMOUNT | Payment amount |
| CURRENCY_CODE | Currency |
| PAYMENT_DATE | Date payment is issued |
| PAYMENT_STATUS | Status (Paid, Cleared, Pending) |
| RECON_FLAG | Reconciliation flag |
| CLEARED_DATE | Date payment cleared |
| ACTUAL_VALUE_DATE | Bank value date |
| CHECK_NUMBER | Check reference (if applicable) |
| SOURCE_TYPE | Source of payment |
Bank Details
| Column | Description |
| PAYER_BANK_ACCOUNT_ID | Employer bank account |
| PAYEE_BANK_ACCOUNT_ID | Employee bank account |
Payment Method
| Column | Description |
| ORG_PAYMENT_METHOD_ID | Payment method ID |
| ORG_PAYMENT_METHOD_NAME | Payment method name |
| PAYMENT_TYPE_ID | Payment type |
| PAYMENT_TYPE_NAME | Payment type name |
| BASE_PAYMENT_TYPE_ID | Base payment type |
| BASE_PAYMENT_TYPE_NAME | Base payment type name |
Payroll Context
| Column | Description |
| PAYROLL_ID | Payroll definition |
| VOID_PAYROLL_REL_ACTION_ID | Reference to voided payment |
| LEGISLATION_CODE | Country code |
| ENTERPRISE_ID | Enterprise reference |
Audit Columns
| Column | Description |
| CREATED_BY | Created by |
| CREATION_DATE | Creation date |
| LAST_UPDATED_BY | Updated by |
| LAST_UPDATE_DATE | Last update date |
| LAST_UPDATE_LOGIN | Session reference |
| OBJECT_VERSION_NUMBER | Version control |
Important Notes
- This table stores actual payment transactions
- Generated after payroll run and pre-payment process
- Includes bank, check, and payment method details
- Used for reconciliation and payment tracking
Joins
- PAY_PAYROLL_REL_ACTIONS → PAYROLL_REL_ACTION_ID
- PAY_PAYROLL_ACTIONS → PAYROLL_ACTION_ID
- PER_ALL_PEOPLE_F → via payroll relationship
- PAY_RUN_BALANCES → to verify amounts
Example Query
SELECT
pct.payroll_action_id,
pct.amount,
pct.currency_code,
pct.payment_status,
pct.payment_date
FROM pay_ce_transactions pct
WHERE pct.payment_status = 'PAID';
Complete Payroll to Payment Flow
Payroll Run Created
↓
PAY_PAYROLL_ACTIONS
↓
Employee Processing
↓
PAY_PAYROLL_REL_ACTIONS
↓
Element Input & Entries
↓
PAY_ELEMENT_ENTRIES_F
↓
Calculation Engine
↓
PAY_RUN_RESULTS
↓
Result Values
↓
PAY_RUN_RESULT_VALUES
↓
Final Balances
↓
PAY_RUN_BALANCES
↓
Payment Processing
↓
PAY_CE_TRANSACTIONS
This represents the complete lifecycle from payroll calculation to actual payment.
HR_DOCUMENTS_OF_RECORD (Documents of Record Table)
HR_DOCUMENTS_OF_RECORD stores employee-related documents such as passport, visa, certificates,
contracts, and other official records.
Each row represents a document associated with a person or assignment.
Core Identifiers
| Column | Description |
| DOCUMENTS_OF_RECORD_ID | Primary key |
| PERSON_ID | Employee identifier |
| ASSIGNMENT_ID | Assignment reference |
| ENTERPRISE_ID | Enterprise identifier |
| DOCUMENT_TYPE_ID | Type of document (Passport, Visa, etc.) |
Document Details
| Column | Description |
| DOCUMENT_CODE | Unique document code |
| DOCUMENT_NAME | Name of the document |
| DOCUMENT_NUMBER | Legal document number |
| ISSUING_COUNTRY | Country issuing the document |
| ISSUING_LOCATION | Location of issue |
| ISSUING_AUTHORITY | Authority who issued the document |
| ISSUED_DATE | Date document was issued |
| DATE_FROM | Valid from date |
| DATE_TO | Valid until date |
Related Object Mapping
| Column | Description |
| RELATED_OBJECT_NAME | Related entity (e.g., Absence) |
| RELATED_OBJECT_ID_COL | Column name of related object |
| RELATED_OBJECT_ID | Actual related object ID |
Publishing & Status
| Column | Description |
| PUBLISH | Indicates if document should be published |
| PUBLISH_DATE | Date when document becomes visible |
| CREATION_SOURCE | Source (HDL, UI, REST) |
| TAG_LIST | Tags for classification |
| COMMENTS | Additional comments |
Descriptive Flexfields (DFF)
This table supports Descriptive Flexfields for additional customization:
- DEI_ATTRIBUTE_CATEGORY → Structure definition
- DEI_ATTRIBUTE1 to DEI_ATTRIBUTE40 → Custom text attributes
- DEI_ATTRIBUTE_NUMBER1 to DEI_ATTRIBUTE_NUMBER20 → Numeric attributes
- DEI_ATTRIBUTE_DATE1 to DEI_ATTRIBUTE_DATE15 → Date attributes
- DEI_ATTRIBUTE_TIMESTAMP1 to DEI_ATTRIBUTE_TIMESTAMP5 → Timestamp attributes
Legislative Flexfields
- DEI_INFORMATION_CATEGORY → Legislative structure
- DEI_INFORMATION1 to DEI_INFORMATION40 → Legislative attributes
- DEI_INFORMATION_NUMBER1 to DEI_INFORMATION_NUMBER20 → Numeric legislative attributes
- DEI_INFORMATION_DATE1 to DEI_INFORMATION_DATE15 → Date legislative attributes
Audit Columns
| Column | Description |
| CREATED_BY | User who created the record |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session login reference |
| OBJECT_VERSION_NUMBER | Version control |
Important Notes
- Stores employee documents such as passport, visa, and certificates
- Supports attachment to person or assignment
- Highly extensible using DFF and legislative fields
- Used in HR self-service and compliance tracking
Joins
- PER_ALL_PEOPLE_F → PERSON_ID
- PER_ALL_ASSIGNMENTS_F → ASSIGNMENT_ID
- HR_DOCUMENT_TYPES_VL → DOCUMENT_TYPE_ID
- HRC_TXN_HEADER / HRC_TXN_DATA → transaction tracking
Example Query
SELECT
d.document_name,
d.document_number,
d.issued_date,
d.date_to
FROM hr_documents_of_record d
WHERE d.person_id = :person_id;
HRC_TXN_HEADER (Transaction Header Table)
HRC_TXN_HEADER stores high-level information about transactions initiated in Oracle HCM.
It is used to track business operations such as document uploads, approvals,
and data changes before they are committed to base tables.
Core Identifiers
| Column | Description |
| TRANSACTION_ID | Primary key for the transaction |
| ENTERPRISE_ID | Enterprise identifier (multi-tenancy) |
| INITIATOR_USER_ID | User who initiated the transaction |
| APPLICATION_ID | Application creating the transaction |
Transaction Context
| Column | Description |
| FAMILY | High-level grouping (used in searches) |
| MODULE_GROUP | Module group (e.g., HCM, Payroll) |
| MODULE_IDENTIFIER | Specific module name |
| PROCESS_ID | Process reference |
| PROCESS_OWNER | Owner process of the transaction |
| SECTION_DISPLAY_NAME | Display name of action |
Business Object Mapping
| Column | Description |
| OBJECT | Main table being updated |
| OBJECT_ID | Primary key of the target record |
| SUBJECT | Business object type (e.g., PERSON) |
| SUBJECT_ID | Identifier of the subject (e.g., PERSON_ID) |
| PARENT_TRANSACTION_ID | Parent transaction reference |
Transaction Data
| Column | Description |
| XML_DATA_CACHE | Stores transaction data in XML format |
| REENTRY_FUNCTION | Function used for re-entry handling |
| IS_TXN_GETTING_ARCHIVED | Indicates if transaction is archived |
Audit Columns
| Column | Description |
| CREATED_BY | User who created the transaction |
| CREATION_DATE | Creation timestamp |
| LAST_UPDATED_BY | Last updated user |
| LAST_UPDATE_DATE | Last update timestamp |
| LAST_UPDATE_LOGIN | Session reference |
| OBJECT_VERSION_NUMBER | Version control (optimistic locking) |
Important Notes
- Stores transaction header data before actual table updates
- Used in approval workflows and UI transactions
- XML_DATA_CACHE contains full transaction payload
- Works with HRC_TXN_DATA for transaction status tracking
Joins
- HRC_TXN_DATA → TRANSACTION_ID
- PER_ALL_PEOPLE_F → SUBJECT_ID (if subject = PERSON)
- HR_DOCUMENTS_OF_RECORD → OBJECT_ID (for document transactions)
Example Query
SELECT
txn.transaction_id,
txn.subject,
txn.object,
txn.creation_date
FROM hrc_txn_header txn
WHERE txn.subject = 'PERSON';
SQL Logic
DENSE_RANK() OVER (ORDER BY PAPF.PERSON_NUMBER) S_No
TO_CHAR(ppos.last_working_date,'DD-MON-YYYY','nls_date_language=english')
TO_CHAR(hdr.last_update_date,
'DD MONTH YYYY',
'NLS_CALENDAR=''ARABIC HIJRAH'' NLS_DATE_LANGUAGE=ARABIC')
COALESCE((SELECT MAX(fl.meaning)
FROM fnd_lookup_values_tl fl
WHERE fl.lookup_type='NATIONALITY'),' - ')
Duplicate Handling
WHERE SYSDATE BETWEEN EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE