Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird: String-Feld in Blob umwandeln (https://www.delphipraxis.net/82493-firebird-string-feld-blob-umwandeln.html)

Der Jan 14. Dez 2006 11:28

Datenbank: Firebird • Version: 1.5 • Zugriff über: FIBPlus

Firebird: String-Feld in Blob umwandeln
 
Hallo,

ich habe in einer DB-Tabelle ein Feld VARCHAR(255), dies möchte ich gerne in einen BLOB SUB_TYPE TEXT umwandeln. Wie kann ich das tun? "Einfaches" Umwandeln, z.B. im IBExpert geht nicht, da dadurch die interne Struktur mächtig beschädigt wird. Drum habe ich mir ein Script gebastelt:

SQL-Code:
ALTER TABLE AUFTRAG ADD GC2 T_TEXTBLOB;
UPDATE AUFTRAG A SET A.GC2=A.GARANTIECOMMENT; /* GARANTIECOMMENT ist VARCHAR(255) */

/* diverse Trigger auf GARANTIECOMMENT deaktivieren, lasse ich hier weg */ 

ALTER TABLE AUFTRAG DROP GARANTIECOMMENT;
ALTER TABLE AUFTRAG ALTER GC2 TO GARANTIECOMMENT;

/* diverse Trigger auf GARANTIECOMMENT aktivieren, lasse ich hier weg*/ 

COMMIT;
Das läuft auch, ich kann auf das "neue" Feld lesend zugreifen, aber sobald ich etwas schreiben möchte kommt als Fehler Meldung "Data conversion Error from Field BLOB" (oder ähnlich).

Wie kann ich diese Änderung "richtig" durchführen ? :gruebel: Das einfache Kopieren tut es hier wohl nicht :gruebel:

mkinzler 14. Dez 2006 11:47

Re: Firebird: String-Feld in Blob umwandeln
 
Blobs sind nicht Teil der eigentlichen Tabelle, sondern werden in einem eigenen Bereich der Datenbank gespeichert. Im Datensatz selber wird nur die BLOB_ID gespeichert. Über diese man dann einen Stream zum Blob Öffnen kann.

Der Jan 14. Dez 2006 19:45

Re: Firebird: String-Feld in Blob umwandeln
 
Hallo,

ich weiß, daher rühren ja vermutlich die Probleme. Meine Frage ist halt, wie kann ich mein Vorhaben trotzdem realisieren?
Wäre es vielleicht möglich, die Tabellenstruktur in eine neue Tabelle zu "klonen", lediglich das entsprechende Feld als BLob zu definieren und dann den Inhalt der Originaltabelle zu kopieren, dann Original löschen und Klon umbenennen (also im Prinzip, so wie ich es in dem Script oben mit dem Feld gemacht habe, nur halt mit der ganzen Tabelle).
Ich frage, bevor ich es versuche, weil es ziemlich arg aufwendig wäre, dies zu tun, und ich immer noch Hoffnung auf eine einfache Lösung habe....

mkinzler 14. Dez 2006 19:55

Re: Firebird: String-Feld in Blob umwandeln
 
In einem Aufwasch (einer Updateanweisung) wird das wohl nicht gehen. Versuch mal die Tabelle Ds für DS durchzugehen und den Feldinhalt zu Kopieren.

Der Jan 14. Dez 2006 20:44

Re: Firebird: String-Feld in Blob umwandeln
 
Hmmm. Ds für Ds wird nix werden, diese Tabelle ist eine der "Haupttabellen" der DB, und die ist gut in Benutzung.
Aber vielleicht geht das ganze ja mit ner StoredProc?? Da kann ich ja im Prinzip jeden Eintrag einzeln durchgehn.... Und da könnte das sogar von Feld zu Feld gehen, hast recht :)
Werd ich morgen mal an der Test-DB ausprobieren und wenns klappt, dann ist morgen nacht das Live-System fällig :P

dataspider 15. Dez 2006 09:27

Re: Firebird: String-Feld in Blob umwandeln
 
Hi,

ich update blobs ach öfter mit Varchar und habe keine Probleme.
Hat den die Domain T_TEXTBLOB ein Character Set?

Cu, Frank

rider 15. Dez 2006 09:34

Re: Firebird: String-Feld in Blob umwandeln
 
Zitat:

Zitat von Der Jan
ich habe in einer DB-Tabelle ein Feld VARCHAR(255), dies möchte ich gerne in einen BLOB SUB_TYPE TEXT umwandeln. Wie kann ich das tun?

Für diesen Zweck nutze ich die Funktion StrBlob aus der FreeUDFLib.

IBExpert 17. Dez 2006 21:47

Re: Firebird: String-Feld in Blob umwandeln
 
Zitat:

Zitat von mkinzler
Blobs sind nicht Teil der eigentlichen Tabelle, sondern werden in einem eigenen Bereich der Datenbank gespeichert. Im Datensatz selber wird nur die BLOB_ID gespeichert. Über diese man dann einen Stream zum Blob Öffnen kann.

stimmt teilweise. wenn der blobinhalt noch in die selbe datenpage passt landet der inhalt auch darin. wenn nicht, dann werden die daten in komplett neue pages gepackt. ist vorteilhaft wenn man kleine blobinhalte hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz