Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Update/insert CLOB Feld in Oracle (TLobLocator) (https://www.delphipraxis.net/46883-update-insert-clob-feld-oracle-tloblocator.html)

kohennigs 2. Jun 2005 11:09

Datenbank: Oralce • Zugriff über: DOA

Update/insert CLOB Feld in Oracle (TLobLocator)
 
Moin moin allerseits !

Mein Problem ist das einfügen bzw Updaten eines CLOB Feldes in
einer Orcale DB und so langsam treibt es mich in den Wahnsinn... auch wenn
da wohl eh schon nicht viel fehlt...


Das Ganze soll ja mit eine Loblocator funktionieren, aber
troz Doku und Google wälzen werde ich daraus nicht schlau.

Hier ist meine letzter Versuch:
Delphi-Quellcode:
...
          qry:=TOracleQuery.Create(..);
          LOB := TLOBLocator.Create(ORA_Session,otCLOB);        
         
          qry.Session:=ORA_Session;
          qry.SQL.Text:='Update Tabelle_1 SET Daten= :DATA where id = 1';
                 
          qry.DeclareVariable(':DATA',otCLOB);
          qry.SetComplexVariable(':DATA',LOB);
          LOB.LoadFromFile('C:\RTMGen_TMP.rtm');
          qry.Execute;
...
Hierbei bekomme ich einen "invalid handle" beim LoadFromFile ... :pale:


Etwas genauer:
Das Programm ist ein Administartionstool für einen Report Generator.

Mit diesem werden SQL, Anmeldung usw angelegt, und ausgeführt. Mit dem Report Designer der zum ReportBuilder gehört
kann dann der Admin schön den Report gestalten, und anschliessend soll alles in
die Steuertabellen für das Anwenderprogrammes geschrieben werden.

Bin für jede Hilfe und noch so kleine Anergung dankbar. :wall:

MfG
Kai Hennigs

Jasocul 2. Jun 2005 11:24

Re: Update/insert CLOB Feld in Oracle (TLobLocator)
 
Du solltest auf jeden Fall die Zeilen 9 und 10 vertauschen, da du erst die Daten Laden musst, bevor du diese dem Parameter zuweist.
Da ich selbst mit dem TLobLocator noch nicht gearbeitet habe, kann ich dir im Moment nicht mehr dazu sagen.

Habe nochmal in der Hilfe nachgesehen. Wenn du einen neuen Datensatz hast, kannst du eventuelle Probleme bekommen. Hier ein Auszug aus der Hilfe zum TLOBLocator:
Zitat:

When a LOB column contains a null value, the record does not contain a LOB Locator. Therefore, when selecting a null LOB, you cannot access the LOB data. When updating a null LOB, you first need to update the column to contain an empty LOB (which is something completely different than a null LOB) and use this newly created LOB Locator to write the actual data. When inserting a new record with LOB columns, the same mechanism applies. Temporary LOB's, created through the CreateTemporary constructor, do not have this limitation. You can create the LOB, write data to it, and subsequently use it for Inserts, Updates and PL/SQL calls.
Du hättest also Probleme bei Null-Werten in deiner Tabelle.

kohennigs 2. Jun 2005 13:16

Re: Update/insert CLOB Feld in Oracle (TLobLocator)
 
Mh, also auf jeden Fall schon mal danke für die Tipps @Jasocul !

Bringt mich leider nicht weiter...

Bei mir treten beide Fälle auf. Ich möchte sowohl
vorhandene Datensätze ändern als auch wenn nötig vorhandene
updaten.

Ich probiers weitere, aber leider lauf ich gerade gegen eine Wand-> :wall:

(Auch der Versuch das CLOB als String zu interprtieren schlug fehlt,
weil alles über ca 4000 Zeichen hinten abgeschnitte wird..schade eigentlich!)


MfG

Kai Hennigs


NACHTRAG:::: _> YEAHI !
Nach 6 h hab ich das Problem lösen können.
Werde meine Code vervollständigen, und dann hier posten,
falls jemand mal ein ähnliches Problem hat.
...so kann ich der DP mal was zu zahlen :-)

kohennigs 3. Jun 2005 08:14

Re: Update/insert CLOB Feld in Oracle (TLobLocator)
 
OK , also hier mal meine Lösung:

Delphi-Quellcode:
procedure[i] XYZ[/i]([i]PQR[/i]);
var
  LOB: TLOBLocator;
  qry: TOracleQuery;
begin
try
  qry := TOracleQuery.Create(..);
  LOB := TLOBLocator.Create([i]SESSION[/i], otCLOB);
  try
    with qry do
    begin
      Session := [i]SESSION[/i];
     // [i]SPALTE[/i] ist das (C)LOB Feld
     // Füllen des Feldes mit einen leeren clob
      SQL.Text := 'UPDATE [i]TABELLE[/i] SET [i]SPALTE[/i]= empty_clob() WHERE id =' [i]ID[/i] +
                    ' returning [i]SPALTE[/i] into :[i]SPALTE[/i]';
      // Variable deklarieren
      DeclareVariable('[i]SPALTE[/i]', otClob);

      // Variable als Lobverweis setzen
      SetComplexVariable('[i]SPALTE[/i]', LOB);
    end;
  // Statemant ausführen
  qry.Execute;

  // Verweis aus Lobinhalt übergeben und aus Datei laden
  LOB.AsString := sRtm;   // Alternativ: LOB.LoadfromFile(String);
 
 // Committen :-)
  DBAnmeldung.DB.Commit;

  finally
  qry.free
  LOB.free
except
  // Sprich zu mir!
  on E: Exception do
  begin
    raise Exception.create(self.ClassName + 'DB-Eintraungg schlug fehl! ' + ' ' + E.Message);
    // Im Fehlerfalls -> Rückwärtsrolle
    DBAnmeldung.DB.Rollback;
  end;
end;



MfG

Kai Hennigs


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 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