<?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: Naveen</title>
    <description>The latest articles on DEV Community by Naveen (@naveen6735).</description>
    <link>https://dev.to/naveen6735</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908654%2F52352e5f-3974-424f-add0-f9abd28ad5eb.jpeg</url>
      <title>DEV Community: Naveen</title>
      <link>https://dev.to/naveen6735</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naveen6735"/>
    <language>en</language>
    <item>
      <title>AI-Powered BI Publisher Report Retrieval in Oracle Fusion Agent AI 26C</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Wed, 12 Aug 2026 08:37:41 +0000</pubDate>
      <link>https://dev.to/naveen6735/ai-powered-bi-publisher-report-retrieval-in-oracle-fusion-agent-ai-26c-12jp</link>
      <guid>https://dev.to/naveen6735/ai-powered-bi-publisher-report-retrieval-in-oracle-fusion-agent-ai-26c-12jp</guid>
      <description>&lt;p&gt;Over the last few days, I designed and experimented with an exciting use case using Oracle Fusion Agent AI Studio 26C, combining External REST Tools, Agent Calls and Code Nodes to bring enterprise reporting directly into a conversational AI experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Vision
&lt;/h2&gt;

&lt;p&gt;The goal was to enable users to ask business questions in natural language and have Oracle Fusion Agent AI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Invoke a BI Publisher Report on demand&lt;/li&gt;
&lt;li&gt; Retrieve report output via REST APIs&lt;/li&gt;
&lt;li&gt; Process the response dynamically&lt;/li&gt;
&lt;li&gt; Convert report data into a readable format&lt;/li&gt;
&lt;li&gt; Present business insights directly within the chat conversation&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example Queries
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me the latest supplier invoices."&lt;br&gt;
or &lt;br&gt;
"Display open purchase orders for my business unit."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Solution Architecture
&lt;/h2&gt;

&lt;p&gt;To achieve conversational access to Oracle Fusion reports&lt;br&gt;
I designed an architecture that combines Oracle Fusion Agent AI, External REST Tools, BI Publisher Reports, and Agent Calls to deliver report information through a natural language interface.&lt;/p&gt;


  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78qex7uuva3z6uljdcbb.png" alt="A screenshot showing the dashboard interface of Oracle Fusion Agent AI Studio" width="800" height="830"&gt;Solution Architecture: Oracle Fusion Agent AI Studio interface overview
  


&lt;blockquote&gt;
&lt;p&gt;The Below is Tested &amp;amp; Designed Components in Studio&lt;/p&gt;
&lt;/blockquote&gt;


  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnpfb5lvv4045ajpt4pb1.png" alt="A system architecture diagram showing Oracle Fusion Agent AI Studio 26C communicating with BI Publisher via REST APIs" width="800" height="310"&gt;Figure 1: Real Oracle Fusion Agent AI Studio interface overview

  



  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpnudiz1ut3zcm8rmm6kz.png" alt="Agent which Is capable of the Decode ReportBytes &amp;amp; return results" width="800" height="373"&gt;Figure 2: Agent which Is capable of the Decode ReportBytes &amp;amp; return results 
 


&lt;p&gt;&lt;/p&gt;
  &lt;strong&gt;Needed Prompt&lt;/strong&gt;🤔
  &lt;p&gt;The below prompts need to be added in the agent.&lt;/p&gt;
&lt;h2&gt;
  
  
  Agent Role:
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RESPONSE BEHAVIOR

Tone and voice
- Be professional, concise, and neutral — this agent surfaces HR/personal data, not casual conversation.
- Do not editorialize about the person's data (no commentary on tenure, status, personal details, etc.) — present facts only.

Structure of responses
- When data is successfully retrieved: lead with the markdown table, then a one-line summary (row count, person number). No preamble like "Sure, here's the data you asked for."
- When no data is found or the call fails: state plainly what happened and what the user can do next (e.g., re-check the person number, try again shortly). Never show an empty table — say there's no data instead.
- When the person number is missing or ambiguous: ask exactly one direct clarifying question before calling the tool. Do not guess a person number or proceed on an assumption.

Error handling tone
- Never expose internal technical details in a response: no node names, decode statuses, stack traces, SOAP fault XML, or connection identifiers.
- Translate technical failures into plain, actionable language (e.g., "I wasn't able to retrieve that report right now — please try again, or confirm the person number is correct.").
- If the same failure persists after a retry, say so plainly rather than repeating the same generic error silently.

Data handling and privacy
- Only surface the fields relevant to what the user actually asked — do not dump the full record (including sensitive fields like date of birth, marital status, nationality, religion, home address) unless the user specifically asks for that information.
- Never restate a person's sensitive personal fields back for confirmation purposes (e.g., don't echo an address or DOB just to "confirm" a lookup) — confirm using the person number only.
- Do not retain, summarize, or reference a previously retrieved person's data in later turns unless the user re-asks about that same person in the current conversation.

Scope discipline
- Only answer questions this tool can actually address (person lookups by person number). For unrelated requests, state plainly that this assistant is scoped to person report lookups.
- Do not speculate about data the tool didn't return, and do not fill in gaps with assumptions.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Prompt:
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a helpful assistant with access to the Invoke_BIP_report_NJ tool, which retrieves person details from the XX_PEOPLE_INFO Oracle BI Publisher report.

When a user asks about a person's details or requests information for a specific person number, follow these steps:
1. Extract the Person Number from the user input and call the Invoke_BIP_report_NJ tool with the user-provided value as the Person_Number input parameter.
2. The tool returns reportBytes as base64-encoded content — decode it first, then parse the decoded text as CSV.
3. Use the first row of the decoded CSV as the column headers, and every subsequent row as a data record.
4. Present the data in a clean, well-structured markdown table with appropriate column headers.
5. If the tool call fails, returns no reportBytes, or the person number is not found, inform the user clearly rather than showing an empty or broken table.

Always confirm the person number with the user before calling the tool if it is ambiguous or missing.

When displaying results:
- Format all data as a readable markdown table.
- Use the first row of the decoded CSV as the column headers.
- Align columns cleanly.
- If there are many rows, summarize the total count at the end (e.g., "Showing 1 record for Person Number 1").

This report contains personal information (contact details, date of birth, marital status, nationality, religion). Only display the fields relevant to the user's question rather than the entire record by default, and do not share this data with anyone other than the requesting user.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create External Tool
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddm5e5gjxrb84xcg2ajq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fddm5e5gjxrb84xcg2ajq.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Request Body
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;soap:Envelope&lt;/span&gt; &lt;span class="na"&gt;xmlns:soap=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2003/05/soap-envelope"&lt;/span&gt; &lt;span class="na"&gt;xmlns:pub=&lt;/span&gt;&lt;span class="s"&gt;"http://xmlns.oracle.com/oxp/service/PublicReportService"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;soap:Header/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;soap:Body&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;pub:runReport&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;pub:reportRequest&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;pub:attributeFormat&amp;gt;&lt;/span&gt;csv&lt;span class="nt"&gt;&amp;lt;/pub:attributeFormat&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;pub:parameterNameValues&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;pub:item&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;pub:name&amp;gt;&lt;/span&gt;P_PERSON_NUM&lt;span class="nt"&gt;&amp;lt;/pub:name&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;pub:values&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;pub:item&amp;gt;&lt;/span&gt;{Person_Number}&lt;span class="nt"&gt;&amp;lt;/pub:item&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;/pub:values&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;/pub:item&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/pub:parameterNameValues&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;pub:reportAbsolutePath&amp;gt;&lt;/span&gt;/Custom/o_NJ/XX_PEOPLE_INFO.xdo&lt;span class="nt"&gt;&amp;lt;/pub:reportAbsolutePath&amp;gt;&lt;/span&gt;          
  &lt;span class="nt"&gt;&amp;lt;pub:sizeOfDataChunkDownload&amp;gt;&lt;/span&gt;-1&lt;span class="nt"&gt;&amp;lt;/pub:sizeOfDataChunkDownload&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;/pub:reportRequest&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/pub:runReport&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/soap:Body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/soap:Envelope&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feoy4rxtlmx4o7i5j5g8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feoy4rxtlmx4o7i5j5g8c.png" alt=" " width="799" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge Encountered
&lt;/h2&gt;

&lt;p&gt;While I successfully extracted the Base64 encoded report data, decoding the content and rendering the final business data directly within the Agent conversation proved more challenging than expected.&lt;/p&gt;

&lt;p&gt;The platform behavior around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Binary report handling&lt;/li&gt;
&lt;li&gt;Base64 decoding&lt;/li&gt;
&lt;li&gt;Runtime transformation&lt;/li&gt;
&lt;li&gt;Conversational rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;required deeper exploration than initially anticipated.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>One integration, N partners — routed at runtime by dynamic connections</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Sun, 02 Aug 2026 06:39:58 +0000</pubDate>
      <link>https://dev.to/naveen6735/one-integration-n-partners-routed-at-runtime-by-dynamic-connections-2pe9</link>
      <guid>https://dev.to/naveen6735/one-integration-n-partners-routed-at-runtime-by-dynamic-connections-2pe9</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Let's DO it Dynamic Connections in OIC &amp;amp; Build Multi-tenant partner router Project&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;⬇️ click on it&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/naveen-6735/collaborative-notes-web/blob/main/scripts/partner-router-infographic_v1.png" rel="noopener noreferrer"&gt;The core idea&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Ten partners used to mean ten integrations same logic, copy-pasted, diverging quietly over time. &lt;br&gt;
This build collapses them into one: a single orchestration that decides, per request, which connection to call and which path to call it on, by reading one lookup table.&lt;/p&gt;

&lt;p&gt;This works today for &lt;strong&gt;FTP and REST adapters&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How the resolution mechanism actually works
&lt;/h2&gt;

&lt;p&gt;Every adapter invoke activity that supports this has an &lt;strong&gt;Enable Dynamic Connection&lt;/strong&gt; checkbox in its configuration wizard. Once checked, a new field appears: &lt;code&gt;Dynamic Connection ID&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At runtime, OIC evaluates whatever expression you put there and uses &lt;em&gt;that value&lt;/em&gt; to pick which saved connection to actually use for this specific invocation overriding the design-time default.&lt;/p&gt;

&lt;p&gt;Two ways to populate that field:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Direct XPath&lt;/strong&gt; drag a field straight from the incoming payload (e.g., a &lt;code&gt;partnerId&lt;/code&gt; element) if the connection ID is literally present in your data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;*&lt;em&gt;Lookup table (DVM) *&lt;/em&gt; resolve a business key (partner ID, tenant ID, environment name) to a connection ID via a lookup table, using the &lt;code&gt;lookupValue()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;lookupValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"PartnerRoutingTable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"PartnerId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;partnerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"ConnectionId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  The project: a multi-tenant partner router
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo9brybvmu04dmnnifgkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo9brybvmu04dmnnifgkz.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4ab1x22dxv83j08vw30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4ab1x22dxv83j08vw30.png" alt="What happens per request, at runtime" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make this concrete, I built and tested an integration that takes an inbound order and routes it to one of three partners — two over FTP, one over REST — using a single lookup table to decide both the connection &lt;em&gt;and&lt;/em&gt; the destination path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connections:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F37u0ronit8cppqyaq0rs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F37u0ronit8cppqyaq0rs.png" alt=" " width="799" height="260"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The routing table(Lookup)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PartnerId&lt;/th&gt;
&lt;th&gt;ConnectionId&lt;/th&gt;
&lt;th&gt;TargetPath&lt;/th&gt;
&lt;th&gt;AdapterType&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PARTNER_A&lt;/td&gt;
&lt;td&gt;FTP_PartnerA_Conn&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;FTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PARTNER_B&lt;/td&gt;
&lt;td&gt;REST_PartnerB_Conn&lt;/td&gt;
&lt;td&gt;/orders&lt;/td&gt;
&lt;td&gt;REST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PARTNER_C&lt;/td&gt;
&lt;td&gt;FTP_PartnerC_Conn&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;FTP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkwjj860tpu02xv3cggno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkwjj860tpu02xv3cggno.png" alt="OIC Lookup" width="798" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This table is the &lt;em&gt;only&lt;/em&gt; partner-specific knowledge in the whole system. Everything else is generic.&lt;/p&gt;
&lt;h3&gt;
  
  
  The flow
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger (REST, receives order + partnerId)
        │
        ▼
Assign: lookupValue(partnerId) → adapterType, connectionId, targetPath
        │
        ▼
Switch on adapterType
   ├── "FTP"  → Map → Invoke (dynamic connection) → Map
   ├── "REST" → Map → Invoke (dynamic connection) → Map
   └── otherwise → fault: unknown partner
        │
        ▼
   Return response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1hm4amzbjocln7gwiin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi1hm4amzbjocln7gwiin.png" alt="Entire OIC Flow" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;TEST Results:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let Pass   "partnerId": "PARTNER_C" in request payload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As per partnerId it invoked the C FTP.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7myc88b3ou82pbxr1w8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7myc88b3ou82pbxr1w8.png" alt=" " width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let Pass   "partnerId": "PARTNER_B" in request payload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As expected, it went to REST with same dynamic connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frao42407qcjuoxkkvh1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frao42407qcjuoxkkvh1i.png" alt=" " width="799" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requets Payload:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalAmount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;99.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ORD-10023"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"partnerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PARTNER_B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orderDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"unitPrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;19.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sample Widget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SKU-1001"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test Customer"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lessons from actually building and testing this
&lt;/h2&gt;

&lt;p&gt;The reference docs don't spell out, discovered by hitting them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ConnectionId&lt;/code&gt; in your lookup must match the connection's name exactly.&lt;/strong&gt; It's resolved as a literal string at runtime, not validated against existing connections at design time — a typo here fails silently in production, not on save.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where else this pattern applies
&lt;/h2&gt;

&lt;p&gt;The router doesn't actually know it's routing "partners" — it only knows "resolve a lookup row, then pick a connection and a path." Swap what the row contains and the same skeleton solves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Credential rotation&lt;/strong&gt; — one lookup key, two connections (old/new creds); flip the row to cut over instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment promotion&lt;/strong&gt; — key the lookup by environment instead of partner; promote dev → test → prod by editing a row, not maintaining three integrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DR/failover&lt;/strong&gt; — a health-check flag in the lookup redirects traffic to a standby endpoint the moment it's toggled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiered routing&lt;/strong&gt; — premium accounts resolve to a dedicated connection, everyone else shares one&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>oic</category>
      <category>oracle</category>
    </item>
    <item>
      <title>Building a Real-Time Collaborative Notes App on Oracle Backend with Firebase APIs</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Fri, 31 Jul 2026 09:41:48 +0000</pubDate>
      <link>https://dev.to/naveen6735/building-a-real-time-collaborative-notes-app-on-oracle-backend-with-firebase-apis-3f59</link>
      <guid>https://dev.to/naveen6735/building-a-real-time-collaborative-notes-app-on-oracle-backend-with-firebase-apis-3f59</guid>
      <description>&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; Naveen Jejji&lt;br&gt;
&lt;strong&gt;Published:&lt;/strong&gt; July 31, 2026&lt;/p&gt;
&lt;h2&gt;
  
  
  The project
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Collaborative Notes&lt;/strong&gt; is a small web app where signed-in users share a single live notebook: anyone can create a note, anyone signed in can edit anyone else's note, and edits appear for every other open tab or user &lt;strong&gt;instantly&lt;/strong&gt; no refresh button, no polling. Notes can carry an image or PDF attachment with an inline preview. Only the original creator of a note can delete it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx8cymossfwpmkrjg7f7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx8cymossfwpmkrjg7f7v.png" alt=" " width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a deliberately "boring" app on the surface notes, not rocket science chosen specifically because real-time multi-user collaboration, file uploads and ownership-based permissions together are a genuine stress test for a backend, not a toy demo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/naveen-6735/collaborative-notes-web" rel="noopener noreferrer"&gt;Repo (full source)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Oracle technology behind it
&lt;/h2&gt;

&lt;p&gt;The backend is &lt;strong&gt;Oracle Backend with Firebase APIs&lt;/strong&gt; a free feature of Oracle REST Data Services (ORDS) that lets you write against Oracle AI Database using the same open-source Firebase client SDKs developers already know: authentication, a Firestore-shaped document API, object storage, and declarative security rules. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapevlb7a4dfxx0re29y6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapevlb7a4dfxx0re29y6.png" alt=" " width="799" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's no separate backend service to stand up and no additional license — if you're already running ORDS, this rides on top of it.&lt;/p&gt;

&lt;p&gt;That matters for this specific app in three concrete ways.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Real-time sync via &lt;code&gt;onSnapshot&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The entire "collaborative" feel of the app comes from a single live query listener instead of a fetch-on-demand call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;startNotesListener&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;notesQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;notes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;updatedAt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="nf"&gt;onSnapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;notesQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
      &lt;span class="nf"&gt;renderNotes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;renderStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every create, edit, and delete from any user, any tab refires this callback automatically. &lt;br&gt;
The UI just re-renders from whatever the current snapshot is. There's no manual "refresh" logic anywhere in the app for the notes list.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. File uploads with inline preview
&lt;/h3&gt;

&lt;p&gt;Attaching an image or PDF to a note uses the same Storage API shape as Firebase Storage upload, then resolve a download URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;uploadAttachment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noteId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fileRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`notes/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;noteId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;uploadBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fileRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/octet-stream&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getDownloadURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fileRef&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;attachmentURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;attachmentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;attachmentName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app then renders an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; thumbnail for images or an inline &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; preview for PDFs, so attachments are visible in the shared list without leaving the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A collaborative permission model, enforced server-side
&lt;/h3&gt;

&lt;p&gt;This is the detail I think is most worth highlighting. "Collaborative" here specifically means: &lt;strong&gt;any signed-in user can edit any note, but only the creator can delete it.&lt;/strong&gt; That's not a client-side convention I'm trusting the UI to respect — it's a security rule evaluated on the backend, independent of the JavaScript running in someone's browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt;: allowed if the signed-in user is the one being set as the note's owner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update&lt;/strong&gt;: allowed for &lt;em&gt;any&lt;/em&gt; signed-in user (this is what makes it collaborative rather than single-owner)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delete&lt;/strong&gt;: allowed only if the requesting user's ID matches the note's owner field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A user can't just edit the DOM or replay a request to bypass this the rule lives next to the data, not in the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What users actually get out of this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No merge conflicts to think about.&lt;/strong&gt; Because everyone sees the current state live, the odds of two people editing stale versions of the same note drop sharply compared to a "refresh to see changes" model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real collaboration, not just shared storage.&lt;/strong&gt; Anyone can pick up and extend anyone else's note closer to a shared whiteboard than a personal to-do list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attachments that are actually usable&lt;/strong&gt;, not just links you have to download and open separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A permission model that's actually enforced&lt;/strong&gt;, not just implied by what buttons happen to be visible in the UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero additional backend cost or infrastructure&lt;/strong&gt; for teams already running Oracle Database + ORDS this is additive, not a new system to operate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it's deployed
&lt;/h2&gt;

&lt;p&gt;The backend runs as two containers (Oracle Database Free 26ai + ORDS) via Podman, with the frontend as a plain static site (HTML/CSS/vanilla JS with ES module import maps no build step, no framework). &lt;/p&gt;

&lt;p&gt;The static UI is also published via GitHub Pages for browsing the interface live data operations require the Oracle Backend with Firebase APIs instance to be reachable, same as any app that talks to its own backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it / read the code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/naveen-6735/collaborative-notes-web" rel="noopener noreferrer"&gt;https://github.com/naveen-6735/collaborative-notes-web&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The workshop this environment is built on: &lt;a href="https://livelabs.oracle.com/ords/r/dbpm/livelabs/view-workshop?wid=4404" rel="noopener noreferrer"&gt;RecipeShare — Oracle LiveLabs (Web)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oracle.com/database/technologies/appdev/oracle-backend-for-firebase/" rel="noopener noreferrer"&gt;Oracle Backend with Firebase APIs — landing page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.oracle.com/database/introducing-oracle-backend-for-firebase-build-mobile-and-web-apps-on-oracle-ai-database" rel="noopener noreferrer"&gt;Announcement post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en/database/oracle/backend-for-firebase/26.1/index.html" rel="noopener noreferrer"&gt;Developer docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build something with this toolkit, I'd genuinely like to hear about it.&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>firebase</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using PL/SQL in Oracle Fusion BI Publisher Reports for Dynamic Data Filtering</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Sun, 19 Jul 2026 07:14:19 +0000</pubDate>
      <link>https://dev.to/naveen6735/using-plsql-in-oracle-fusion-bi-publisher-reports-for-dynamic-data-filtering-1dm1</link>
      <guid>https://dev.to/naveen6735/using-plsql-in-oracle-fusion-bi-publisher-reports-for-dynamic-data-filtering-1dm1</guid>
      <description>&lt;p&gt;Oracle Fusion BI Publisher supports &lt;strong&gt;PL/SQL Data Sets&lt;/strong&gt;, allowing report developers to implement business logic directly within a report. &lt;/p&gt;

&lt;p&gt;This approach is useful when report data needs to be dynamically filtered or transformed based on user input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this example, users can select a &lt;strong&gt;&lt;em&gt;Supplier Type parameter&lt;/em&gt;&lt;/strong&gt; from the following values:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SUPPLIER&lt;/li&gt;
&lt;li&gt;PUBLIC SECTOR COMPANIES&lt;/li&gt;
&lt;li&gt;INSURANCE&lt;/li&gt;
&lt;li&gt;INTERCOMPANY&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Based on the selected value, the report retrieves matching supplier records from the Fusion Procurement supplier table (POZ_SUPPLIERS_V)&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  &lt;strong&gt;Click to view the full PL/SQL Data Set code&lt;/strong&gt;
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="k"&gt;DECLARE&lt;/span&gt;

    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="c1"&gt;-- Define a REF CURSOR type.&lt;/span&gt;
    &lt;span class="c1"&gt;-- BI Publisher uses a cursor to return the final result set back to&lt;/span&gt;
    &lt;span class="c1"&gt;-- the report output.&lt;/span&gt;
    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;refcursor&lt;/span&gt; &lt;span class="kr"&gt;IS&lt;/span&gt; &lt;span class="kt"&gt;REF&lt;/span&gt; &lt;span class="k"&gt;CURSOR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="c1"&gt;-- Cursor variable that will hold the query result.&lt;/span&gt;
    &lt;span class="c1"&gt;-- BI Publisher expects the data to be returned through xdo_cursor.&lt;/span&gt;
    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="n"&gt;xdo_cursor&lt;/span&gt; &lt;span class="n"&gt;REFCURSOR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="c1"&gt;-- Variable used to store the supplier type returned by the function.&lt;/span&gt;
    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="n"&gt;l_supplier_filter&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="c1"&gt;-- Local PL/SQL Function: Supplier_type&lt;/span&gt;
    &lt;span class="c1"&gt;--&lt;/span&gt;
    &lt;span class="c1"&gt;-- Purpose:&lt;/span&gt;
    &lt;span class="c1"&gt;--   Accepts the report parameter P_VENDOR_TYPE and validates the value.&lt;/span&gt;
    &lt;span class="c1"&gt;--&lt;/span&gt;
    &lt;span class="c1"&gt;-- Allowed Values:&lt;/span&gt;
    &lt;span class="c1"&gt;--   SUPPLIER&lt;/span&gt;
    &lt;span class="c1"&gt;--   PUBLIC SECTOR COMPANIES&lt;/span&gt;
    &lt;span class="c1"&gt;--   INSURANCE&lt;/span&gt;
    &lt;span class="c1"&gt;--   INTERCOMPANY&lt;/span&gt;
    &lt;span class="c1"&gt;--&lt;/span&gt;
    &lt;span class="c1"&gt;-- Returns:&lt;/span&gt;
    &lt;span class="c1"&gt;--   The corresponding supplier type value.&lt;/span&gt;
    &lt;span class="c1"&gt;--   If no valid value is found, returns 'NA'.&lt;/span&gt;
    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;Supplier_type&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;p_in_vendor_type&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR2&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR2&lt;/span&gt;
    &lt;span class="kr"&gt;IS&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Variable to hold the function result.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="n"&gt;l_supplier_type_rtn&lt;/span&gt; &lt;span class="kt"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;BEGIN&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Check if the selected supplier type is SUPPLIER.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;p_in_vendor_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SUPPLIER&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="kr"&gt;THEN&lt;/span&gt;

            &lt;span class="n"&gt;l_supplier_type_rtn&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SUPPLIER&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Check if the selected supplier type is PUBLIC SECTOR COMPANIES.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="kr"&gt;ELSIF&lt;/span&gt; &lt;span class="n"&gt;p_in_vendor_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUBLIC SECTOR COMPANIES&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="kr"&gt;THEN&lt;/span&gt;

            &lt;span class="n"&gt;l_supplier_type_rtn&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUBLIC SECTOR COMPANIES&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Check if the selected supplier type is INSURANCE.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="kr"&gt;ELSIF&lt;/span&gt; &lt;span class="n"&gt;p_in_vendor_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INSURANCE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="kr"&gt;THEN&lt;/span&gt;

            &lt;span class="n"&gt;l_supplier_type_rtn&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INSURANCE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Check if the selected supplier type is INTERCOMPANY.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="kr"&gt;ELSIF&lt;/span&gt; &lt;span class="n"&gt;p_in_vendor_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INTERCOMPANY&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="kr"&gt;THEN&lt;/span&gt;

            &lt;span class="n"&gt;l_supplier_type_rtn&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INTERCOMPANY&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- If none of the above values match, return NA.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="kr"&gt;ELSE&lt;/span&gt;

            &lt;span class="n"&gt;l_supplier_type_rtn&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NA&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="k"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Return the validated supplier type value.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;l_supplier_type_rtn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;EXCEPTION&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Handle any unexpected errors and return NA.&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="k"&gt;OTHERS&lt;/span&gt; &lt;span class="kr"&gt;THEN&lt;/span&gt;

            &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NA&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;Supplier_type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;BEGIN&lt;/span&gt;

    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="c1"&gt;-- Pass the BI Publisher report parameter P_VENDOR_TYPE&lt;/span&gt;
    &lt;span class="c1"&gt;-- into the Supplier_type function.&lt;/span&gt;
    &lt;span class="c1"&gt;--&lt;/span&gt;
    &lt;span class="c1"&gt;-- Example Input:&lt;/span&gt;
    &lt;span class="c1"&gt;--   SUPPLIER&lt;/span&gt;
    &lt;span class="c1"&gt;--   INSURANCE&lt;/span&gt;
    &lt;span class="c1"&gt;--   PUBLIC SECTOR COMPANIES&lt;/span&gt;
    &lt;span class="c1"&gt;--   INTERCOMPANY&lt;/span&gt;
    &lt;span class="c1"&gt;--&lt;/span&gt;
    &lt;span class="c1"&gt;-- Example Output:&lt;/span&gt;
    &lt;span class="c1"&gt;--   SUPPLIER&lt;/span&gt;
    &lt;span class="c1"&gt;--   INSURANCE&lt;/span&gt;
    &lt;span class="c1"&gt;--   PUBLIC SECTOR COMPANIES&lt;/span&gt;
    &lt;span class="c1"&gt;--   INTERCOMPANY&lt;/span&gt;
    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="n"&gt;l_supplier_filter&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Supplier_type&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;P_VENDOR_TYPE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="c1"&gt;-- Open the cursor and return the result set to BI Publisher.&lt;/span&gt;
    &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;OPEN&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;xdo_cursor&lt;/span&gt; &lt;span class="kr"&gt;FOR&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Retrieve supplier information from Oracle Fusion Procurement&lt;/span&gt;
        &lt;span class="c1"&gt;-- Supplier View (POZ_SUPPLIERS_V).&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="kr"&gt;SELECT&lt;/span&gt;
               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="c1"&gt;-- Supplier Name&lt;/span&gt;
               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="n"&gt;vendor_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="c1"&gt;-- Supplier Type&lt;/span&gt;
               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="n"&gt;vendor_type_lookup_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="c1"&gt;-- Organization Type&lt;/span&gt;
               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="n"&gt;organization_type_lookup_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="c1"&gt;-- Business Relationship&lt;/span&gt;
               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="n"&gt;business_relationship&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="c1"&gt;-- Display the selected parameter value in the report output.&lt;/span&gt;
               &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
               &lt;span class="n"&gt;l_supplier_filter&lt;/span&gt; &lt;span class="n"&gt;supplier_type&lt;/span&gt;

        &lt;span class="kr"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;poz_suppliers_v&lt;/span&gt;

        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="c1"&gt;-- Filter suppliers based on the selected Vendor Type parameter.&lt;/span&gt;
        &lt;span class="c1"&gt;--&lt;/span&gt;
        &lt;span class="c1"&gt;-- Example:&lt;/span&gt;
        &lt;span class="c1"&gt;-- If P_VENDOR_TYPE = 'INSURANCE'&lt;/span&gt;
        &lt;span class="c1"&gt;-- Then the query becomes:&lt;/span&gt;
        &lt;span class="c1"&gt;--&lt;/span&gt;
        &lt;span class="c1"&gt;-- WHERE vendor_type_lookup_code = 'INSURANCE'&lt;/span&gt;
        &lt;span class="c1"&gt;----------------------------------------------------------------------------&lt;/span&gt;
        &lt;span class="kr"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;vendor_type_lookup_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l_supplier_filter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Data model in Fusion
&lt;/h2&gt;

&lt;p&gt;As below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnw2m9r7r64uhti1919ah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnw2m9r7r64uhti1919ah.png" alt=" " width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Preview the data by passing parameters value.&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzud4p3ob94ylqyfrr1w1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzud4p3ob94ylqyfrr1w1.png" alt=" " width="611" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save sample data &amp;amp; move to create a report &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyn8em49h68t0rosdqlx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyn8em49h68t0rosdqlx.png" alt=" " width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This PL/SQL-based BI Publisher Data Set demonstrates how Oracle Fusion report developers can combine report parameters, custom functions, and cursor-based queries to create dynamic reports. &lt;/p&gt;

&lt;p&gt;By processing the user-selected supplier type through a PL/SQL function and applying it to the query filter, the report becomes more flexible, maintainable, and aligned with business requirements.&lt;/p&gt;

&lt;p&gt;This technique is especially useful in Procurement reporting scenarios where supplier classifications drive reporting outcomes.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Real-Time Reporting: How to Push ATP Data to Oracle Fusion BI Publisher</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Sun, 19 Jul 2026 02:51:45 +0000</pubDate>
      <link>https://dev.to/naveen6735/real-time-reporting-how-to-push-atp-data-to-oracle-fusion-bi-publisher-1m38</link>
      <guid>https://dev.to/naveen6735/real-time-reporting-how-to-push-atp-data-to-oracle-fusion-bi-publisher-1m38</guid>
      <description>&lt;p&gt;Most Oracle Fusion implementations follow a standard pattern: transferring data from Fusion Applications into &lt;strong&gt;Oracle Autonomous Transaction Processing (ATP)&lt;/strong&gt; for analytics&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But what happens when you need to go the other way ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this project, I designed a solution for a common business pain point: fetching processed data from ATP, generating a dynamic BI Publisher report, and distributing it via &lt;strong&gt;Oracle Integration Cloud (OIC)&lt;/strong&gt; notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Business Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Organizations store massive volumes of processed data in ATP—everything from billing records to custom integration staging tables. While ATP is great for storage, business users need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Professional, formatted report templates.&lt;/li&gt;
&lt;li&gt;Automated, scheduled delivery.&lt;/li&gt;
&lt;li&gt;Rich HTML email notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our solution automates this entire flow, removing manual effort and custom scripting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The flow moves from data storage to user delivery in a seamless loop:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs107fktcb387rhl5lax7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs107fktcb387rhl5lax7.png" alt=" " width="583" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technologies Used&lt;/strong&gt;&lt;br&gt;
Oracle Technology Purpose &lt;strong&gt;Oracle ATP&lt;/strong&gt; Source Data Repository &lt;strong&gt;OIC&lt;/strong&gt; Orchestration Layer &lt;strong&gt;Fusion BI Publisher&lt;/strong&gt; Report Design &amp;amp; Execution &lt;strong&gt;SOAP Services&lt;/strong&gt; Remote Report Execution &lt;strong&gt;OCI&lt;/strong&gt; Hosting Platform&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation Steps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create Scheduled Integration in OIC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We start with a Scheduled Integration. This removes human dependency and allows for daily, weekly, or custom business intervals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0e3sjk8vf7yiuatn5yc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0e3sjk8vf7yiuatn5yc9.png" alt=" " width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Connect to ATP and Execute SQL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using the ATP Adapter, we establish a secure connection to fetch the "Active" records.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4t9znsiu2icat458ibnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4t9znsiu2icat458ibnp.png" alt=" " width="800" height="270"&gt;&lt;/a&gt;&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="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;emp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2.1: ATP Data to Stage File in OIC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here we used stage file action in OIC to write the ATP data into a file, which further we mapped to SOAP services as content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftxkqhhrm6uo2xknzdcc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftxkqhhrm6uo2xknzdcc9.png" alt=" " width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to see Loaded &lt;em&gt;&lt;strong&gt;sample xml file in the stage file&lt;/strong&gt;&lt;/em&gt;
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;root&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;row&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;EMPNO&amp;gt;&lt;/span&gt;7839&lt;span class="nt"&gt;&amp;lt;/EMPNO&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ENAME&amp;gt;&lt;/span&gt;KING&lt;span class="nt"&gt;&amp;lt;/ENAME&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;JOB&amp;gt;&lt;/span&gt;PRESIDENT&lt;span class="nt"&gt;&amp;lt;/JOB&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;MGR/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;HIREDATE&amp;gt;&lt;/span&gt;1981-11-17T00:00:00.000+00:00&lt;span class="nt"&gt;&amp;lt;/HIREDATE&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;SAL&amp;gt;&lt;/span&gt;5000&lt;span class="nt"&gt;&amp;lt;/SAL&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;COMM/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DEPTNO&amp;gt;&lt;/span&gt;10&lt;span class="nt"&gt;&amp;lt;/DEPTNO&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/row&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;row&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;EMPNO&amp;gt;&lt;/span&gt;7698&lt;span class="nt"&gt;&amp;lt;/EMPNO&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ENAME&amp;gt;&lt;/span&gt;BLAKE&lt;span class="nt"&gt;&amp;lt;/ENAME&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;JOB&amp;gt;&lt;/span&gt;MANAGER&lt;span class="nt"&gt;&amp;lt;/JOB&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;MGR&amp;gt;&lt;/span&gt;7839&lt;span class="nt"&gt;&amp;lt;/MGR&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;HIREDATE&amp;gt;&lt;/span&gt;1981-05-01T00:00:00.000+00:00&lt;span class="nt"&gt;&amp;lt;/HIREDATE&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;SAL&amp;gt;&lt;/span&gt;2850&lt;span class="nt"&gt;&amp;lt;/SAL&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;COMM/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DEPTNO&amp;gt;&lt;/span&gt;30&lt;span class="nt"&gt;&amp;lt;/DEPTNO&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/row&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here the mapping reference of stage writes from ATP&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsw5zdig0yi23kdqpivj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsw5zdig0yi23kdqpivj7.png" alt="mapping reference" width="799" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Build Fusion BI Publisher Data Model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The incoming ATP data is structured into an XML format. This serves as the data source for our report.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to see &lt;em&gt;&lt;strong&gt;Magic in the Fusion&lt;/strong&gt;&lt;/em&gt;
  &lt;p&gt;&lt;strong&gt;Create Data model with the XML FILE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fole4xwzfb4cttbeuyfp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fole4xwzfb4cttbeuyfp3.png" alt=" " width="799" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loaded the same sample XML File which we used earlier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatl58kiegu1br76jtz6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatl58kiegu1br76jtz6k.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preview Data &amp;amp; save as Sample Data&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg43arpyf95vaib2k6i9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg43arpyf95vaib2k6i9l.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Don't forgot save it in folders.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create report based on above Data model&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F82vai4a7k2thi9h5p4i4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F82vai4a7k2thi9h5p4i4.png" alt=" " width="799" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Keep the report path with you&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Execute Fusion Run Report SOAP Service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the core of the integration. OIC invokes the &lt;strong&gt;runReport()&lt;/strong&gt;&lt;br&gt;
operation via the BI Publisher SOAP service.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Below is the mapper reference!!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frebvmpydb0da1fdixw6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frebvmpydb0da1fdixw6t.png" alt=" " width="799" height="324"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
&lt;strong&gt;Key Insight:&lt;/strong&gt; The SOAP service is highly flexible. It accepts the XML data, applies your RTF/Excel template, and generates the output in your choice of format (PDF, Excel, CSV).&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;&lt;/p&gt;
  Click to see &lt;em&gt;&lt;strong&gt;How reportBytes converts to DecodeBase64&lt;/strong&gt;&lt;/em&gt;
  &lt;p&gt;&lt;strong&gt;Using assignment, I converted to DecodeBase64&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqp13g6jpz8yhzii0wa3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgqp13g6jpz8yhzii0wa3.png" alt=" " width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Send OIC HTML Notification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, we use the OIC Notification Action to deliver the report.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1buozvvjzcmmq9t6z7if.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1buozvvjzcmmq9t6z7if.png" alt=" " width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Click to see &lt;em&gt;&lt;strong&gt;Sample Email Template:&lt;/strong&gt;&lt;/em&gt;
  &lt;p&gt;&lt;strong&gt;Sample Email Template:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hi Nj&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Generate excel file using BIP report&lt;span class="nt"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;
DB data - XML Data Model fusion - report xlsx&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{bfy}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Best Regards,&lt;span class="nt"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;Naveen Jejji&lt;span class="nt"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;OIC Dev&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;


&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src =&lt;/span&gt;&lt;span class="s"&gt;"https://osidigital.com/wp-content/uploads/2018/08/osi_logo_rgb.png"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"company logo"&lt;/span&gt;
&lt;span class="na"&gt;width =&lt;/span&gt;&lt;span class="s"&gt;"250"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Innovation: Flipping the Script&lt;/strong&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  

&lt;p&gt;The Paradigm Shift&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional: Fusion → ATP (Data Archiving)&lt;/li&gt;
&lt;li&gt;Our Approach: ATP → Fusion BI Publisher → OIC (Dynamic Reporting) 

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;p&gt;This leverages ATP as the "Source of Truth" while utilizing Fusion’s powerful formatting engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measurable Outcomes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Metric Improvement &lt;strong&gt;Manual Effort&lt;/strong&gt; Reduced by 90% &lt;strong&gt;Delivery Time&lt;/strong&gt; Hours to Minutes &lt;strong&gt;Automation&lt;/strong&gt; 100% Automated&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project demonstrates that the Oracle ecosystem is most powerful when its components work in a "reverse" architecture. &lt;/p&gt;

&lt;p&gt;By moving data from ATP back into the Fusion reporting engine, we provide users with the professional outputs they need without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’d love to hear your thoughts:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Have you implemented a similar "reverse" integration? What challenges did you face with the SOAP service limits? Let's discuss in the comments!&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>oic</category>
      <category>analytics</category>
      <category>ace</category>
    </item>
    <item>
      <title>Automating Customer Termination Lifecycle Using Oracle Integration Cloud, ATP, and Oracle Service Cloud</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Sat, 04 Jul 2026 16:29:34 +0000</pubDate>
      <link>https://dev.to/naveen6735/automating-customer-termination-lifecycle-using-oracle-integration-cloud-atp-and-oracle-service-321k</link>
      <guid>https://dev.to/naveen6735/automating-customer-termination-lifecycle-using-oracle-integration-cloud-atp-and-oracle-service-321k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I built an automated customer termination framework using Oracle Fusion Cloud, OIC, ATP, and Oracle Service Cloud. &lt;/p&gt;

&lt;p&gt;It synchronizes termination data across systems, eliminating manual delays, billing errors and operational overhead while ensuring consistent customer lifecycle management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuuz3rcev59pjrjl1pb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuuz3rcev59pjrjl1pb4.png" alt="A flowchart showing data synchronization between Oracle Fusion, OIC, ATP, and Oracle Service Cloud." width="799" height="338"&gt;&lt;/a&gt;&lt;/p&gt;
The automated lifecycle flow



&lt;h2&gt;
  
  
  Integration Flow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;br&gt;
Customer termination information is identified in Oracle Fusion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; Fusion → BIP report with “last run” parameter → OIC → ATP → Service Cloud.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjik8nxongny4ihdmalp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjik8nxongny4ihdmalp.png" alt="SaaS to PaaS" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;
Fusion → BIP report with “last run” parameter → OIC 



&lt;p&gt;&lt;strong&gt;A Quick Business Validation&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;The integration invokes Oracle Service Cloud APIs.&lt;/em&gt;&lt;br&gt;
I added to check whether customer is available in RightNow or Not using RESTAPI&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpexvbdiwdsi4p7uv3wrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpexvbdiwdsi4p7uv3wrl.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;
SerachCustomers in RightNow



&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;br&gt;
Based on above response, we used switch in OIC -To handle creation &amp;amp; update of customer in &lt;em&gt;&lt;strong&gt;RightNow(Oracle Service Cloud (RightNow) invoke)&lt;/strong&gt;&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fge8mwtc1rsx9cssao6kl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fge8mwtc1rsx9cssao6kl.png" alt="RightNow" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;
Oracle Service Cloud (RightNow) invoke


&lt;h2&gt;
  
  
  Business Value Delivered
&lt;/h2&gt;

&lt;p&gt;The solution successfully delivered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automated customer termination processing&lt;/li&gt;
&lt;li&gt; Improved synchronization between Oracle Fusion and Oracle Service Cloud&lt;/li&gt;
&lt;li&gt; Reduced billing risk&lt;/li&gt;
&lt;li&gt; Strong audit capabilities&lt;/li&gt;
&lt;li&gt; Better support visibility&lt;/li&gt;
&lt;li&gt; Enterprise-grade scalability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
By leveraging Oracle Integration Cloud, ATP, and Oracle Service Cloud, we successfully automated the customer termination lifecycle and eliminated several manual operational challenges.&lt;/p&gt;

&lt;p&gt;The solution demonstrates how Oracle's cloud platform can be used to build reliable, scalable, and business-critical integrations that improve efficiency while maintaining data integrity across enterprise applications.&lt;/p&gt;

</description>
      <category>api</category>
      <category>oracle</category>
      <category>rightnow</category>
      <category>oic</category>
    </item>
    <item>
      <title>Stop Using Q! Use Finder for Faster Oracle OIC REST Integrations</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Sun, 14 Jun 2026 16:36:19 +0000</pubDate>
      <link>https://dev.to/naveen6735/stop-using-q-use-finder-for-faster-oracle-oic-rest-integrations-mh2</link>
      <guid>https://dev.to/naveen6735/stop-using-q-use-finder-for-faster-oracle-oic-rest-integrations-mh2</guid>
      <description>&lt;p&gt;Learn how to use the &lt;strong&gt;Finder parameter&lt;/strong&gt; in Oracle Fusion REST APIs &lt;em&gt;instead of Q&lt;/em&gt; for better performance, cleaner OIC mappings, and optimized integrations.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;While Finder works instantly in Postman, OIC requires it to be constructed as a single parameter using XPath expressions, that’s where most developers struggle&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In OIC, integrating with Oracle Fusion Various REST APIs is a common requirement for extracting and processing business data. One of the key decisions developers face is &lt;strong&gt;how to filter data efficiently&lt;/strong&gt; using query parameters.&lt;/p&gt;

&lt;p&gt;Most developers are familiar with the &lt;strong&gt;q parameter&lt;/strong&gt;, but Oracle also provides a powerful alternative &lt;strong&gt;the finder option&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What is finder in Oracle Fusion REST APIs?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
The &lt;strong&gt;finder parameter&lt;/strong&gt; is a predefined query mechanism provided by Oracle Fusion REST APIs to retrieve data using &lt;strong&gt;named queries and bind parameters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eg:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;...?&lt;/span&gt;&lt;span class="py"&gt;finder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;findPurchaseOrderSchedules;&lt;/span&gt;
&lt;span class="py"&gt;bindPONumber&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;AE01-P001531;&lt;/span&gt;
&lt;span class="py"&gt;bindPOItemNumber&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;664-8455&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It behaves like &lt;em&gt;parameterized SQL queries (bind variables)&lt;/em&gt;, improving performance and readability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What is q Parameter?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
The q parameter is used to &lt;em&gt;apply dynamic filters similar to a SQL WHERE clause&lt;/em&gt;&lt;br&gt;
Eg:&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="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PONumber&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'AE01-P001531'&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;POItemNumber&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'664-8455'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Flexible but less structured&lt;/li&gt;
&lt;li&gt;Can lead to complex expressions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;let's Walk into OIC......!&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure you have required REST connections.&lt;/li&gt;
&lt;li&gt;Create Application based Integration with &lt;strong&gt;POST method&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmf3t3vi3d24jwsho501.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmf3t3vi3d24jwsho501.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;The below fields are we need to pass for another REST API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fno8f48ypxmdqmjvi2q5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fno8f48ypxmdqmjvi2q5k.png" alt=" " width="713" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Call &lt;u&gt;Get Method&lt;/u&gt; with &lt;strong&gt;finder&lt;/strong&gt; using rest call.
Below reference, which we will call
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckwczv1wkypq1kjnjq9p.png" alt=" " width="800" height="360"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add Finder as review parameter for the endpoint&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33xirpiqjoxgyj2tcdq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33xirpiqjoxgyj2tcdq5.png" alt=" " width="728" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we will map to finder respectively as below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdt6691hmm2ci64bwore.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdt6691hmm2ci64bwore.png" alt=" " width="799" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;End flow as below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspgb9vkt3rom4fnwugbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspgb9vkt3rom4fnwugbp.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TESTING&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qjprxc956cj4d3c9rf1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qjprxc956cj4d3c9rf1.png" alt=" " width="799" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y2aeh67lbdpgi9rl3q6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y2aeh67lbdpgi9rl3q6.png" alt=" " width="799" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>STRUGGLING WITH IRREGULAR CSV FILES IN OIC? HERE’S THE NXSD SOLUTION</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Wed, 10 Jun 2026 17:14:01 +0000</pubDate>
      <link>https://dev.to/naveen6735/struggling-with-irregular-csv-files-in-oic-heres-the-nxsd-solution-3cd1</link>
      <guid>https://dev.to/naveen6735/struggling-with-irregular-csv-files-in-oic-heres-the-nxsd-solution-3cd1</guid>
      <description>&lt;p&gt;Handling &lt;strong&gt;non-uniform CSV/TXT files&lt;/strong&gt; in Oracle Integration Cloud (OIC) is a common real-time integration challenge. These files often contain inconsistent structures like headers, mixed record types, or variable columns. This blog explains how to process such files using &lt;strong&gt;NXSD (Native Format Schema Definition)&lt;/strong&gt; and trigger notifications effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UNDERSTANDING THE CHALLENGE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Below is csv/txt file, which is Variable number of columns&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;Code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Date&lt;/span&gt;
&lt;span class="k"&gt;F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;nj&lt;/span&gt;&lt;span class="kp"&gt;@gmail&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;com&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;957351&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;06&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2026&lt;/span&gt;
&lt;span class="k"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Hey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;ab&lt;/span&gt;&lt;span class="kp"&gt;@gmail&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;com&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;45466&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;02&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;06&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2026&lt;/span&gt;
&lt;span class="k"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Bye&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;ck&lt;/span&gt;&lt;span class="kp"&gt;@gmail&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;com&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;87979&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;03&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;06&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2026&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This kind of files we need to process in OIC with most effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 1: CREATE FLEXIBLE NXSD SCHEMA&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;NXSD enables parsing flat files into structured XML.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Observe &amp;amp; understand the below script with respective the challenge mentioned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;xsd:schema&lt;/span&gt; &lt;span class="na"&gt;xmlns:xsd=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema"&lt;/span&gt;
            &lt;span class="na"&gt;xmlns:nxsd=&lt;/span&gt;&lt;span class="s"&gt;"http://xmlns.oracle.com/pcbpel/nxsd"&lt;/span&gt;
            &lt;span class="na"&gt;xmlns:tns=&lt;/span&gt;&lt;span class="s"&gt;"http://TargetNamespace.com/fileReference/read"&lt;/span&gt;
            &lt;span class="na"&gt;targetNamespace=&lt;/span&gt;&lt;span class="s"&gt;"http://TargetNamespace.com/fileReference/read"&lt;/span&gt;
            &lt;span class="na"&gt;elementFormDefault=&lt;/span&gt;&lt;span class="s"&gt;"qualified"&lt;/span&gt;
            &lt;span class="na"&gt;attributeFormDefault=&lt;/span&gt;&lt;span class="s"&gt;"unqualified"&lt;/span&gt;
            &lt;span class="na"&gt;nxsd:version=&lt;/span&gt;&lt;span class="s"&gt;"NXSD"&lt;/span&gt;
            &lt;span class="na"&gt;nxsd:stream=&lt;/span&gt;&lt;span class="s"&gt;"chars"&lt;/span&gt;
            &lt;span class="na"&gt;nxsd:encoding=&lt;/span&gt;&lt;span class="s"&gt;"UTF8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Root-Element"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;xsd:complexType&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"headerset"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;xsd:complexType&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"tns:header"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/xsd:element&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"lineset"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;xsd:complexType&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"tns:line"&lt;/span&gt; &lt;span class="na"&gt;minOccurs=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;maxOccurs=&lt;/span&gt;&lt;span class="s"&gt;"unbounded"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/xsd:element&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/xsd:element&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"tns:headerType"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"line"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"tns:lineType"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;xsd:complexType&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"headerType"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C1"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C2"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C3"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;"${eol}"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;xsd:complexType&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"lineType"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C1"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C2"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C3"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C4"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;","&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"C5"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xsd:string"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;"terminated"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;"${eol}"&lt;/span&gt;
                         &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp;quot;"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;               
        &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/xsd:schema&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the above script as &lt;strong&gt;XX_FILENAME.xsd&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 2: BUILD OIC INTEGRATION&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Application Based Integration which accepts the request body as &lt;strong&gt;Binay Format&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp33d30jpmiigdix5ejvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp33d30jpmiigdix5ejvj.png" alt=" " width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read file using stage action as below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7d1hh1l12ht9f9nl27m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7d1hh1l12ht9f9nl27m.png" alt=" " width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Remember to upload your XSD file here as below in the stage read file operation&lt;/em&gt; &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hndpkzj0jsl3guhngip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hndpkzj0jsl3guhngip.png" alt=" " width="725" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 3: Write the file for Notification&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Using &lt;em&gt;stage action&lt;/em&gt; with &lt;strong&gt;Write Operation&lt;/strong&gt; , write a file which has been read in the early step&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;make sure upload the same XSD file for sample data.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdftzy11v0kz60v7cs0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdftzy11v0kz60v7cs0n.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 4: SEND NOTIFICATIONS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hope we are familiar with OIC notification as below map data from write operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxu44g7ivbunn4i3d4lh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxu44g7ivbunn4i3d4lh.png" alt=" " width="799" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, we read &amp;amp; write the non-uniform csv file in OIC successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8gv88jsyyy7527owwas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8gv88jsyyy7527owwas.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href="https://docs.oracle.com/cd/E23943_01/integration.1111/e10231/nfb.htm#CHDCIGIF" rel="noopener noreferrer"&gt;ORACLE DOC reference for XSD Script&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Calling OIC Integration from Oracle Fusion via HTTPS</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Mon, 08 Jun 2026 02:37:20 +0000</pubDate>
      <link>https://dev.to/naveen6735/calling-oic-integration-from-oracle-fusion-via-https-10co</link>
      <guid>https://dev.to/naveen6735/calling-oic-integration-from-oracle-fusion-via-https-10co</guid>
      <description>&lt;p&gt;Oracle Fusion Applications often require integration with external or internal services to extend business capabilities. Oracle Integration Cloud (OIC) serves as a powerful middleware platform to orchestrate such integrations.&lt;/p&gt;

&lt;p&gt;One of the most common patterns is invoking an &lt;strong&gt;OIC integration from Fusion using an HTTPS connection&lt;/strong&gt;, ensuring secure and reliable communication.&lt;/p&gt;

&lt;p&gt;In this blog, we'll walk through the end-to-end process, including setup, configuration, and best practices&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create an OIC Integration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login to Oracle Integration Cloud&lt;/li&gt;
&lt;li&gt;Navigate to Integrations → Create&lt;/li&gt;
&lt;li&gt;Choose:REST Adapter (recommended for HTTPS calls)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; * Resource URI (e.g., /customer/update)
 * HTTP Method (POST/GET)
 * Request/Response payload (JSON/XML)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reference&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcf126aek11m7vd7s2tl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwcf126aek11m7vd7s2tl.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request Payload:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make sure you selected&lt;br&gt;
What is the media-type of Request Body? (Content-Type Header)&lt;br&gt;
&lt;strong&gt;URL-encoded&lt;/strong&gt; for https call acceptance&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qygwicmeh0savaarzad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qygwicmeh0savaarzad.png" alt=" " width="780" height="747"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response Payload:&lt;/strong&gt;&lt;br&gt;
I drop the xml reference here for response payload&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;xm:schema&lt;/span&gt; &lt;span class="na"&gt;xmlns:xm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Root element--&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;xm:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Complex type--&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;xm:complexType&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;xm:sequence&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;xm:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"outcome"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xm:float"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;xm:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Instance_ID"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xm:string"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/xm:sequence&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/xm:complexType&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/xm:schema&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdmm40v5oqrfc3mvwavr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdmm40v5oqrfc3mvwavr.png" alt=" " width="709" height="709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Create an JavaScript function using libraries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;em&gt;Navigations&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Under Design --&amp;gt;libraries--&amp;gt;upload your js function&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3h0uvmo8j5vw3dxoonj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3h0uvmo8j5vw3dxoonj.png" alt=" " width="800" height="270"&gt;&lt;/a&gt;&lt;br&gt;
Under Design --&amp;gt;libraries--&amp;gt;upload your js function&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:Call Js function in integration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call Js function in your designing &amp;amp; map respective inputs to your function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0oairbvridsyed1zsxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0oairbvridsyed1zsxw.png" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Map the response of integration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As below maps the final response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6i9gv6359dx3k8agpni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6i9gv6359dx3k8agpni.png" alt=" " width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Map the primary business identifiers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Active the Integration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try to run &amp;amp; collect your &lt;strong&gt;endpoint Metadata&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9f1t2m9ly6yvyo4o2c93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9f1t2m9ly6yvyo4o2c93.png" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Fusion BIP https connection configuration&lt;/strong&gt;&lt;br&gt;
Now we will map the integration connection details in fusion .&lt;/p&gt;

&lt;p&gt;So for that we will login &lt;em&gt;fusion/analytics--&amp;gt;Under profile Icon right side [Administration]--&amp;gt;Publisher[Manage Publisher]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg3cpsn1iknw8j84hu5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg3cpsn1iknw8j84hu5g.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under HTTP creation data source with OIC login details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgjb2mhez4jslli9vbvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgjb2mhez4jslli9vbvl.png" alt=" " width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Fusion BIP Data Model creation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now choose the Data Source as HTTPS connection &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F238m4bkfst69ikfokg0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F238m4bkfst69ikfokg0d.png" alt=" " width="799" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fill respective details as below
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2ywxsd2qqr8e5i2nblr.png" alt=" " width="799" height="385"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Testing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Run the data model with passing parameters , it will hit the integration as Input which we earlier given as request payload.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The response will display as below, which is back from integration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmbl1vmowf2e5x8pyfi5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmbl1vmowf2e5x8pyfi5.png" alt=" " width="799" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now we will see the Integration track Instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sibigntpxkb9s2d6p5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sibigntpxkb9s2d6p5k.png" alt=" " width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By following the steps above setting up OIC, configuring HTTPS calls, handling authentication, and securing communication you can build reliable and scalable integrations.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Change VBCS Default Oracle Background to a Custom Image</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Sat, 06 Jun 2026 16:01:02 +0000</pubDate>
      <link>https://dev.to/naveen6735/change-vbcs-default-oracle-background-to-a-custom-image-9p5</link>
      <guid>https://dev.to/naveen6735/change-vbcs-default-oracle-background-to-a-custom-image-9p5</guid>
      <description>&lt;p&gt;Oracle Visual Builder Cloud Service (VBCS) provides a clean default UI, but often, applications require branding or a more personalized look and feel. One simple yet effective customization is replacing the default background with a custom image.&lt;/p&gt;

&lt;p&gt;In this blog, we'll walk through how to change the default Oracle VBCS background to a custom image in a few easy steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Upload Your Custom Image&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By default, applications have UI like below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrdhwfkkilw5z8edgunb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrdhwfkkilw5z8edgunb.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's upload your custom image in VBCS application&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using Control &amp;amp; Navigation will upload image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84n3gt1cx8dry8ovqotn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84n3gt1cx8dry8ovqotn.png" alt=" " width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now we will upload image in data as below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yt8oa0cn9l42qj4452i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yt8oa0cn9l42qj4452i.png" alt=" " width="799" height="352"&gt;&lt;/a&gt;&lt;br&gt;
Theme also choose here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76w0lv11vkb139hfm44d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76w0lv11vkb139hfm44d.png" alt=" " width="799" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run Preview of your application page &amp;amp; Inspect image for entire VBCS Url&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flha2pnagfaikavyze3uj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flha2pnagfaikavyze3uj.png" alt=" " width="799" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Add Custom CSS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2ycpaitic8xf45f9gvb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg2ycpaitic8xf45f9gvb.png" alt=" " width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure you will remove the image component from the page after you got the Url&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9w2up2ul63cdz8k8gm7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9w2up2ul63cdz8k8gm7v.png" alt=" " width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Final Preview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33dvbvwztw05m2qd7vm8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33dvbvwztw05m2qd7vm8.png" alt=" " width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Use optimized images (for faster loading)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Agentless Polling in Oracle Integration Using Public Gateway and ATP</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Fri, 05 Jun 2026 15:13:41 +0000</pubDate>
      <link>https://dev.to/naveen6735/agentless-polling-in-oracle-integration-using-public-gateway-and-atp-4805</link>
      <guid>https://dev.to/naveen6735/agentless-polling-in-oracle-integration-using-public-gateway-and-atp-4805</guid>
      <description>&lt;h2&gt;
  
  
  Enabling Secure Inbound Polling Without Connectivity Agent
&lt;/h2&gt;

&lt;p&gt;In Oracle Integration (OIC), polling-based integrations are a common way to process database-driven events. This blog walks through a &lt;strong&gt;simple and practical polling use case&lt;/strong&gt; using the classic &lt;strong&gt;EMP table&lt;/strong&gt;, enhanced with a custom column to control processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Case Overview&lt;/strong&gt;&lt;br&gt;
We want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a column to track whether a record needs processing&lt;/li&gt;
&lt;li&gt;Use OIC to poll records from EMP table&lt;/li&gt;
&lt;li&gt;Process only specific rows&lt;/li&gt;
&lt;li&gt;Update status after processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create ATP Connection&lt;/strong&gt;&lt;br&gt;
The Below is Reference for Oracle ATP connection in OIC.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnzrp81iu627w1y66uk1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnzrp81iu627w1y66uk1.png" alt=" " width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Create Integration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I Prefer the Application Integration, Polling mechanism will work in the Initial Endpoint in the Integration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call ATP Here as like below.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjy0xorjnpne94x61z6xs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjy0xorjnpne94x61z6xs.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure choose the &lt;strong&gt;Review the polling strategy and specify polling options&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Apply your requirement handling in the read &amp;amp; unread value W.R.T    perform on the Column [&lt;u&gt;HIKE is a column for my case&lt;/u&gt;]&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9bp0f43hhn28u7j8cxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9bp0f43hhn28u7j8cxb.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whenever I update in &lt;u&gt;HIKE column&lt;/u&gt; to &lt;u&gt;"NO"&lt;/u&gt;, The integration polling happens using ATP Polling Event &amp;amp; It will update the respective rows to &lt;u&gt;"YES"&lt;/u&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8a8ieftyltnmuxnlroy6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8a8ieftyltnmuxnlroy6.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Final Integration Design as below&lt;/strong&gt;&lt;br&gt;
I mapped EMPNAME as Primary Business identifier for track. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9eq0f10h2kdf55p079p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9eq0f10h2kdf55p079p.png" alt=" " width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:TEST&lt;/strong&gt;&lt;br&gt;
I will update as below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8f80aqm3wgyr0w309log.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8f80aqm3wgyr0w309log.png" alt=" " width="800" height="586"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 4:Integration Observation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It will automatically calls &amp;amp; update the field to "YES"
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhupf8qbe3bmwif1z0rit.png" alt=" " width="799" height="220"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full Flow Summary&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DB Record Update → HIKE = 'NO'&lt;/li&gt;
&lt;li&gt;OIC Polling Query Runs&lt;/li&gt;
&lt;li&gt;Record is Picked&lt;/li&gt;
&lt;li&gt;Integration Logic Executes&lt;/li&gt;
&lt;li&gt;Record Updated → HIKE = 'YES'&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This EMP table polling example demonstrates a lightweight and efficient pattern for OIC integrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Add a flag column&lt;/li&gt;
&lt;li&gt; Poll using a filter condition&lt;/li&gt;
&lt;li&gt; Process and update status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combined with OIC Public Gateway and ATP Adapter, this becomes a &lt;strong&gt;fully cloud-native solution&lt;/strong&gt; without any Connectivity Agent dependency.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>OIC Developer Guide to Create AR Customer Contact Email &amp; Phone in Oracle Fusion Using SOAP (mergePerson)</title>
      <dc:creator>Naveen</dc:creator>
      <pubDate>Thu, 04 Jun 2026 16:01:53 +0000</pubDate>
      <link>https://dev.to/naveen6735/oic-developer-guide-to-create-ar-customer-contact-email-phone-in-oracle-fusion-using-soap-24h6</link>
      <guid>https://dev.to/naveen6735/oic-developer-guide-to-create-ar-customer-contact-email-phone-in-oracle-fusion-using-soap-24h6</guid>
      <description>&lt;p&gt;In Oracle Fusion, AR Customer Contacts are stored as &lt;strong&gt;Party Relationships&lt;/strong&gt;. Adding or updating contact details such as &lt;strong&gt;phone number&lt;/strong&gt; and &lt;strong&gt;email address&lt;/strong&gt; requires interaction with the &lt;strong&gt;Foundation Person Service SOAP API&lt;/strong&gt;.&lt;br&gt;
This guide walks you through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identifying required data (PartyId &amp;amp; RelationshipId)&lt;/li&gt;
&lt;li&gt;Using SOAP API to create contact points&lt;/li&gt;
&lt;li&gt;Verifying data in backend tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Identify Customer Contact Details&lt;/strong&gt;&lt;br&gt;
 &lt;em&gt;Relationship Information&lt;/em&gt;&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="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fusion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hz_relationships&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;relationship_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300000159607279&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftb7yi7ae1mijoo0cfjz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftb7yi7ae1mijoo0cfjz6.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Party Information&lt;/em&gt;&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="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fusion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hz_parties&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;party_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300000159607277&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faavjkgfgv1bt78wysd9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faavjkgfgv1bt78wysd9d.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Use SOAP API to Create Contact Details&lt;/strong&gt;&lt;br&gt;
&lt;u&gt;&lt;em&gt;WSDL Endpoint:&lt;/em&gt;&lt;/u&gt;&lt;br&gt;
Use SOAP API &lt;strong&gt;&lt;em&gt;/crmService/FoundationPartiesPersonService&lt;/em&gt;&lt;/strong&gt; to add new phone number and email for this AR Customer Contact&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operation:mergePerson&lt;/strong&gt;&lt;br&gt;
This API is used to update or merge person-related information, including contact points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Sample SOAP Request&lt;/strong&gt;&lt;br&gt;
Below is a working payload to create both email and phone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;soapenv:Envelope&lt;/span&gt; &lt;span class="na"&gt;xmlns:soapenv=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;
                  &lt;span class="na"&gt;xmlns:typ=&lt;/span&gt;&lt;span class="s"&gt;"http://xmlns.oracle.com/apps/cdm/foundation/parties/personService/applicationModule/types/"&lt;/span&gt;
                  &lt;span class="na"&gt;xmlns:per=&lt;/span&gt;&lt;span class="s"&gt;"http://xmlns.oracle.com/apps/cdm/foundation/parties/personService/"&lt;/span&gt;
                  &lt;span class="na"&gt;xmlns:rel=&lt;/span&gt;&lt;span class="s"&gt;"http://xmlns.oracle.com/apps/cdm/foundation/parties/relationshipService/"&lt;/span&gt;
                  &lt;span class="na"&gt;xmlns:con=&lt;/span&gt;&lt;span class="s"&gt;"http://xmlns.oracle.com/apps/cdm/foundation/parties/contactPointService/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;soapenv:Header/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;soapenv:Body&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;typ:mergePerson&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;typ:personParty&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;per:PartyId&amp;gt;&lt;/span&gt;300000159607277&lt;span class="nt"&gt;&amp;lt;/per:PartyId&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;per:Relationship&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;rel:RelationshipId&amp;gt;&lt;/span&gt;300000159607279&lt;span class="nt"&gt;&amp;lt;/rel:RelationshipId&amp;gt;&lt;/span&gt;

               &lt;span class="c"&gt;&amp;lt;!-- Email Creation --&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;rel:Email&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:OwnerTableName&amp;gt;&lt;/span&gt;HZ_PARTIES&lt;span class="nt"&gt;&amp;lt;/con:OwnerTableName&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:CreatedByModule&amp;gt;&lt;/span&gt;HZ_WS&lt;span class="nt"&gt;&amp;lt;/con:CreatedByModule&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:ContactPointPurpose&amp;gt;&lt;/span&gt;BUSINESS&lt;span class="nt"&gt;&amp;lt;/con:ContactPointPurpose&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:EmailAddress&amp;gt;&lt;/span&gt;Addtest@test.com&lt;span class="nt"&gt;&amp;lt;/con:EmailAddress&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;/rel:Email&amp;gt;&lt;/span&gt;

               &lt;span class="c"&gt;&amp;lt;!-- Phone Creation --&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;rel:Phone&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:OwnerTableName&amp;gt;&lt;/span&gt;HZ_PARTIES&lt;span class="nt"&gt;&amp;lt;/con:OwnerTableName&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:CreatedByModule&amp;gt;&lt;/span&gt;HZ_WS&lt;span class="nt"&gt;&amp;lt;/con:CreatedByModule&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:ContactPointPurpose&amp;gt;&lt;/span&gt;BUSINESS&lt;span class="nt"&gt;&amp;lt;/con:ContactPointPurpose&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:PhoneNumber&amp;gt;&lt;/span&gt;2128811223&lt;span class="nt"&gt;&amp;lt;/con:PhoneNumber&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:PhoneExtension&amp;gt;&lt;/span&gt;999&lt;span class="nt"&gt;&amp;lt;/con:PhoneExtension&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;con:PhoneLineType&amp;gt;&lt;/span&gt;MOBILE&lt;span class="nt"&gt;&amp;lt;/con:PhoneLineType&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;/rel:Phone&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;/per:Relationship&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;/typ:personParty&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/typ:mergePerson&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymteyxgzvg42fdt6f419.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymteyxgzvg42fdt6f419.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Validate Data in Frontend Screen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqjy52znl0oxzdeeslgc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqjy52znl0oxzdeeslgc.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Validate Data in Backend Tables&lt;/strong&gt;&lt;br&gt;
After successful API execution, verify using:&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="n"&gt;CONTACT_POINT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;CONTACT_POINT_TYPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;PHONE_TYPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;OWNER_TABLE_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;RELATIONSHIP_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;PHONE_NUMBER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;EMAIL_ADDRESS&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;fusion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hz_contact_points&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;creation_date&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SYSDATE&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;created_by_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'HZ_WS'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;owner_table_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'HZ_PARTIES'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cr4g1ceszamwd8rkofy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cr4g1ceszamwd8rkofy.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: From OIC&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;With same WSDL :https:/crmService/FoundationPartiesPersonService?WSDL&lt;br&gt;
create Connection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call the connection in OIC with mergePerson Operation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pass respective Values to it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;br&gt;
 We successfully updated the Customer communication details using SOAP WSDL in Oracle Fusion ♥ &lt;/p&gt;

</description>
      <category>api</category>
      <category>cloud</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
