Dort hat man den Überblick über alle Container; die jeweiligen Zeilen werden über die Spalte CON_ID den einzelnen Containern zugeordnet. Aber wie kann man sich einfach den Namen des zugehörigen Containers anzeigen lassen?
Das Naheliegendste ist ein Join mit der View CDB_PDBS, der View V$PDBS oder der View V$CONTAINERS über die Spalte CON_ID:
SQL> select f.con_id,c.name,f.file_name
2 from cdb_data_files f,v$containers c
3 where c.con_id=f.con_id;
CON_ID NAME FILE_NAME
---------- ---------- --------------------------------------------------
1 CDB$ROOT /opt/oracle/oradata/FREE/users01.dbf
1 CDB$ROOT /opt/oracle/oradata/FREE/undotbs01.dbf
1 CDB$ROOT /opt/oracle/oradata/FREE/system01.dbf
1 CDB$ROOT /opt/oracle/oradata/FREE/sysaux01.dbf
[…]
Es geht aber auch einfacher, ganz ohne Join:
SQL> select f.con_id,con$name,file_name from cdb_data_files f
CON_ID CON$NAME FILE_NAME
---------- ---------- --------------------------------------------------
1 CDB$ROOT /opt/oracle/oradata/FREE/users01.dbf
1 CDB$ROOT /opt/oracle/oradata/FREE/undotbs01.dbf
1 CDB$ROOT /opt/oracle/oradata/FREE/system01.dbf
1 CDB$ROOT /opt/oracle/oradata/FREE/sysaux01.dbf
[…]
Wo kommt diese Spalte CON$NAME her?
Der Grund liegt im Aufbau der CDB-Views. Bei den CDB-Views wendet Oracle die CONTAINERS-Klausel. Damit kann man container-übergreifende Abfragen formulieren. Dabei müssen die zugrunde liegenden Views oder Tabellen in den abgefragten Containern jeweils die gleiche Struktur haben (bzw. die abgefragten Spalten müssen in allen Containern vorhanden sein).
Für die View CDB_DATA_FILES sieht die Abfrage wie folgt aus:
SQL> select text from dba_views where view_name='CDB_DATA_FILES';
TEXT
---------------------------------------------------------------------------
SELECT k."FILE_NAME",k."FILE_ID",k."TABLESPACE_NAME",k."BYTES",k."BLOCKS",k."STA
TUS",k."RELATIVE_FNO",k."AUTOEXTENSIBLE",k."MAXBYTES",k."MAXBLOCKS",k."INCREMENT
_BY",k."USER_BYTES",k."USER_BLOCKS",k."ONLINE_STATUS",k."LOST_WRITE_PROTECT",k."
CON_ID", k.CON$NAME, k.CDB$NAME, k.CON$ERRNUM, k.CON$ERRMSG FROM CONTAINERS("SYS
"."DBA_DATA_FILES") k
In dem obigen Beispiel sieht man, dass es neben CON$NAME auch noch weitere versteckte Spalten in den CDB-Views gibt:
- CON$NAME – Name des zugehörigen Containers
- CDB$NAME – Name der Container-Datenbank
Die versteckten Spalten CON$ERRNUM und CON$ERRMSG sind nicht dokumentiert und üblicherweise gleich Null bzw. leer.
Mit etwas Kenntnis der Abfrage-Strukturen im Data Dictionary kann man sich also Tipparbeit sparen – aber es bleibt die Frage, warum Oracle diese beiden Spalten in den CDB-Views vor dem Benutzer versteckt.
Markus Flechtner
DOAG Themenverantwortlicher Open Source
----
Bild von StockSnap auf Pixabay


