Search This Blog

Showing posts with label Use A_TABLE for Flattening Nested Arrays. Show all posts
Showing posts with label Use A_TABLE for Flattening Nested Arrays. Show all posts

Tuesday, July 1, 2025

How Do I use A_TABLE for Flattening Nested Arrays

 Using A_TABLE to flatten nested arrays is an important technique in Oracle APEX and PL/SQL when working with complex JSON or collection data structures. Nested arrays can store multiple layers of data, but they often need to be transformed into a simpler, flat table format for reporting, processing, or integration. The A_TABLE function allows you to convert nested collections or arrays into rows, enabling easier access and manipulation of each element within the nested structure. This approach streamlines data handling and improves query performance when dealing with hierarchical or multi-level array data.

In Oracle APEX and PL/SQL, handling nested arrays—especially those coming from JSON or collection types—can be challenging when you want to query or display the data in a flat, tabular format. The A_TABLE function is an essential tool to flatten nested arrays or collections into rows, allowing easier processing and reporting.

Here is how to use A_TABLE for flattening nested arrays in detail:

  1. Understand the Data Structure
    Nested arrays usually come as collections of collections or JSON arrays within JSON arrays. For example, you may have a JSON object containing an array of orders, and each order contains an array of items. To work with these in SQL or PL/SQL, you need to flatten the inner arrays.

  2. Define the Nested Table Type
    To use A_TABLE, you first need to define a nested table type in PL/SQL corresponding to your array elements. For example:

    CREATE OR REPLACE TYPE item_type AS OBJECT (
      item_id NUMBER,
      description VARCHAR2(100),
      quantity NUMBER
    );
    
    CREATE OR REPLACE TYPE item_table_type AS TABLE OF item_type;
    
  3. Populate the Nested Table
    When you have data stored as nested collections or from JSON parsing, assign the nested array to a variable of the nested table type.

  4. Use A_TABLE to Flatten
    The A_TABLE function converts the nested table into rows, so you can query each element as a row. For example:

    SELECT t.item_id, t.description, t.quantity
    FROM TABLE(my_nested_array_variable) t;
    

    This will return each item in the nested array as a separate row, flattening the data.

  5. Handling Nested JSON Arrays
    When working with JSON, you can parse the JSON data into nested collections using JSON_TABLE or PL/JSON and then use A_TABLE to flatten those collections.

  6. Combining with Parent Data
    Often, you want to join the flattened nested array with its parent data. For example, if you have orders and nested items, you can join the order information with the flattened items like so:

    SELECT o.order_id, t.item_id, t.description, t.quantity
    FROM orders o,
         TABLE(o.items_collection) t;
    
  7. In Oracle APEX
    In APEX, you can use these techniques inside SQL queries for reports or inside PL/SQL processes. This lets you show detailed nested data in classic or interactive reports by flattening nested arrays on the fly.

In summary, using A_TABLE is a powerful method to work with nested arrays by turning them into a simple row set. This approach simplifies complex hierarchical data structures, making it easier to process, display, or analyze within Oracle APEX applications.

If the "GEOMETRY" JSON column contains a more complex nested array or object, you might want to use JSON_TABLE to flatten the array into rows.

For example:

SELECT *

FROM USCG_DATA,

     JSON_TABLE(

         GEOMETRY,

         '$.coordinates[*]' COLUMNS (

             longitude NUMBER PATH '$[0]',

             latitude NUMBER PATH '$[1]'

         )

     ) jt;

This query will flatten the coordinates array in the JSON into individual rows, displaying each coordinate's longitude and latitude as separate rows in the result.

Use PL/SQL to Process JSON (Optional)

If you need more advanced processing of the JSON data, you can also use the APEX_JSON package in a PL/SQL block.

Example: Using APEX_JSON in PL/SQL

DECLARE

    l_json CLOB;

    l_type VARCHAR2(255);

    l_longitude NUMBER;

    l_latitude NUMBER;

BEGIN

    -- Fetch JSON data from the GEOMETRY column

    SELECT GEOMETRY INTO l_json

    FROM USCG_DATA

    WHERE ID = :P1_ID;


    -- Parse JSON data

    APEX_JSON.parse(l_json);

    

    -- Extract values

    l_type := APEX_JSON.get_varchar2('$.type');

    l_longitude := APEX_JSON.get_number('$.coordinates[0]');

    l_latitude := APEX_JSON.get_number('$.coordinates[1]');


    -- Assign to page items (or use in further processing)

    :P1_GEOMETRY_TYPE := l_type;

    :P1_LONGITUDE := l_longitude;

    :P1_LATITUDE := l_latitude;

    

END;


This PL/SQL block parses the JSON from the GEOMETRY column, extracts the relevant values, and assigns them to APEX page items (e.g., P1_GEOMETRY_TYPE, P1_LONGITUDE, P1_LATITUDE).

 

Debugging Error:  01722. 00000 - "unable to convert string value containing %s to a number: %s"

The ORA-01722: invalid number error typically occurs when Oracle tries to convert a value that isn't a valid number into a numeric type. In the context of your query, this could happen if one of the values you're extracting from the JSON data is expected to be a number but isn't actually a valid numeric value (e.g., it's a string or contains non-numeric characters).

The ORA-01722: invalid number error happens when Oracle tries to convert a non-numeric string into a number. To handle this in your query:

  • Use regular expressions (REGEXP_LIKE) to check if the value is numeric before converting it to a number.

  • Handle invalid data gracefully by returning NULL or using CASE statements to filter out invalid values.

  • Debug the raw JSON values if necessary, to ensure that all values in the "coordinates" field are valid numbers.

Debug and Resolving the Issue

  1. Check Data in the GEOMETRY Column: Before troubleshooting further, ensure that the data in the "GEOMETRY" column is in the expected format, especially for the numeric fields you're trying to extract. For instance, ensure that the values within "coordinates" are indeed numeric (e.g., valid decimal numbers for longitude and latitude).

Use JSON_VALUE Safely with NULL Handling: If you're extracting a value from the JSON and converting it to a number, it's essential to ensure that the value exists and is numeric. You can use TRY_CAST or CASE statements to handle cases where the value isn't a valid number.

Mastering how to use A_TABLE for flattening nested arrays empowers developers to efficiently extract and present detailed data in Oracle APEX applications. By transforming complex nested arrays into manageable rows, you can build clearer reports, create interactive dashboards, and perform advanced data operations without complicated coding. This technique enhances your ability to work with modern data formats, making your Oracle APEX solutions more flexible and powerful.