Mit der Einführung von CLOBs und BLOBs hat Oracle vor langer Zeit (Oracle 8i) geschrieben, dass die Datentypen LONG/LONG RAW deprecated sind, und die Konvertierung auf CLOB/BLOB empfohlen wird.
Da Oracle im Data Dictionary selbst noch auf LONG setzt – und dies offensichtlich nicht mehr ändern will/kann – gibt es zu dieser Aussage ein Update mit Oracle 23ai:
All forms of LONG data types (LONG, LONG RAW, LONG VARCHAR, LONG VARRAW) were deprecated in Oracle8i Release 8.1.6. For succeeding releases, the LONG data type was provided for backward compatibility with existing applications. In new applications developed with later releases, Oracle strongly recommends that you use CLOB and NCLOB data types for large amounts of character data.
Das ändert aber nichts daran, dass man sich in den eigenen Applikationen endlich von LONG/LONG RAW trennen soll!
Für die Migration auf LOBs gibt es verschiedene Möglichkeiten, beispielsweise:
- SQL Funktion
TO_LOB
konvertiert LONG bzw. LONG RAW beispielsweise in SELECTs auf die entsprechenden LOBs. Damit könnte man einCREATE TABLE AS SELECT
machen. ALTER TABLE <table_name> MODIFY <col_name> CLOB | BLOB;
konvertiert den Datentyp in der Tabelle – allerdings werden dabei alle Indizes UNUSABLE, weil Oracle intern eben einCREATE TABLE AS SELECT
macht.- Auch mit
DBMS_REDEFINITION
kann man diese Konvertierung durchführen, sofern man eine Oracle Enteprise Edition Datenbank nutzt. - Auch Data Pump bietet die Konvertierung auf LOBs an, indem man die Tabelle zuerst exportiert, dann droppt und mit LOB neu erzeugt und zuletzt wieder importiert. Data Pumpt führt dann die Konvertierung automatisch durch.
Weitere Möglichkeiten sind, dass man in PL/SQL LONG in ein VARCHAR mit bis zu 32.760 Zeichen selektiert oder mit Hilfe von DBMS_SQL.COLUMN_VALUE_LONG
Teile aus einem LONG heraus kopiert. Da diese Methoden Einschränkungen haben, sind diese für eine echte Umstellung nicht geeignet.
Welche der genannten Methoden man nutzt, ist sicher Geschmacksache. Die aus Sicht eines DBAs sinnvollste Methode ist aber sicher:
ALTER TABLE <table_name> MODIFY <colum_name> CLOB | BLOB;
Damit erreicht man gleich mehrere Dinge:
- Die Tabelle ist reorganisiert (weil intern ein CTAS durchgeführt wird).
- Alle Index, Constraints, Trigger und Grants werden umgehängt.
Allerdings gibt es auch einige Punkte zu bedenken:
- Applikationen und Programme, die auf die Tabelle zugreifen, müssen durch die Entwickler angepasst werden.
- Es ist KEINE Online Operation, sprich die Tabelle ist gesperrt.
- Auf der LONG Spalte dürfen keine DOMAIN (meist Text) Indizes angelegt sein.
- Alle Indizes werden durch das ALTER TABLE UNUSABLE und müssen rebuildet werden.
- Gerade bei großen Tabellen kann es zu Platzproblemen durch das CTAS kommen.
Also wirklich den Entwicklern mal wieder in Erinnerung rufen, dass LONG / LONG RAW seit dem letzten Jahrtausend schon deprecated ist, und das „neue, moderne Zeugs“ (gemeint sind die LOBs) wirklich schon sehr gut funktioniert (vorausgesetzt man nutzt SECUREFILE LOBs).