Oracle Recruiting Cloud Tables and Data Model Complete Guide

Oracle Recruiting Cloud (ORC), also known as Internet Recruiting Cloud (IRC), provides a comprehensive talent acquisition platform within Oracle Fusion HCM. Understanding the underlying database structure is essential for building reports, integrations, and analytics that support your recruiting operations.

This guide covers the core Oracle Recruiting Cloud tables, their relationships, and practical SQL examples for common recruiting scenarios. Whether you're building recruiting dashboards, analyzing time-to-hire metrics, or integrating with external systems, mastering the ORC data model will enhance your talent acquisition capabilities.

Oracle Recruiting Cloud Data Model Overview

The Oracle Recruiting Cloud data model centers around the candidate journey from job posting to hiring. The core entities represent the recruiting lifecycle:

Job Requisition
Open positions
→
Candidate
Talent pool
→
Application
Job applications
→
Interview
Selection process
→
Offer
Job offers

Each stage in this journey corresponds to specific tables and data structures in Oracle Recruiting Cloud, allowing for comprehensive tracking of recruiting metrics and candidate experiences.

Core Recruiting Tables

IRC_REQUISITIONS - Job Requisitions

The IRC_REQUISITIONS table stores information about job openings, including position details, approval workflow, and hiring requirements. This is the starting point for all recruiting activities.

Key Columns Description Usage
REQUISITION_ID Unique requisition identifier Primary key for joining to other tables
REQUISITION_NUMBER Human-readable requisition number User-friendly identifier for reporting
JOB_TITLE Position title Display in job postings and reports
HIRING_MANAGER_ID Manager responsible for hiring Link to PER_ALL_PEOPLE_F for manager details
DEPARTMENT_NAME Hiring department Organizational reporting and analysis
CURRENT_STATE Requisition status (Draft, Open, Filled, etc.) Workflow tracking and filtering
CURRENT_PHASE Current phase in approval process Workflow tracking
POSTED_DATE When requisition was posted Time-to-fill calculations
TARGET_HIRE_DATE Desired hire date Urgency tracking
NUMBER_OF_OPENINGS Total positions to fill Bulk hiring tracking

Sample Query: Open Requisitions Report

-- Active requisitions with hiring manager details
SELECT 
    r.REQUISITION_NUMBER,
    r.JOB_TITLE,
    r.DEPARTMENT_NAME,
    r.NUMBER_OF_OPENINGS,
    r.POSTED_DATE,
    r.TARGET_HIRE_DATE,
    p.DISPLAY_NAME as HIRING_MANAGER,
    r.CURRENT_STATE,
    TRUNC(SYSDATE) - TRUNC(r.POSTED_DATE) as DAYS_OPEN
FROM IRC_REQUISITIONS r
LEFT JOIN PER_ALL_PEOPLE_F p 
  ON r.HIRING_MANAGER_ID = p.PERSON_ID
  AND TRUNC(SYSDATE) BETWEEN p.EFFECTIVE_START_DATE 
                          AND p.EFFECTIVE_END_DATE
WHERE r.CURRENT_STATE IN ('Open', 'In Progress')
ORDER BY r.POSTED_DATE DESC;

IRC_CANDIDATES - Candidate Information

The IRC_CANDIDATES table contains candidate profiles, including contact information, work experience, and skills. This table serves as the central repository for all candidate data across multiple job applications.

Key Columns Description Usage
CANDIDATE_ID Unique candidate identifier Primary key, links to applications
CANDIDATE_NUMBER Human-readable candidate number User-friendly identifier
FIRST_NAME / LAST_NAME Candidate name Display and communication
EMAIL_ADDRESS Primary email contact Communication and duplicate detection
PHONE_NUMBER Primary phone contact Communication
CURRENT_JOB_TITLE Current position title Skills and experience assessment
CURRENT_EMPLOYER Current company Background and experience
REGISTRATION_DATE When candidate joined talent pool Talent pipeline analysis
SOURCE_TYPE How candidate was sourced Source effectiveness analysis
CANDIDATE_TYPE Internal/External classification Internal mobility tracking

Sample Query: Candidate Source Analysis

-- Candidate source effectiveness over last 6 months
SELECT 
    c.SOURCE_TYPE,
    COUNT(*) as CANDIDATE_COUNT,
    COUNT(CASE WHEN a.CURRENT_STATE = 'Hired' THEN 1 END) as HIRED_COUNT,
    ROUND(
        COUNT(CASE WHEN a.CURRENT_STATE = 'Hired' THEN 1 END) / COUNT(*) * 100, 2
    ) as HIRE_RATE_PCT
FROM IRC_CANDIDATES c
LEFT JOIN IRC_APPLICATIONS a ON c.CANDIDATE_ID = a.CANDIDATE_ID
WHERE c.REGISTRATION_DATE >= ADD_MONTHS(TRUNC(SYSDATE), -6)
  AND c.SOURCE_TYPE IS NOT NULL
GROUP BY c.SOURCE_TYPE
ORDER BY HIRED_COUNT DESC;

IRC_APPLICATIONS - Job Applications

The IRC_APPLICATIONS table represents the many-to-many relationship between candidates and requisitions. A single candidate can apply to multiple positions, and each application goes through its own workflow.

Key Columns Description Usage
APPLICATION_ID Unique application identifier Primary key
CANDIDATE_ID Links to candidate Foreign key to IRC_CANDIDATES
REQUISITION_ID Links to job requisition Foreign key to IRC_REQUISITIONS
APPLICATION_DATE When application was submitted Time-to-hire calculations
CURRENT_STATE Application status (New, Under Review, Hired, etc.) Pipeline tracking
CURRENT_PHASE Current step in selection process Workflow tracking
RECRUITER_ID Assigned recruiter Workload distribution
RATING Overall candidate rating Quality assessment
HIRE_DATE Actual hire date (if hired) Time-to-hire calculations
WITHDRAWAL_REASON Why application was withdrawn Process improvement analysis

Sample Query: Recruiting Pipeline Report

-- Current recruiting pipeline by requisition
SELECT 
    r.REQUISITION_NUMBER,
    r.JOB_TITLE,
    r.DEPARTMENT_NAME,
    COUNT(a.APPLICATION_ID) as TOTAL_APPLICATIONS,
    COUNT(CASE WHEN a.CURRENT_STATE = 'New' THEN 1 END) as NEW_APPLICATIONS,
    COUNT(CASE WHEN a.CURRENT_STATE = 'Under Review' THEN 1 END) as UNDER_REVIEW,
    COUNT(CASE WHEN a.CURRENT_STATE = 'Interview' THEN 1 END) as IN_INTERVIEW,
    COUNT(CASE WHEN a.CURRENT_STATE = 'Offer' THEN 1 END) as OFFER_STAGE,
    COUNT(CASE WHEN a.CURRENT_STATE = 'Hired' THEN 1 END) as HIRED,
    COUNT(CASE WHEN a.CURRENT_STATE IN ('Rejected', 'Withdrawn') THEN 1 END) as CLOSED
FROM IRC_REQUISITIONS r
LEFT JOIN IRC_APPLICATIONS a ON r.REQUISITION_ID = a.REQUISITION_ID
WHERE r.CURRENT_STATE IN ('Open', 'In Progress')
GROUP BY r.REQUISITION_ID, r.REQUISITION_NUMBER, r.JOB_TITLE, r.DEPARTMENT_NAME
ORDER BY r.REQUISITION_NUMBER;

IRC_INTERVIEWS - Interview Management

The IRC_INTERVIEWS table tracks interview sessions, including scheduling, participants, and feedback. This table is crucial for managing the interview process and ensuring compliance with hiring practices.

Key Columns Description Usage
INTERVIEW_ID Unique interview identifier Primary key
APPLICATION_ID Links to application Foreign key to IRC_APPLICATIONS
INTERVIEW_TYPE Type of interview (Phone, In-Person, Video, etc.) Interview method tracking
SCHEDULED_DATE Planned interview date and time Calendar scheduling
ACTUAL_DATE When interview actually occurred Completion tracking
DURATION Interview length in minutes Time investment analysis
INTERVIEWER_ID Primary interviewer Links to PER_ALL_PEOPLE_F
INTERVIEW_STATUS Status (Scheduled, Completed, Cancelled) Process tracking
OVERALL_RATING Interview outcome rating Decision tracking
COMMENTS Interview feedback and notes Decision documentation

Sample Query: Interview Metrics

-- Interview completion rates and timings by interviewer
SELECT 
    p.DISPLAY_NAME as INTERVIEWER,
    COUNT(i.INTERVIEW_ID) as TOTAL_INTERVIEWS,
    COUNT(CASE WHEN i.INTERVIEW_STATUS = 'Completed' THEN 1 END) as COMPLETED,
    COUNT(CASE WHEN i.INTERVIEW_STATUS = 'Cancelled' THEN 1 END) as CANCELLED,
    ROUND(
        COUNT(CASE WHEN i.INTERVIEW_STATUS = 'Completed' THEN 1 END) / 
        COUNT(i.INTERVIEW_ID) * 100, 2
    ) as COMPLETION_RATE_PCT,
    ROUND(AVG(i.DURATION), 0) as AVG_DURATION_MIN
FROM IRC_INTERVIEWS i
JOIN PER_ALL_PEOPLE_F p 
  ON i.INTERVIEWER_ID = p.PERSON_ID
  AND TRUNC(SYSDATE) BETWEEN p.EFFECTIVE_START_DATE 
                          AND p.EFFECTIVE_END_DATE
WHERE i.SCHEDULED_DATE >= TRUNC(SYSDATE) - 90  -- Last 90 days
GROUP BY p.PERSON_ID, p.DISPLAY_NAME
HAVING COUNT(i.INTERVIEW_ID) >= 5  -- Minimum 5 interviews
ORDER BY COMPLETION_RATE_PCT DESC;

Secondary Tables and Relationships

IRC_OFFERS - Job Offers

The IRC_OFFERS table manages job offers extended to candidates, including compensation details, approval workflow, and acceptance tracking.

Key Columns Description Business Use
OFFER_ID Unique offer identifier Primary key
APPLICATION_ID Links to application Candidate-offer relationship
OFFER_DATE When offer was extended Time-to-offer tracking
OFFER_STATUS Current offer status Acceptance tracking
SALARY_AMOUNT Offered salary Compensation analysis
CURRENCY_CODE Salary currency Multi-currency support
START_DATE Proposed start date Onboarding planning
RESPONSE_DATE When candidate responded Response time tracking

IRC_CANDIDATE_SKILLS - Skills and Qualifications

This table stores candidate skills, certifications, and qualifications, enabling skills-based matching and talent pool analysis.

Key Columns Description Usage
CANDIDATE_ID Links to candidate Foreign key relationship
SKILL_NAME Skill or qualification name Skills matching
PROFICIENCY_LEVEL Skill level (Beginner, Expert, etc.) Capability assessment
YEARS_OF_EXPERIENCE Experience with this skill Experience evaluation
CERTIFIED_FLAG Whether skill is certified Qualification verification

IRC_JOB_REQUIREMENTS - Requisition Requirements

This table defines the skills, experience, and qualifications required for each job requisition, enabling automated candidate matching.

Key Columns Description Usage
REQUISITION_ID Links to requisition Job requirements definition
SKILL_NAME Required skill Matching criteria
IMPORTANCE Requirement priority (Must Have, Nice to Have) Candidate ranking
MINIMUM_EXPERIENCE Minimum years required Filtering criteria
PREFERRED_LEVEL Desired proficiency level Candidate evaluation

Common Recruiting Queries and Reports

Time-to-Fill Analysis

Understanding how long it takes to fill positions is crucial for recruiting efficiency:

-- Average time-to-fill by department and job title
SELECT 
    r.DEPARTMENT_NAME,
    r.JOB_TITLE,
    COUNT(*) as FILLED_POSITIONS,
    ROUND(AVG(a.HIRE_DATE - r.POSTED_DATE), 1) as AVG_DAYS_TO_FILL,
    MIN(a.HIRE_DATE - r.POSTED_DATE) as MIN_DAYS,
    MAX(a.HIRE_DATE - r.POSTED_DATE) as MAX_DAYS
FROM IRC_REQUISITIONS r
JOIN IRC_APPLICATIONS a 
  ON r.REQUISITION_ID = a.REQUISITION_ID
  AND a.CURRENT_STATE = 'Hired'
WHERE a.HIRE_DATE >= TRUNC(SYSDATE) - 365  -- Last year
  AND r.POSTED_DATE IS NOT NULL
  AND a.HIRE_DATE IS NOT NULL
GROUP BY r.DEPARTMENT_NAME, r.JOB_TITLE
HAVING COUNT(*) >= 3  -- Minimum sample size
ORDER BY AVG_DAYS_TO_FILL DESC;

Recruiter Performance Dashboard

Tracking recruiter effectiveness across multiple metrics:

-- Recruiter performance metrics
WITH recruiter_stats AS (
    SELECT 
        a.RECRUITER_ID,
        p.DISPLAY_NAME as RECRUITER_NAME,
        COUNT(a.APPLICATION_ID) as TOTAL_APPLICATIONS,
        COUNT(CASE WHEN a.CURRENT_STATE = 'Hired' THEN 1 END) as HIRES,
        AVG(CASE WHEN a.HIRE_DATE IS NOT NULL 
            THEN a.HIRE_DATE - a.APPLICATION_DATE END) as AVG_TIME_TO_HIRE,
        COUNT(DISTINCT a.REQUISITION_ID) as REQUISITIONS_WORKED
    FROM IRC_APPLICATIONS a
    JOIN PER_ALL_PEOPLE_F p 
      ON a.RECRUITER_ID = p.PERSON_ID
      AND TRUNC(SYSDATE) BETWEEN p.EFFECTIVE_START_DATE 
                              AND p.EFFECTIVE_END_DATE
    WHERE a.APPLICATION_DATE >= TRUNC(SYSDATE) - 90  -- Last quarter
      AND a.RECRUITER_ID IS NOT NULL
    GROUP BY a.RECRUITER_ID, p.DISPLAY_NAME
)
SELECT 
    RECRUITER_NAME,
    TOTAL_APPLICATIONS,
    HIRES,
    ROUND((HIRES / TOTAL_APPLICATIONS) * 100, 2) as HIRE_RATE_PCT,
    ROUND(AVG_TIME_TO_HIRE, 1) as AVG_DAYS_TO_HIRE,
    REQUISITIONS_WORKED,
    ROUND(TOTAL_APPLICATIONS / REQUISITIONS_WORKED, 1) as AVG_APPS_PER_REQ
FROM recruiter_stats
WHERE TOTAL_APPLICATIONS >= 10  -- Minimum activity level
ORDER BY HIRE_RATE_PCT DESC;

Candidate Conversion Funnel

Analyzing drop-off rates at each stage of the recruiting process:

-- Recruiting funnel analysis
SELECT 
    'Applications Received' as STAGE,
    COUNT(*) as CANDIDATE_COUNT,
    100.0 as CONVERSION_RATE
FROM IRC_APPLICATIONS 
WHERE APPLICATION_DATE >= TRUNC(SYSDATE) - 90

UNION ALL

SELECT 
    'Passed Initial Screening',
    COUNT(*),
    ROUND((COUNT(*) / (
        SELECT COUNT(*) FROM IRC_APPLICATIONS 
        WHERE APPLICATION_DATE >= TRUNC(SYSDATE) - 90
    )) * 100, 2)
FROM IRC_APPLICATIONS 
WHERE CURRENT_PHASE NOT IN ('New', 'Rejected')
  AND APPLICATION_DATE >= TRUNC(SYSDATE) - 90

UNION ALL

SELECT 
    'Interviewed',
    COUNT(DISTINCT a.APPLICATION_ID),
    ROUND((COUNT(DISTINCT a.APPLICATION_ID) / (
        SELECT COUNT(*) FROM IRC_APPLICATIONS 
        WHERE APPLICATION_DATE >= TRUNC(SYSDATE) - 90
    )) * 100, 2)
FROM IRC_APPLICATIONS a
JOIN IRC_INTERVIEWS i ON a.APPLICATION_ID = i.APPLICATION_ID
WHERE a.APPLICATION_DATE >= TRUNC(SYSDATE) - 90
  AND i.INTERVIEW_STATUS = 'Completed'

UNION ALL

SELECT 
    'Received Offer',
    COUNT(DISTINCT a.APPLICATION_ID),
    ROUND((COUNT(DISTINCT a.APPLICATION_ID) / (
        SELECT COUNT(*) FROM IRC_APPLICATIONS 
        WHERE APPLICATION_DATE >= TRUNC(SYSDATE) - 90
    )) * 100, 2)
FROM IRC_APPLICATIONS a
JOIN IRC_OFFERS o ON a.APPLICATION_ID = o.APPLICATION_ID
WHERE a.APPLICATION_DATE >= TRUNC(SYSDATE) - 90

UNION ALL

SELECT 
    'Hired',
    COUNT(*),
    ROUND((COUNT(*) / (
        SELECT COUNT(*) FROM IRC_APPLICATIONS 
        WHERE APPLICATION_DATE >= TRUNC(SYSDATE) - 90
    )) * 100, 2)
FROM IRC_APPLICATIONS 
WHERE CURRENT_STATE = 'Hired'
  AND APPLICATION_DATE >= TRUNC(SYSDATE) - 90

ORDER BY CONVERSION_RATE DESC;

Advanced Analytics and Integrations

Skills Gap Analysis

Identifying skill shortages in your candidate pipeline:

-- Skills gap analysis: Required vs Available
WITH required_skills AS (
    SELECT 
        jr.SKILL_NAME,
        COUNT(DISTINCT r.REQUISITION_ID) as OPEN_POSITIONS,
        AVG(CASE WHEN jr.IMPORTANCE = 'Must Have' THEN 1 ELSE 0 END) as CRITICAL_SKILL_PCT
    FROM IRC_JOB_REQUIREMENTS jr
    JOIN IRC_REQUISITIONS r ON jr.REQUISITION_ID = r.REQUISITION_ID
    WHERE r.CURRENT_STATE IN ('Open', 'In Progress')
    GROUP BY jr.SKILL_NAME
),
available_skills AS (
    SELECT 
        cs.SKILL_NAME,
        COUNT(DISTINCT c.CANDIDATE_ID) as CANDIDATE_COUNT,
        AVG(CASE WHEN cs.PROFICIENCY_LEVEL IN ('Expert', 'Advanced') 
            THEN 1 ELSE 0 END) as HIGH_PROFICIENCY_PCT
    FROM IRC_CANDIDATE_SKILLS cs
    JOIN IRC_CANDIDATES c ON cs.CANDIDATE_ID = c.CANDIDATE_ID
    WHERE c.REGISTRATION_DATE >= TRUNC(SYSDATE) - 365  -- Active candidates
    GROUP BY cs.SKILL_NAME
)
SELECT 
    COALESCE(rs.SKILL_NAME, as_skill.SKILL_NAME) as SKILL,
    NVL(rs.OPEN_POSITIONS, 0) as DEMAND,
    NVL(as_skill.CANDIDATE_COUNT, 0) as SUPPLY,
    CASE 
        WHEN NVL(as_skill.CANDIDATE_COUNT, 0) = 0 THEN 'Critical Shortage'
        WHEN rs.OPEN_POSITIONS > as_skill.CANDIDATE_COUNT THEN 'Shortage'
        WHEN rs.OPEN_POSITIONS * 2 < as_skill.CANDIDATE_COUNT THEN 'Surplus'
        ELSE 'Balanced'
    END as SUPPLY_STATUS,
    ROUND(NVL(rs.CRITICAL_SKILL_PCT, 0) * 100, 1) as CRITICAL_IMPORTANCE_PCT
FROM required_skills rs
FULL OUTER JOIN available_skills as_skill 
  ON rs.SKILL_NAME = as_skill.SKILL_NAME
WHERE NVL(rs.OPEN_POSITIONS, 0) > 0 OR NVL(as_skill.CANDIDATE_COUNT, 0) > 0
ORDER BY NVL(rs.OPEN_POSITIONS, 0) DESC, as_skill.CANDIDATE_COUNT ASC;

Diversity Recruiting Metrics

Tracking diversity at each stage of the recruiting process:

-- Diversity funnel analysis (assuming diversity data is captured)
WITH diversity_funnel AS (
    SELECT 
        c.GENDER,
        c.ETHNICITY,
        COUNT(DISTINCT a.APPLICATION_ID) as APPLICATIONS,
        COUNT(DISTINCT CASE WHEN i.INTERVIEW_STATUS = 'Completed' 
              THEN a.APPLICATION_ID END) as INTERVIEWED,
        COUNT(DISTINCT CASE WHEN o.OFFER_STATUS = 'Extended' 
              THEN a.APPLICATION_ID END) as OFFERS,
        COUNT(DISTINCT CASE WHEN a.CURRENT_STATE = 'Hired' 
              THEN a.APPLICATION_ID END) as HIRES
    FROM IRC_CANDIDATES c
    JOIN IRC_APPLICATIONS a ON c.CANDIDATE_ID = a.CANDIDATE_ID
    LEFT JOIN IRC_INTERVIEWS i ON a.APPLICATION_ID = i.APPLICATION_ID
    LEFT JOIN IRC_OFFERS o ON a.APPLICATION_ID = o.APPLICATION_ID
    WHERE a.APPLICATION_DATE >= TRUNC(SYSDATE) - 180  -- Last 6 months
      AND c.GENDER IS NOT NULL
      AND c.ETHNICITY IS NOT NULL
    GROUP BY c.GENDER, c.ETHNICITY
)
SELECT 
    GENDER,
    ETHNICITY,
    APPLICATIONS,
    INTERVIEWED,
    ROUND((INTERVIEWED / APPLICATIONS) * 100, 2) as INTERVIEW_RATE_PCT,
    OFFERS,
    ROUND((OFFERS / APPLICATIONS) * 100, 2) as OFFER_RATE_PCT,
    HIRES,
    ROUND((HIRES / APPLICATIONS) * 100, 2) as HIRE_RATE_PCT
FROM diversity_funnel
WHERE APPLICATIONS >= 5  -- Minimum sample size
ORDER BY APPLICATIONS DESC;

Integration Considerations

When building integrations with Oracle Recruiting Cloud data, consider these important aspects:

Data Security and Privacy

Privacy Compliance: Recruiting data contains sensitive personal information. Ensure your queries and integrations comply with GDPR, CCPA, and other privacy regulations. Implement appropriate data masking for non-production environments.

Performance Optimization

Recruiting tables can grow large over time. Use these optimization strategies:

Change Data Capture

For real-time integrations, consider implementing change detection:

-- Identifying recent changes for incremental sync
SELECT 
    a.APPLICATION_ID,
    a.CANDIDATE_ID,
    a.REQUISITION_ID,
    a.CURRENT_STATE,
    a.LAST_UPDATE_DATE,
    'APPLICATION' as RECORD_TYPE
FROM IRC_APPLICATIONS a
WHERE a.LAST_UPDATE_DATE >= :last_sync_timestamp

UNION ALL

SELECT 
    c.CANDIDATE_ID,
    NULL,
    NULL,
    NULL,
    c.LAST_UPDATE_DATE,
    'CANDIDATE'
FROM IRC_CANDIDATES c
WHERE c.LAST_UPDATE_DATE >= :last_sync_timestamp

ORDER BY LAST_UPDATE_DATE;

Best Practices for Recruiting Analytics

1. Establish Clear Metrics

Define key performance indicators (KPIs) that align with business objectives:

2. Implement Data Quality Checks

-- Data quality validation queries
-- Check for missing critical data
SELECT 
    'Missing Requisition Hiring Manager' as ISSUE,
    COUNT(*) as ISSUE_COUNT
FROM IRC_REQUISITIONS 
WHERE CURRENT_STATE IN ('Open', 'In Progress')
  AND HIRING_MANAGER_ID IS NULL

UNION ALL

SELECT 
    'Applications Missing Recruiter',
    COUNT(*)
FROM IRC_APPLICATIONS 
WHERE CURRENT_STATE NOT IN ('Hired', 'Rejected', 'Withdrawn')
  AND RECRUITER_ID IS NULL

UNION ALL

SELECT 
    'Interviews Missing Feedback',
    COUNT(*)
FROM IRC_INTERVIEWS 
WHERE INTERVIEW_STATUS = 'Completed'
  AND OVERALL_RATING IS NULL
  AND SCHEDULED_DATE >= TRUNC(SYSDATE) - 30;

3. Regular Reporting Cadence

Establish regular reporting schedules:

Mastering Oracle Recruiting Cloud's data model enables powerful talent acquisition analytics and reporting. Whether you're tracking recruiting efficiency, analyzing candidate quality, or optimizing your hiring process, understanding these core tables and relationships is essential.

Combine recruiting data with core HCM entities for comprehensive workforce analytics, and leverage REST APIs for real-time integrations with external recruiting tools and platforms.