DOAG Datenbank Kolumne: DBMS_DEVELOPER – einfache Metadatenabfrage für Developer

  • Erstellt von Ulrike Schwinn
  • Datenbank Kolumne, Datenbank

SQL*PLUS, SQL Developer sowie SQL Modeler oder SQLcl als Tools-Schnittstellen um Metadaten über Datenbankobjekte abzurufen, sind den meisten wahrscheinlich bekannt.

In SQLcl existieren sogar spezielle Kommandos wie DESCRIBE, INFO und DDL dafür. Außerdem kennt bestimmt fast jeder Datenbank-User das PL/SQL-Package DBMS_METADATA. Es bietet die Möglichkeit, Metadaten aus dem Data Dictionary sowohl im XML-Format als auch als DDL-Kommando abzurufen.

DBMS_DEVELOPER

In 23ai ist das Package DBMS_DEVELOPER hinzugefügt worden. Wie der Name schon andeutet, richtet es sich an Entwickler. Anders als bei DBMS_METADATA werden die Ergebnisse damit in JSON-Format bereitgestellt. Die Ausgabe ist dabei sehr schnell. Ein weiterer Unterschied besteht darin, dass nur minimale Berechtigungen erforderlich sind, nämlich SELECT- und READ- Privilegien auf die Datenbankobjekte. 

Betrachten wir ein einfaches Beispiel. Mit der Funktion GET_METADATA werden die notwendigen Informationen wie Objekttyp und Detailgrad der Ausgabe angegeben. Die Syntax gestaltet sich wie folgt:

DBMS_DEVELOPER.GET_METADATA ( 

name                IN VARCHAR2, 

schema             IN VARCHAR2 DEFAULT NULL,

object_type      IN VARCHAR2 DEFAULT NULL, 

level                  IN VARCHAR2 DEFAULT ‘TYPICAL’ 

etag                  IN RAW    DEFAULT NULL)

RETURN JSON;

Unterstützte Objekttypen sind derzeit TABLE, INDEX und VIEW. Das Argument „level“ wird verwendet, um den Detaillierungsgrad wie BASIC, TYPICAL und ALL anzugeben. Neu ist die Möglichkeit einen eindeutigen Bezeichner „etag“ für die Version des Dokuments mitzugeben. Anhand des ETAG-Wertes kann eine Anwendung feststellen, ob der Inhalt einer bestimmten Version eines Dokuments mit dem einer anderen Version übereinstimmt. 

Ein Beispiel

Das folgende Beispiel erklärt die Funktion: Der User DEVMETA besitzt CONNECT- und SELECT-Rechte für die Tabelle COUNTRIES im Datenbank-Schema HR. 

Verbinden wir uns mit dem user DEVMETA und geben die Metadaten der Tabelle COUNTRIES aus. Der Level ist ALL.

set heading off long 10000

select JSON_SERIALIZE (DBMS_DEVELOPER.GET_METADATA

                    (schema   => 'HR',

                     object_type => 'TABLE',

                     name   => 'COUNTRIES',

                     level    => 'ALL' )

 returning clob pretty) result;

Erklärung

Zur Erklärung: JSON_SERIALIZE wird verwendet um eine gut lesbare textuelle JSON-Daten-Darstellung durch Pretty-Printing zu erhalten.

Hier ist ein Ausschnitt des Ergebnisses:

{

  "objectType" : "TABLE",

  "objectInfo" :

  {

    "schema" : "HR",

    "columns" :

     [

      {

        "dataType" :

      {

        "type" : "CHAR",

        "length" : 2,

        "sizeUnits" : "BYTE"

 },

 "isPk" : true,

 "hiddenColumn" : false,

 "numDistinct" : 25,

 "isUk" : true,

 "highValue" : "5A57",

 "isFk" : false,

 "lowValue" : "4152",

 "density" : 0.04,

 "notNull" : true,

 "name" : "COUNTRY_ID",

 "avgColLen" : 3

    },...

  },

  "etag" : "93D77AFB94E1F73B6A63C12687BD1CC1"

}

Test des „etag“ Parameter

Testen wir noch den „etag“ Parameter. Wenn der ETAG-Wert in der Abfrage mit dem aktuellsten Wert übereinstimmt, gibt die Funktion ein leeres Dokument zurück. In allen anderen Fällen erhält man das Dokument mit aktuellem ETAG. In unserem Beispiel stimmt der ETAG-Wert überein, also erhalten wir ein leeres Dokument. 

set long 10000 heading off

col result format a200

select json_serialize(DBMS_DEVELOPER.GET_METADATA

                                         (schema  => 'HR', 

                                          object_type => 'TABLE', 

                                          name   => 'COUNTRIES', 

 etag   => '93D77AFB94E1F73B6A63C12687BD1CC1' ) returning clob pretty) result;

 

RESULT

--------------------------------------------------------------------------------

{

}

 

Weitere Informationen, Links und Beispiele dazu finden sich im Blog Posting https://blogs.oracle.com/coretec/post/dbmsdeveloper-the-new-developer-friendly-meta-data-retrieval-in-23ai.

Ulrike Schwinn

© Gerd Altmann