#!/bin/bash # File paths for output OUTPUT_FILE="/tmp/apex_usage.tmp" PDB_LIST_FILE="/tmp/pdb_list.tmp" > "$OUTPUT_FILE" # Clear the output file before starting touch $OUTPUT_FILE chown oracle $OUTPUT_FILE # Function to execute the APEX usage query in a specific container run_query() { local container_name="$1" su - oracle -s /bin/bash -c " sqlplus -s / as sysdba <> \"$OUTPUT_FILE\" whenever sqlerror exit sql.sqlcode; set echo on set heading on SET UNDERLINE '=' set feedback off set linesize 150 -- Switch to the specified container ALTER SESSION SET CONTAINER = $container_name; -- Print the container name for clarity PROMPT APEX usage for container: $container_name; SELECT OWNER, SUM(BYTES) / (1024 * 1024) AS MB_USED FROM DBA_SEGMENTS WHERE OWNER LIKE 'APEX%' -- Replace with your APEX schema name GROUP BY OWNER; exit; EOF " } # Run the query for the CDB (root container) # echo "Gathering APEX usage for CDB (root container)..." >> "$OUTPUT_FILE" # run_query 'CDB\$ROOT' # Get a list of all PDBs, excluding PDB$SEED, and write to a temporary file su - oracle -s /bin/bash -c " sqlplus -s / as sysdba <<'EOF' set heading off set feedback off set pagesize 0 spool $PDB_LIST_FILE SELECT NAME FROM v\$pdbs WHERE NAME NOT IN ('PDB\$SEED'); spool off exit; EOF " # Verify that the PDB_LIST_FILE was created and contains data if [[ -f "$PDB_LIST_FILE" && -s "$PDB_LIST_FILE" ]]; then # Read each valid PDB name from the temporary file while IFS= read -r PDB; do PDB=$(echo "$PDB" | xargs) # Trim any leading/trailing whitespace if [[ -n "$PDB" ]]; then echo "Gathering APEX usage for PDB: $PDB..." >> "$OUTPUT_FILE" run_query "$PDB" fi done < "$PDB_LIST_FILE" else echo "No PDBs found or could not access v\$pdbs view" >> "$OUTPUT_FILE" fi # Clean up the temporary file rm -f "$PDB_LIST_FILE"