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_idis 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.
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