<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: David Jiang</title>
    <description>The latest articles on DEV Community by David Jiang (@david_jiang_9686f6cf0cfb7).</description>
    <link>https://dev.to/david_jiang_9686f6cf0cfb7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3932427%2Fc3b712e9-3aac-48c3-a997-83a6ff79b0ea.jpg</url>
      <title>DEV Community: David Jiang</title>
      <link>https://dev.to/david_jiang_9686f6cf0cfb7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/david_jiang_9686f6cf0cfb7"/>
    <language>en</language>
    <item>
      <title>Oracle Fusion vs EBS: 7 SQL Patterns Every BIP Report Developer Needs</title>
      <dc:creator>David Jiang</dc:creator>
      <pubDate>Fri, 15 May 2026 06:05:21 +0000</pubDate>
      <link>https://dev.to/david_jiang_9686f6cf0cfb7/oracle-fusion-vs-ebs-7-sql-patterns-every-bip-report-developer-needs-181b</link>
      <guid>https://dev.to/david_jiang_9686f6cf0cfb7/oracle-fusion-vs-ebs-7-sql-patterns-every-bip-report-developer-needs-181b</guid>
      <description>&lt;p&gt;If you've spent any time writing BIP (or OTBI) reports against Oracle Fusion Procurement Cloud, you've probably hit a wall that didn't exist back on EBS: half the columns you "remember" don't exist anymore, and the display names you actually want to show live on a &lt;em&gt;different&lt;/em&gt; table than the ID you're joining on.&lt;/p&gt;

&lt;p&gt;The result is a familiar loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write the SQL the way you'd have written it in EBS&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ORA-00904: invalid identifier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Hunt through &lt;code&gt;docs.oracle.com/en/cloud/saas/procurement/25d/oedmp/&lt;/code&gt; for the right column&lt;/li&gt;
&lt;li&gt;Find a view that has the column the base table doesn't&lt;/li&gt;
&lt;li&gt;Repeat for the next field&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Multiply by 30 columns in a typical report. That's 30 minutes to 2 hours, &lt;strong&gt;per report&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post is the cheat sheet I wish I'd had on day one — the 7 ID → Display join patterns that cover ~80% of Procurement BIP report needs, written in traditional Oracle WHERE-clause style (because when you're debugging 15-table joins, ANSI JOIN syntax fragments your relationship map).&lt;/p&gt;




&lt;h2&gt;
  
  
  A note on style: why scalar subqueries
&lt;/h2&gt;

&lt;p&gt;Each of these patterns is a &lt;strong&gt;scalar subquery in the SELECT list&lt;/strong&gt;, not a direct join in the FROM/WHERE clause. Two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No Fan Trap risk.&lt;/strong&gt; A direct join to a one-to-many table can multiply your row count silently. The scalar subquery + &lt;code&gt;ROWNUM = 1&lt;/code&gt; guarantees exactly one display value per source row, no matter what the lookup table looks like.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The driving table stays clean.&lt;/strong&gt; Your FROM clause stays as the inventory of "real" tables; the lookups stay where they're used.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Oracle's optimizer handles scalar subqueries efficiently when the lookup column has a PK index (every one of these does). For &amp;gt;500K-row reports, profile both — but for typical BIP needs, the scalar form is the safer default.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Supplier Name — from &lt;code&gt;VENDOR_ID&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;psv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor_name&lt;/span&gt;
 &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;poz_suppliers_v&lt;/span&gt;             &lt;span class="n"&gt;psv&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;psv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor_id&lt;/span&gt;               &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor_id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="nv"&gt;"Supplier"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The trap:&lt;/strong&gt; &lt;code&gt;POZ_SUPPLIERS&lt;/code&gt; (the &lt;em&gt;base table&lt;/em&gt;) does not have a &lt;code&gt;VENDOR_NAME&lt;/code&gt; column. The name lives on &lt;code&gt;HZ_PARTIES.PARTY_NAME&lt;/code&gt; and is exposed via the view &lt;code&gt;POZ_SUPPLIERS_V&lt;/code&gt;. Always use the view for names; use the base table only for flags like &lt;code&gt;ENABLED_FLAG&lt;/code&gt; that the view may not surface.&lt;/p&gt;

&lt;p&gt;If you're coming from EBS: forget &lt;code&gt;AP_SUPPLIERS&lt;/code&gt; and &lt;code&gt;PO_VENDORS&lt;/code&gt;. Neither exists in Fusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Buyer / Person Name — from &lt;code&gt;PERSON_ID&lt;/code&gt; or &lt;code&gt;AGENT_ID&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;
 &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;per_person_names_f&lt;/span&gt;          &lt;span class="n"&gt;pn&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;person_id&lt;/span&gt;                &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name_type&lt;/span&gt;                &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GLOBAL'&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;SYSDATE&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;effective_start_date&lt;/span&gt;
                    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;effective_end_date&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="nv"&gt;"Buyer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The trap:&lt;/strong&gt; EBS used &lt;code&gt;PER_ALL_PEOPLE_F.FULL_NAME&lt;/code&gt;. Fusion uses &lt;code&gt;PER_PERSON_NAMES_F&lt;/code&gt; (note the &lt;code&gt;_NAMES_&lt;/code&gt;). And because the table is date-effective with multiple &lt;code&gt;NAME_TYPE&lt;/code&gt; rows per person, you need both the &lt;code&gt;NAME_TYPE = 'GLOBAL'&lt;/code&gt; filter and the SYSDATE BETWEEN clause to get a single current name.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Item Number — from &lt;code&gt;ITEM_ID&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item_number&lt;/span&gt;
 &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;egp_system_items_b&lt;/span&gt;          &lt;span class="n"&gt;item&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inventory_item_id&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="nv"&gt;"Item Number"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The trap:&lt;/strong&gt; &lt;code&gt;PO_LINES_ALL.ITEM_NUMBER&lt;/code&gt; doesn't exist. Only &lt;code&gt;ITEM_ID&lt;/code&gt; does. And if you remember &lt;code&gt;MTL_SYSTEM_ITEMS_B&lt;/code&gt; from EBS — that's gone. Fusion uses &lt;code&gt;EGP_SYSTEM_ITEMS_B&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For some contexts (like Sourcing — &lt;code&gt;PON_AUCTION_ITEM_PRICES_ALL&lt;/code&gt;) you'll also need the &lt;code&gt;INV_ORG_ID&lt;/code&gt; for the item join, because items are organization-scoped.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Category Name — from &lt;code&gt;CATEGORY_ID&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;cat_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_name&lt;/span&gt;
 &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;egp_categories_tl&lt;/span&gt;           &lt;span class="n"&gt;cat_tl&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;cat_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;cat_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;language&lt;/span&gt;             &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;USERENV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'LANG'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="nv"&gt;"Category"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The trap:&lt;/strong&gt; The display name lives on the &lt;code&gt;_TL&lt;/code&gt; (translation) table. Always filter by &lt;code&gt;LANGUAGE = USERENV('LANG')&lt;/code&gt; so users get their localized labels. If you forget the filter, you get N copies of every row (one per language).&lt;/p&gt;




&lt;h2&gt;
  
  
  5. UOM Display — from &lt;code&gt;UOM_CODE&lt;/code&gt; (the B → TL pattern)
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;the&lt;/strong&gt; trap that catches everyone. The UOM display name doesn't live on the table you'd expect, and the &lt;code&gt;_TL&lt;/code&gt; table doesn't have the code you'd join on. You have to go through the &lt;code&gt;_B&lt;/code&gt; table first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;uom_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_of_measure&lt;/span&gt;
 &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;inv_units_of_measure_b&lt;/span&gt;      &lt;span class="n"&gt;uom_b&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;inv_units_of_measure_tl&lt;/span&gt;     &lt;span class="n"&gt;uom_tl&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;uom_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uom_code&lt;/span&gt;              &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uom_code&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;uom_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_of_measure_id&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uom_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_of_measure_id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;uom_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;language&lt;/span&gt;             &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;USERENV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'LANG'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="nv"&gt;"UOM"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why the two-step? &lt;code&gt;UOM_CODE&lt;/code&gt; (like "Ea", "Kg", "Box") lives on &lt;code&gt;INV_UNITS_OF_MEASURE_B&lt;/code&gt;. The display string (like "Kilogram", "Each") lives on &lt;code&gt;INV_UNITS_OF_MEASURE_TL&lt;/code&gt;. The two are joined by &lt;code&gt;UNIT_OF_MEASURE_ID&lt;/code&gt;. The &lt;code&gt;_TL&lt;/code&gt; table does &lt;strong&gt;not&lt;/strong&gt; have &lt;code&gt;UOM_CODE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Common failure attempts I've personally written:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;paip.unit_of_measure&lt;/code&gt; → ORA-00904 (no such column)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;paip.uom&lt;/code&gt; → ORA-00904 (no such column)&lt;/li&gt;
&lt;li&gt;Join &lt;code&gt;paip.uom_code = uom_tl.uom_code&lt;/code&gt; → ORA-00904 (TL has no UOM_CODE)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The B → TL chain is the only thing that works.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. BU Name — from &lt;code&gt;PRC_BU_ID&lt;/code&gt; or &lt;code&gt;REQ_BU_ID&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;bu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bu_name&lt;/span&gt;
 &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;fun_all_business_units_v&lt;/span&gt;    &lt;span class="n"&gt;bu&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;bu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bu_id&lt;/span&gt;                    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prc_bu_id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="nv"&gt;"Proc BU"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Procurement BIP reports almost always need to filter or display the BU. &lt;code&gt;FUN_ALL_BUSINESS_UNITS_V&lt;/code&gt; is your friend. The view exposes &lt;code&gt;BU_NAME&lt;/code&gt;, &lt;code&gt;STATUS&lt;/code&gt;, and &lt;code&gt;PRIMARY_LEDGER_ID&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Inventory Organization Name — from &lt;code&gt;ORGANIZATION_ID&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;iod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;organization_name&lt;/span&gt;
 &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;inv_organization_definitions_v&lt;/span&gt;   &lt;span class="n"&gt;iod&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;iod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;organization_id&lt;/span&gt;              &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;organization_id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;         &lt;span class="nv"&gt;"Inv Org"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;_V&lt;/code&gt; view has the display name and is one of the rare places where the view-only data lines up neatly with the base table's PK. Use it freely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Putting it all together
&lt;/h2&gt;

&lt;p&gt;Here's a 12-line snippet that uses 5 of the 7 patterns to produce a "PO Line with everything humans want to see" query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                                          &lt;span class="n"&gt;TOTAL_COUNT&lt;/span&gt;       &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;pha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;segment1&lt;/span&gt;                                             &lt;span class="nv"&gt;"PO Number"&lt;/span&gt;       &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line_num&lt;/span&gt;                                             &lt;span class="nv"&gt;"Line"&lt;/span&gt;            &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item_number&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;egp_system_items_b&lt;/span&gt;          &lt;span class="n"&gt;item&lt;/span&gt;
        &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inventory_item_id&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;
        &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="nv"&gt;"Item Number"&lt;/span&gt;     &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item_description&lt;/span&gt;                                     &lt;span class="nv"&gt;"Description"&lt;/span&gt;     &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;cat_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_name&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;egp_categories_tl&lt;/span&gt;           &lt;span class="n"&gt;cat_tl&lt;/span&gt;
        &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;cat_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;
        &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;cat_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;language&lt;/span&gt;             &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;USERENV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'LANG'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="nv"&gt;"Category"&lt;/span&gt;        &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;uom_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_of_measure&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;inv_units_of_measure_b&lt;/span&gt;      &lt;span class="n"&gt;uom_b&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="n"&gt;inv_units_of_measure_tl&lt;/span&gt;     &lt;span class="n"&gt;uom_tl&lt;/span&gt;
        &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;uom_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uom_code&lt;/span&gt;              &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uom_code&lt;/span&gt;
        &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;uom_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_of_measure_id&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uom_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_of_measure_id&lt;/span&gt;
        &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;uom_tl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;language&lt;/span&gt;             &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;USERENV&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'LANG'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;ROWNUM&lt;/span&gt;                      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="nv"&gt;"UOM"&lt;/span&gt;             &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;                                             &lt;span class="nv"&gt;"Qty"&lt;/span&gt;             &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unit_price&lt;/span&gt;                                           &lt;span class="nv"&gt;"Unit Price"&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;
       &lt;span class="n"&gt;po_headers_all&lt;/span&gt;                  &lt;span class="n"&gt;pha&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;po_lines_all&lt;/span&gt;                    &lt;span class="n"&gt;pla&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                                &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;pha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;po_header_id&lt;/span&gt;               &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;po_header_id&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;
       &lt;span class="n"&gt;pha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;segment1&lt;/span&gt;                                             &lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;pla&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line_num&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;COUNT(*) OVER()&lt;/code&gt; as the first column — a BIP idiom that lets the front-end report show "Total Rows: 1,234" without a second query&lt;/li&gt;
&lt;li&gt;Vertical alignment of aliases, equal signs, and column names — your future self thanks you when debugging&lt;/li&gt;
&lt;li&gt;Traditional Oracle WHERE-clause joins instead of ANSI — the WHERE clause becomes the ERD diagram&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What didn't fit in this post
&lt;/h2&gt;

&lt;p&gt;The other recipes I reach for regularly — Active BPAs by BU, Requisitions waiting in the PR Pool (EXT029-style), BPAs Expiring Soon, Supplier Master Search, Sourcing Negotiation Template inventory, and the ASE security tables (&lt;code&gt;FUSION.ASE_USER_B&lt;/code&gt; etc.) for the dreaded "this user can't approve a PR" debugging session — would each need a similar deep dive.&lt;/p&gt;

&lt;p&gt;I packaged the lot, plus a 30-row EBS-to-Fusion column mistake reference and a pre-flight checklist, into a PDF Cookbook for anyone who'd rather paste than hunt:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://davidqian.gumroad.com/l/acpoc" rel="noopener noreferrer"&gt;Oracle Fusion Procurement BIP SQL Cookbook — v0.1 Foundations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Launch week price USD 19. v0.2 (PR-to-PO traceability, Receipts, Catalog hierarchy, DFF extraction, Approval decomposition) ships free to v0.1 buyers.&lt;/p&gt;

&lt;p&gt;If you've hit a different ORA-00904 that bit you on Fusion, drop it in the comments — I'll add the fix to v0.2's appendix.&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>sql</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
