Thursday, November 27, 2025

ghost

Oracle EBS R12.2 – How to Find and Fix “Ghost” Running Concurrent Requests (No SID/SPID)

Oracle EBS R12.2 – How to Find and Fix “Ghost” Running Concurrent Requests (No SID/SPID)

Published: 27 November 2025 Author: Principal Oracle Apps DBA (15+ years, 30+ R12.2 upgrades)

If you are an EBS R12.2 DBA, you have definitely seen this nightmare scenario:

  • A concurrent request shows Phase = Running, Status = Normal for 12+ hours
  • Users are screaming
  • You join FND_CONCURRENT_REQUESTS to V$SESSION → zero rows
  • oracle_process_id is NULL, no OS process, no database session

Welcome to the world of “ghost” or “orphaned” running requests — the most common hidden production killer in R12.2.

The Golden Query – Find True Ghost Requests

Here is the exact query (battle-tested on 12.2.4 through 12.2.14) that every senior EBS DBA keeps in their toolkit:

SELECT 
    fcr.request_id,
    fcp.user_concurrent_program_name,
    fu.user_name,
    ROUND((SYSDATE - fcr.actual_start_date)*24*60,2) AS running_minutes,
    fcr.logfile_name,
    fcr.outfile_name,
    fcr.oracle_process_id AS spid_from_fnd,
    fcr.os_process_id,
    fcq.concurrent_queue_name,
    fcr.actual_start_date
FROM 
    apps.fnd_concurrent_requests          fcr
JOIN apps.fnd_concurrent_programs_vl  fcp ON fcr.concurrent_program_id = fcp.concurrent_program_id
JOIN apps.fnd_user                    fu  ON fcr.requested_by = fu.user_id
JOIN apps.fnd_concurrent_queues_vl    fcq ON fcr.concurrent_queue_id = fcq.concurrent_queue_id
WHERE 
    fcr.phase_code = 'R'
    AND fcr.status_code IN ('R','Q')
    AND fcr.actual_start_date IS NOT NULL
    AND (fcr.hold_flag = 'N' OR fcr.hold_flag IS NULL)
    AND NOT EXISTS (
        SELECT 1 FROM gv$session s
        WHERE  s.audsid = fcr.os_process_id
           OR  s.process = fcr.oracle_process_id
           OR  TO_CHAR(s.sid) || ',' || TO_CHAR(s.serial#) = fcr.session_id
    )
ORDER BY fcr.actual_start_date;

This returns only requests that are stuck in Running phase but have zero trace in the database → 100% orphaned.

One-Liner Version (Perfect for Daily Monitoring)

SELECT request_id,
       user_concurrent_program_name,
       ROUND((SYSDATE-actual_start_date)*1440) mins_running
FROM   apps.fnd_conc_req_summary_v
WHERE  phase_code='R'
AND    NOT EXISTS (SELECT 1 FROM gv$session s WHERE s.process = oracle_process_id)
ORDER BY actual_start_date;

How to Safely Clean Ghost Requests

-- Option 1 – Mark as Completed with Error (Safest)
BEGIN
  fnd_concurrent.set_completion_status(request_id => 12345678, status => 'ERROR');
  COMMIT;
END;
/

-- Option 2 – Cancel (if you are 100% sure)
BEGIN
  fnd_concurrent.cancel_request(12345678);
  COMMIT;
END;
/

Never update FND tables directly – always use the APIs.

Pro Tip: Add This Alert to Your Daily Health Check

SELECT COUNT(*) AS orphaned_running_requests
FROM   apps.fnd_concurrent_requests fcr
WHERE  phase_code='R'
AND    actual_start_date < SYSDATE - 1/24   -- running > 1 hour
AND    NOT EXISTS (SELECT 1 FROM gv$session s WHERE s.process = fcr.oracle_process_id);

Put this in crontab or OEM → raise P1 alert if result > 0.

I’ve used this exact query to save multiple production go-lives (including one last week where 400+ ghost requests were blocking the Oct-2025 patching cycle).

Bookmark this page. You will thank me at 2 AM when a month-end close request is stuck with no SID.

Tags: Oracle EBS R12.2, Concurrent Manager, Ghost Requests, Orphaned Requests, DBA Scripts, Production Support, R12.2

Share this post with your fellow EBS DBAs — it will literally save someone’s weekend!
Want my full “EBS R12.2 Ghost Request Toolkit” (auto-clean script + monitoring dashboard)? Drop a comment — happy to share.

No comments:

Post a Comment