Dieser kurze Blogeintrag zeigt mögliche Fehlerquellen bei der Benutzung des DBMS_METADATA Paketes in vom Standard abweichenden SQL*Plus Umgebungen..
Table of Contents
Betroffene Systeme
Das Problem konnte auf den folgenden Systemen und Datenbankversionen reproduziert werden.
Betriebssystem | Oracle Version | Typ | Bemerkung |
* | 11.2.X | Datenbank | |
* | 12.1.X | Datenbank |
Problembeschreibung
In einer Kundenumgebung lieferte die Ausführung der Funktion DBMS_METDATA.GET_DDL keine Zeilen zurück. Das erwartete Ergebnis war die DDL Anweisung zur Neuerstellung eines bestehenden Tablespaces.
SQL> SELECT DBMS_METADATA.GET_DDL('TABLESPACE','USERS') AS "DDL_STATEMENT" FROM dual; DDL_STATEMENT --------------------------------------------------------------------------------
Lösung
Eine Recherche des My Oracle Supports brachte die Note Select Using Sys.DBMS_METADATA.GET_DDL From Dual Returns no Rows (Doc ID 370366.1) zum Vorschein. Das darin beschriebene Problem mit der DUAL Tabelle konnte in der vorhandenen Kundenumgebung nicht beobachtet werden.
Bei der weiteren Analyse wurden die in SQL*Plus gesetzten Parameter betrachtet. Hier wurden ein paar Abweichungen gegenüber den Standardwerten festgestellt. Unter den betroffenen Parametern war auch der Parameter wrap, der sich um die Ausgabe von langen Zeilen kümmert. Dieser war auf off (Zeilen werden abgeschnitten) gesetzt.
SQL> show wrap wrap : Zeilen werden abgeschnitten
Nach Setzen des Parameters auf on (Zeilen werden umgebrochen), lieferte der DBMS_METADATA.GET_DDL das gewünschte Ergebnis zrück.
SQL> SET wrap on SQL> SELECT DBMS_METADATA.GET_DDL('TABLESPACE', 'USERS') AS "DDL_STATEMENT" FROM dual; DDL_STATEMENT -------------------------------------------------------------------------------- CREATE TABLESPACE "USERS" DATAFILE SIZE 5242880 AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO