{"id":905,"date":"2026-02-21T11:54:17","date_gmt":"2026-02-21T11:54:17","guid":{"rendered":"https:\/\/forgefuse.wasmer.app\/?p=905"},"modified":"2026-02-21T11:54:17","modified_gmt":"2026-02-21T11:54:17","slug":"collections-in-oracle-apex","status":"publish","type":"post","link":"https:\/\/www.forgefuse.net\/index.php\/collections-in-oracle-apex\/","title":{"rendered":"Collections in Oracle APEX"},"content":{"rendered":"\n<p>When I first started working with <strong>Oracle APEX<\/strong>, I struggled with handling temporary data, especially when building multi-step forms, shopping-cart-like functionality, or wizard-style pages. That\u2019s when I discovered <strong>APEX Collections<\/strong>, a powerful yet often underused feature that makes session-based data management incredibly simple.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">What Are Collections in Oracle APEX?<\/h4>\n\n\n\n<p>Oracle Application Express (APEX) provides a feature called <strong>Collections<\/strong> that allows developers to store temporary data in memory during a user session.<\/p>\n\n\n\n<p>Think of a collection as:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>A temporary, session-based table that exists only for the duration of the user\u2019s session.<\/p>\n<\/blockquote>\n\n\n\n<p>They are extremely useful when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You need temporary storage<\/li>\n\n\n\n<li>You want to stage data before committing to a real table<\/li>\n\n\n\n<li>You\u2019re building multi-step processes<\/li>\n\n\n\n<li>You want to manipulate datasets dynamically<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Understanding How Collections Work<\/h4>\n\n\n\n<p>Internally, collections are stored in:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">WWV_FLOW_COLLECTIONS$<\/pre>\n\n\n\n<p>But you should <strong>never directly manipulate this table<\/strong>. Instead, you use the <code>APEX_COLLECTION<\/code> API.<\/p>\n\n\n\n<p>Key characteristics:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Session-specific<\/li>\n\n\n\n<li>User-specific<\/li>\n\n\n\n<li>Stored in database session<\/li>\n\n\n\n<li>Automatically cleared when session ends<\/li>\n\n\n\n<li>Not committed permanently unless you copy data to real tables<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Datatypes Supported in Collections<\/h4>\n\n\n\n<p>Each collection row can hold:<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">Character Attributes<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>C001<\/code> to <code>C050<\/code> (50 VARCHAR2 columns)<\/li>\n<\/ul>\n\n\n\n<h6 class=\"wp-block-heading\">Numeric Attributes<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>N001<\/code> to <code>N005<\/code> (5 NUMBER columns)<\/li>\n<\/ul>\n\n\n\n<h6 class=\"wp-block-heading\">Date Attributes<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>D001<\/code> to <code>D005<\/code> (5 DATE columns)<\/li>\n<\/ul>\n\n\n\n<h6 class=\"wp-block-heading\">Large Object<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CLOB001<\/code><\/li>\n<\/ul>\n\n\n\n<h6 class=\"wp-block-heading\">Binary Attribute<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li>BLOB001<\/li>\n<\/ul>\n\n\n\n<h6 class=\"wp-block-heading\">XMLTYPE Attribute<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li>XMLTYPE001<\/li>\n<\/ul>\n\n\n\n<h6 class=\"wp-block-heading\">MD5_ORIGINAL Attribute<\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Varchar of size of 4000 chars<\/li>\n<\/ul>\n\n\n\n<p>So a collection row can hold structured data similar to a table row. And additionally it has following two columns:<br><br>COLLECTION_NAME   NOT NULL VARCHAR2(255)<br>SEQ_ID            NOT NULL NUMBER <\/p>\n\n\n\n<p>by which you can identify any row easily.<\/p>\n\n\n\n<p>NOTE: there are updates coming, so hopefully soon in newer versions of Apex we&#8217;ll get more number columns (compared to current limit of five, where if the need arises, you have to use character columns for numbers&#8230; not very effient, right?)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Creating a Collection<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.CREATE_COLLECTION(<br>        p_collection_name =&gt; 'EMP_COLLECTION'<br>    );<br>END;<\/pre>\n\n\n\n<p>Or safer version:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(<br>        p_collection_name =&gt; 'EMP_COLLECTION'<br>    );<br>END;<\/pre>\n\n\n\n<p>This ensures the collection exists and is empty.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Inserting Data into Collection<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.ADD_MEMBER(<br>        p_collection_name =&gt; 'EMP_COLLECTION',<br>        p_c001 =&gt; 'John',<br>        p_c002 =&gt; 'IT',<br>        p_n001 =&gt; 5000,<br>        p_d001 =&gt; SYSDATE<br>    );<br>END;<\/pre>\n\n\n\n<p>Here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>C001<\/code> = Employee Name<\/li>\n\n\n\n<li><code>C002<\/code> = Department<\/li>\n\n\n\n<li><code>N001<\/code> = Salary<\/li>\n\n\n\n<li><code>D001<\/code> = Join Date<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Querying Collection Data<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    c001 AS employee_name,<br>    c002 AS department,<br>    n001 AS salary,<br>    d001 AS join_date<br>FROM<br>    APEX_COLLECTIONS<br>WHERE<br>    collection_name = 'EMP_COLLECTION';<\/pre>\n\n\n\n<p><code>APEX_COLLECTIONS<\/code> is a view used to access collection data.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Deleting a Single Member<\/h5>\n\n\n\n<p>Each row has a <code>SEQ_ID<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.DELETE_MEMBER(<br>        p_collection_name =&gt; 'EMP_COLLECTION',<br>        p_seq =&gt; 1<br>    );<br>END;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Truncating a Collection<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.TRUNCATE_COLLECTION(<br>        p_collection_name =&gt; 'EMP_COLLECTION'<br>    );<br>END;<\/pre>\n\n\n\n<p>Removes all members but keeps collection definition.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Deleting Entire Collection<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.DELETE_COLLECTION(<br>        p_collection_name =&gt; 'EMP_COLLECTION'<br>    );<br>END;<\/pre>\n\n\n\n<p>Completely removes it from session.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Session Persistence -> How Long Do Collections Live?<\/h4>\n\n\n\n<p>Collections:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Exist per user session<\/li>\n\n\n\n<li>Persist across page navigations<\/li>\n\n\n\n<li>Survive commits and rollbacks<\/li>\n\n\n\n<li>Are automatically deleted when session expires<\/li>\n<\/ul>\n\n\n\n<p>\u26a0\ufe0f Important:<br>They are NOT permanent storage.<\/p>\n\n\n\n<p>If the user logs out or session times out \u2192 collection disappears.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Updating Collection Members<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.UPDATE_MEMBER(<br>        p_collection_name =&gt; 'EMP_COLLECTION',<br>        p_seq =&gt; 1,<br>        p_c001 =&gt; 'Michael',<br>        p_n001 =&gt; 7000<br>    );<br>END;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Checking If Collection Exists<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT APEX_COLLECTION.COLLECTION_EXISTS('EMP_COLLECTION')<br>FROM dual;<\/pre>\n\n\n\n<p>I found this useful to have on page load (if it doesn&#8217;t exist, then create it)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Loading Data from a Query<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(<br>        p_collection_name =&gt; 'EMP_COLLECTION',<br>        p_query =&gt; 'SELECT ename, deptno, sal FROM emp'<br>    );<br>END;<\/pre>\n\n\n\n<p>This is powerful for staging real table data into a temporary structure.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Some examples of using collections:<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">1\ufe0f. Wizard-Style Multi-Step Forms<\/h5>\n\n\n\n<p>Use collections to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store step 1 data<\/li>\n\n\n\n<li>Store step 2 data<\/li>\n\n\n\n<li>Validate everything<\/li>\n\n\n\n<li>Insert to real tables only at final step<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">2\ufe0f. Shopping Cart Implementation<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add products to collection<\/li>\n\n\n\n<li>Update quantity<\/li>\n\n\n\n<li>Calculate totals using SUM(n001)<\/li>\n\n\n\n<li>Insert order when user checks out<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">3\ufe0f. Bulk Processing<\/h5>\n\n\n\n<p>Instead of committing row by row:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Collect data in collection<\/li>\n\n\n\n<li>Process in batch PL\/SQL block<\/li>\n\n\n\n<li>Commit once<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">4\ufe0f. Complex Validations Before Insert<\/h5>\n\n\n\n<p>Use collection as:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Staging table before final commit<\/p>\n<\/blockquote>\n\n\n\n<p>Validate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Duplicates<\/li>\n\n\n\n<li>Business rules<\/li>\n\n\n\n<li>Cross-record validation<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Performance Considerations<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Collections are stored in database tables<\/li>\n\n\n\n<li>Large collections may impact performance<\/li>\n\n\n\n<li>Clean them when not needed<\/li>\n\n\n\n<li>Avoid storing huge CLOBs unnecessarily<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">When Should You Use Collections?<\/h4>\n\n\n\n<p>Use Collections When:<\/p>\n\n\n\n<p>\u2714 You need temporary storage<br>\u2714 Data is session-scoped<br>\u2714 Multi-step forms<br>\u2714 Staging before insert<br>\u2714 Complex validations<\/p>\n\n\n\n<p>Avoid When:<\/p>\n\n\n\n<p>\u2718 Data must be persistent<br>\u2718 Large-scale reporting<br>\u2718 Cross-session sharing required<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Addition, using Apex collection with file uploads<\/h4>\n\n\n\n<p>Once I found myself I need to use Apex collections as temporary session storage, but I needed to upload a file as well (of course prior of commiting it to actual database table), and is there a way? There is, let me simplify it for you&#8230; <\/p>\n\n\n\n<p>Note that you can use file upload to apex temporary file table without using collections, but since this blog post is about collections, let do it completely.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">How File Upload Works in APEX<\/h5>\n\n\n\n<p>When you use a <strong>File Browse<\/strong> item in APEX:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>User selects a file<\/li>\n\n\n\n<li>APEX uploads it into a temporary table<\/li>\n\n\n\n<li>The file is stored in:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">APEX_APPLICATION_TEMP_FILES<\/pre>\n\n\n\n<p>This table holds the file <strong>for the duration of the session<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Structure of APEX_APPLICATION_TEMP_FILES<\/h5>\n\n\n\n<p>Important columns:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Column<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>NAME<\/td><td>Internal APEX file reference<\/td><\/tr><tr><td>FILENAME<\/td><td>Original file name<\/td><\/tr><tr><td>MIME_TYPE<\/td><td>File content type<\/td><\/tr><tr><td>BLOB_CONTENT<\/td><td>Actual file data<\/td><\/tr><tr><td>CREATED_ON<\/td><td>Upload timestamp<\/td><\/tr><tr><td>CREATED_BY<\/td><td>User<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>This table is session-specific.<\/p>\n\n\n\n<p>\u26a0\ufe0f Data is automatically cleaned up when the session ends. Just to note again \ud83d\ude42<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">Basic Example -> Fetch Uploaded File<\/h5>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Create File Browse Item<\/h4>\n\n\n\n<p>Create a page item:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">P1_FILE<br>Type: File Browse<br>Storage Type: Table APEX_APPLICATION_TEMP_FILES<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Fetch File from Temporary Table<\/h4>\n\n\n\n<p>After submit:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DECLARE<br>    l_blob        BLOB;<br>    l_filename    VARCHAR2(255);<br>    l_mime_type   VARCHAR2(255);<br>BEGIN<br>    SELECT blob_content,<br>           filename,<br>           mime_type<br>    INTO   l_blob,<br>           l_filename,<br>           l_mime_type<br>    FROM   apex_application_temp_files<br>    WHERE  name = :P1_FILE;    -- Now you can insert into your own table<br>    INSERT INTO my_documents (<br>        file_name,<br>        mime_type,<br>        file_content,<br>        uploaded_on<br>    ) VALUES (<br>        l_filename,<br>        l_mime_type,<br>        l_blob,<br>        SYSDATE<br>    );END;<\/pre>\n\n\n\n<p>\u2705 This permanently stores the file.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Using Collections with File Uploads (Very Powerful)<\/h4>\n\n\n\n<p>Now let\u2019s combine uploads with <strong>APEX Collections<\/strong>.<\/p>\n\n\n\n<p>Common use case:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Upload multiple files \u2192 validate \u2192 show preview \u2192 commit later<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Store Uploaded File in Collection<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">BEGIN<br>    FOR rec IN (<br>        SELECT filename,<br>               mime_type,<br>               blob_content<br>        FROM   apex_application_temp_files<br>        WHERE  name = :P1_FILE<br>    )<br>    LOOP<br>        APEX_COLLECTION.ADD_MEMBER(<br>            p_collection_name =&gt; 'FILE_UPLOAD_COLLECTION',<br>            p_c001            =&gt; rec.filename,<br>            p_c002            =&gt; rec.mime_type,<br>            p_blob001         =&gt; rec.blob_content<br>        );<br>    END LOOP;<br>END;<\/pre>\n\n\n\n<p>Now the file is stored in a session-based collection instead of directly committing to DB.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Display Files from Collection<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT<br>    seq_id,<br>    c001 AS file_name,<br>    c002 AS mime_type<br>FROM<br>    apex_collections<br>WHERE<br>    collection_name = 'FILE_UPLOAD_COLLECTION';<\/pre>\n\n\n\n<p>You can create an Interactive Report on this query. (and even functionality to download the file while in collection -> download blob type)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Cleaning Up Temporary Files<\/h4>\n\n\n\n<p>After processing, you may explicitly remove temp files:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DELETE FROM apex_application_temp_files<br>WHERE name = :P1_FILE;<\/pre>\n\n\n\n<p>Or let APEX handle it automatically at session end.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Multiple File Upload Example<\/h4>\n\n\n\n<p>If File Browse item allows multiple files:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">FOR rec IN (<br>    SELECT *<br>    FROM   apex_application_temp_files<br>    WHERE  created_by = :APP_USER<br>)<br>LOOP<br>    -- process each file<br>END LOOP;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Difference: Temp Files vs Collections<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Temp Files<\/th><th>Collections<\/th><\/tr><\/thead><tbody><tr><td>Stores BLOB<\/td><td>\u2705<\/td><td>\u2705<\/td><\/tr><tr><td>Session-based<\/td><td>\u2705<\/td><td>\u2705<\/td><\/tr><tr><td>Structured columns<\/td><td>\u274c<\/td><td>\u2705<\/td><\/tr><tr><td>Good for staging data<\/td><td>\u26a0\ufe0f Limited<\/td><td>\u2705<\/td><\/tr><tr><td>Good for file upload<\/td><td>\u2705<\/td><td>\u2705 (after copy)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Best practice:<\/p>\n\n\n\n<p>\ud83d\udc49 Use <code>APEX_APPLICATION_TEMP_FILES<\/code> only as entry point<br>\ud83d\udc49 Move data into collections or your own tables<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Performance &amp; Best Practices<\/h4>\n\n\n\n<p>\u2714 Move files to permanent table ASAP<br>\u2714 Avoid keeping huge BLOBs in collection unnecessarily<br>\u2714 Clean up collections when done<br>\u2714 Limit file size in File Browse item<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Understanding file uploads in APEX completes the picture of <strong>APEX Collections<\/strong>.<\/p>\n\n\n\n<p>The typical enterprise pattern is:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">File Upload<br>    \u2193<br>APEX_APPLICATION_TEMP_FILES<br>    \u2193<br>APEX_COLLECTION (validation \/ staging)<br>    \u2193<br>Permanent Tables<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Final Thoughts<\/h4>\n\n\n\n<p>APEX Collections are one of the most powerful features in Oracle APEX that many beginners overlook.<\/p>\n\n\n\n<p>When I first found them, I was trying to solve:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201cHow do I temporarily store rows without committing them?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>Collections were the answer.<\/p>\n\n\n\n<p>They are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simple<\/li>\n\n\n\n<li>Powerful<\/li>\n\n\n\n<li>Session-aware<\/li>\n\n\n\n<li>Highly flexible<\/li>\n<\/ul>\n\n\n\n<p>Mastering them significantly improves your ability to build professional-grade APEX applications.<\/p>\n\n\n\n<p>And don&#8217;t forget, you can have multiple collections in your session, just name them distinctively.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post, I\u2019ll walk you through what APEX Collections are, how to create and manage them, what datatypes they support, and how to use them from beginner to advanced level, complete with practical examples.<\/p>\n","protected":false},"author":1,"featured_media":906,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":109,"footnotes":""},"categories":[2,14],"tags":[16,17,15],"class_list":["post-905","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-article","category-oracle-apex","tag-apex","tag-collections","tag-oracle"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/posts\/905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/comments?post=905"}],"version-history":[{"count":0,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/posts\/905\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/media\/906"}],"wp:attachment":[{"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/media?parent=905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/categories?post=905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.forgefuse.net\/index.php\/wp-json\/wp\/v2\/tags?post=905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}