{"id":927,"date":"2026-04-23T11:47:50","date_gmt":"2026-04-23T11:47:50","guid":{"rendered":"https:\/\/forgefuse.wasmer.app\/?p=927"},"modified":"2026-04-23T11:52:40","modified_gmt":"2026-04-23T11:52:40","slug":"debugging-oracle-ebs-concurrent-programs-like-a-pro","status":"publish","type":"post","link":"https:\/\/www.forgefuse.net\/index.php\/debugging-oracle-ebs-concurrent-programs-like-a-pro\/","title":{"rendered":"Debugging Oracle EBS Concurrent Programs Like a Pro"},"content":{"rendered":"\n<p>When working with <strong>Oracle E-Business Suite<\/strong>, concurrent programs are at the heart of most business processes. And sooner or later, every developer runs into the same challenge:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201cWhy is my concurrent request failing\u2026 and where do I even start?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>This post is both a <strong>debugging guide<\/strong> and a <strong>SQL cheat sheet<\/strong> I personally rely on when troubleshooting issues in real environments.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Understanding Log vs Output Files<\/h5>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udcc4 Log File (The Real Debugging Tool)<\/h5>\n\n\n\n<p>The <strong>log file<\/strong> is where everything important happens.<\/p>\n\n\n\n<p>It contains:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PL\/SQL errors<\/li>\n\n\n\n<li>Debug messages<\/li>\n\n\n\n<li>Execution steps<\/li>\n\n\n\n<li>SQL errors (ORA-xxxx)<\/li>\n<\/ul>\n\n\n\n<p>Example:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ORA-01403: no data found<\/pre>\n\n\n\n<p>This is always your <strong>first place to check<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udcca Output File (User-Facing Result)<\/h5>\n\n\n\n<p>The <strong>output file<\/strong> is what the user sees.<\/p>\n\n\n\n<p>It contains:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Report data<\/li>\n\n\n\n<li>XML \/ PDF output<\/li>\n\n\n\n<li>Formatted results<\/li>\n<\/ul>\n\n\n\n<p> If output is empty but request is \u201cNormal\u201d, the issue is often in logic, not execution.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Using FND_FILE for Debugging<\/h4>\n\n\n\n<p>The <code>FND_FILE<\/code> package is your best friend.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">Writing to Log<\/h6>\n\n\n\n<pre class=\"wp-block-preformatted\">FND_FILE.PUT_LINE(FND_FILE.LOG, 'Start of program');<\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">Writing to Output<\/h6>\n\n\n\n<pre class=\"wp-block-preformatted\">FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Report Line');<\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">Real Debug Example<\/h6>\n\n\n\n<pre class=\"wp-block-preformatted\">FND_FILE.PUT_LINE(FND_FILE.LOG, 'Before fetching employee');<br><br>SELECT employee_name<br>INTO   l_name<br>FROM   employees<br>WHERE  employee_id = p_emp_id;<br><br>FND_FILE.PUT_LINE(FND_FILE.LOG, 'Employee: ' || l_name);<\/pre>\n\n\n\n<p>Always log:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Input parameters<\/li>\n\n\n\n<li>Key variable values<\/li>\n\n\n\n<li>Execution checkpoints<\/li>\n<\/ul>\n\n\n\n<p>Additionally, I usually like to wrap the log and output functions in a separate procedures inside my PLSQL package. I usually name them &#8220;log&#8221; and &#8220;outp&#8221; accepting only one parameter of VARCHAR type.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Common Errors and How to Read Them<br><br>ORA Errors (Database Errors)<\/h5>\n\n\n\n<p>Example:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>ORA-01403: no data found<\/p>\n<\/blockquote>\n\n\n\n<p>Meaning:<\/p>\n\n\n\n<p>Your SELECT INTO returned no rows<\/p>\n\n\n\n<p>Fix:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n\nSELECT \u2026\nINTO \u2026\nFROM \u2026\nWHERE \u2026;\n\nEXCEPTION\n  WHEN NO_DATA_FOUND THEN\n  FND_FILE.PUT_LINE(FND_FILE.LOG, 'No data found');\nEND;<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">APP-FND Errors (Application Layer)<br>Example:<\/h5>\n\n\n\n<p>APP-FND-01564: ORACLE error 1403 in\u2026<\/p>\n\n\n\n<p>Meaning:<\/p>\n\n\n\n<p>Wrapper around ORA error<br>Often tied to concurrent processing<\/p>\n\n\n\n<p>Always scroll further down in log to find actual ORA error.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tracing SQL from Concurrent Programs<\/h4>\n\n\n\n<p>When logs are not enough, enable SQL trace.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Option 1: Enable Trace for Request<\/h5>\n\n\n\n<p>Set profile:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Concurrent: Allow Debugging = Yes<\/pre>\n\n\n\n<p>Then enable trace at request level.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Option 2: Add in Code<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">EXEC DBMS_SESSION.SET_SQL_TRACE(TRUE);<\/pre>\n\n\n\n<p>Trace file will be generated on DB server.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Option 3: Use FND_TRACE (Advanced)<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">FND_TRACE.SET_TRACE_ON;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Top SQL Queries Every EBS Developer Should Know<\/h4>\n\n\n\n<p>These are extremely useful when debugging.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd0d Find Concurrent Request Details<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    request_id,<br>    phase_code,<br>    status_code,<br>    argument_text,<br>    logfile_name,<br>    outfile_name<br>FROM<br>    fnd_concurrent_requests<br>WHERE<br>    request_id = :request_id;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd0d Get Full Request + Program Info<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    r.request_id,<br>    r.phase_code,<br>    r.status_code,<br>    p.concurrent_program_name,<br>    p.user_concurrent_program_name<br>FROM<br>    fnd_concurrent_requests r,<br>    fnd_concurrent_programs_tl p<br>WHERE<br>    r.concurrent_program_id = p.concurrent_program_id<br>AND p.language = 'US'<br>AND r.request_id = :request_id;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd0d Find Log and Output File Names<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    logfile_name,<br>    outfile_name<br>FROM<br>    fnd_concurrent_requests<br>WHERE<br>    request_id = :request_id;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd0d Find Responsibility and Menu<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    fr.responsibility_name,<br>    fm.menu_name<br>FROM<br>    fnd_responsibility_vl fr,<br>    fnd_menus fm<br>WHERE<br>    fr.menu_id = fm.menu_id;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd0d Trace User Access (Which Responsibility User Has)<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    fu.user_name,<br>    fr.responsibility_name<br>FROM<br>    fnd_user fu,<br>    fnd_user_resp_groups_direct furg,<br>    fnd_responsibility_vl fr<br>WHERE<br>    fu.user_id = furg.user_id<br>AND furg.responsibility_id = fr.responsibility_id<br>AND fu.user_name = :user_name;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd0d Find Concurrent Requests by User<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    request_id,<br>    phase_code,<br>    status_code,<br>    requested_start_date<br>FROM<br>    fnd_concurrent_requests<br>WHERE<br>    requested_by = (<br>        SELECT user_id<br>        FROM fnd_user<br>        WHERE user_name = :user_name<br>    )<br>ORDER BY request_id DESC;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">\ud83d\udd0d Check Parameters Passed to Program<\/h5>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    argument_text<br>FROM<br>    fnd_concurrent_requests<br>WHERE<br>    request_id = :request_id;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Real Debugging Workflow (What I Actually Do)<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open concurrent request<\/li>\n\n\n\n<li>Check <strong>log file first<\/strong><\/li>\n\n\n\n<li>Search for:\n<ul class=\"wp-block-list\">\n<li>ORA-<\/li>\n\n\n\n<li>ERROR<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Add <code>FND_FILE<\/code> logs if needed<\/li>\n\n\n\n<li>Run SQL queries to inspect data<\/li>\n\n\n\n<li>Enable trace if issue is unclear<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Common Mistakes to Avoid<\/h5>\n\n\n\n<p>\u274c Not checking log file first<br>\u274c Printing debug info to OUTPUT instead of LOG<br>\u274c Ignoring parameter values<br>\u274c Not handling exceptions<br>\u274c Assuming data exists<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Final Thoughts<\/h4>\n\n\n\n<p>Debugging concurrent programs is a skill that improves fast with practice.<\/p>\n\n\n\n<p>Once you combine:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Log file reading<\/li>\n\n\n\n<li>Proper <code>FND_FILE<\/code> usage<\/li>\n\n\n\n<li>SQL tracing<\/li>\n\n\n\n<li>Handy queries<\/li>\n<\/ul>\n\n\n\n<p>You move from guessing \u2192 to <strong>systematic debugging<\/strong><\/p>\n\n\n\n<p>And that\u2019s when things become much easier.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Logs, Output, Common Failures, SQL Tracing + Must-Know Queries<\/p>\n","protected":false},"author":1,"featured_media":929,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":4,"footnotes":""},"categories":[2,18],"tags":[19,15],"class_list":["post-927","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-article","category-orace-e-business-suite","tag-e-business-suite","tag-oracle"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/posts\/927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/comments?post=927"}],"version-history":[{"count":0,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/posts\/927\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/media\/929"}],"wp:attachment":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/media?parent=927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/categories?post=927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/tags?post=927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}