Tabelle kopieren mit LONG-Datentyp

Liebe wer-weiss-was Experten,

ich bin’s mal wieder. Und ich schlage mich immer noch mit diesen besch…enen LONG Datentyp herum.

Folgendes Problem:

Um mit einer Tabelle ungestört und ohne was kaputt zu machen experimentieren zu können möchte ich sie kopieren.

Leider liefert mir der Befehl

CREATE TABLE AS SELECT * FROM tabelle

den Fehler: „ORA-00997: illegal use of LONG datatype“

Auch wenn ich versuche nur die eine Spalte, welche den LONG Datentyp hat zu kopieren, und nicht alle, kommt dieser Fehler.

Das einzige, was ich machen kann, ist von der Tabelle eine VIEW anzulegen. Diese kann ich aber dann vom Datentyp her nicht mehr ändern.

alter view kopie
modify long_text varchar(255);

Dann kommt nämlich der Fehler: „ORA-00922: missing or invalid option“

Nun zu meiner Frage:

Weiß jemand, wie ich eine Kopie einer solchen Tabelle anlegen kann, um danach den Datentyp von LONG nach VARCHAR o.ä. zu ändern?

Vielen Dank & schönes Wochenende

ANDI :smile:

da man einen spaltentyp eh nicht mehr ändern kann wenn die spalte gefüllt ist, mach es doch so:

create table as select , , … from ;

dabei läßt du dann die spalte aus in der sich die Longfelder befinden.

danach kannst du dann eine spalte mit beliebiger Formatierung hinzufügen

alter table add varchar2(5);

DANKE für die schnelle Antwort, nur leider hilft mir das nichts. Ich brauche nämlich den Inhalt der Tabelle.

Andererseits wusste ich nicht, dass man den Typ nicht mehr ändern kann, wenn schon was in der Tabelle drinsteht.

Insofern hast Du mir schon weitergeholfen…Ich kann meine Hoffnungen also endgültig begraben jemals mit dem LONG-Tyep fertigzuwerden. Schade eigentlich :frowning:

Trotzdem DANKE :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo andreas

longs sind leider ziemlich eigenwillige datentypen, wesshalb ihre verwendung von oracle-seite auch nicht empfohlen wird. eine nachträgliche konvertierung von datentypen ist auch nicht möglich (lediglich eine vergrösserung der genauigkeit).

aber mit einem trick kann man die daten doch noch retten - ist aber ziemlich aufwändig:

  • tabelle über das tool „exp“ exportieren
  • tabelle droppen
  • tabelle neu anlegen, diesmal aber mit einem anderen datentyp (z.b. varchar2(2000)
  • tabelle über das tool „imp“ wieder importieren (fehler bei existierenden objekten ignorieren!!!)

solange du in der tabelle keine texte hast, die länger als 2000 zeichen sind, sollte das ganze eigentlich klappen.

es gibt meines wissens nach nur eine einzige mögliche konvertierung beim long-datentyp direkt in der datenbank. mit der funktion to_lob kann man einen long in einen clob umwandeln. geht aber nur bei einem insert-as-select.

generell gilt: finger weg von long und long-raw. das waren datentypen, die im oracle 7 (vielleicht auch früher) reingequetscht wurden aber meist nur stress machen.

erwin

Hallo Andi

ab Ora8i existiert m. W. eine SQL-Funktion um Longs in CLOBS zu Konvertieren (beim Kopieren)

  1. Tabelle erstellen mit Datenfeld (Typ CLOB) hier Tabellenname CLOB_Tabelle
  2. insert into CLOB_tabelle
    select n, TO_LOB(long_col) // ist die Ursprungs-Spalte
    from long_tabelle; //ist die Ursprungs-Tabelle

Hierzu kann ich ein Script empfehlen:
www.trivadis.ch --> Tools u. Services --> Downloads -->Trivadis Scripts Oracle8 8.0.x --> 89uolnglob

Die Sache flutscht und ist sehr schön beschrieben.
Du musst dich vorher ohne Verpflichtungen kurz registrieren. Habe hier schon mehrmals auf diese seriöse Firma verwiesen.

Ab Oracle 9i gibt es die Funktion Spalten dieses Typs zu konvertieren:

Alter Table Long_table
MODIFY (column_name CLOB)

Bin sehr in Eile, daher nur kurz.

Versuchs mal.

Grüße

Der Ratlose