SQLQuery ergibt Fehler bei Oracle DB mit NULL-Wert

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Weizenbaum
Beiträge: 28
Registriert: Mi 24. Aug 2016, 09:00

SQLQuery ergibt Fehler bei Oracle DB mit NULL-Wert

Beitrag von Weizenbaum »

Hallo zusammen,
aktuell habe ich ein Problem mit NULL-Werten in der Oracle Datenbank, bei Firebird wurde das mit nil gut erkannt, bei Oracle jedoch nicht. Hier wird bei der Abfrage nach nil der Stringvariable für die Logikschicht einfach "NULL" - Wert zugewiesen, was einen Fehler auslöst mit folgender Meldung: Could not convert variant of type (Null) into type (String).

Zunächst der Konstruktor

Code: Alles auswählen

 
{ TDBStammdaten }
// Konstruktor der Datenbankschicht
constructor TDBStammdaten.Create(DBConnection: TObject);
begin
  if (DBConnection is TIBConnection = false) and
     (DBConnection is TOracleConnection = false) then
  begin
    Exit;
  end;
 
  if DBConnection is TOracleConnection then
  begin
    OracleConnection1:= @DBConnection;
    if OracleConnection1^.Connected = true then
    begin
      SQLTransaction1:= TSQLTransaction.Create(nil);
      SQLTransaction1.DataBase:= OracleConnection1^;
      SQLTransaction1.Active:= true;
      SQLQuery1:= TSQLQuery.Create(nil);
      SQLQuery1.DataBase:= OracleConnection1^;
    end
    else
    begin
      Exit;
    end;
  end;
 
  if DBConnection is TIBConnection then
  begin
    IBConnection1:= @DBConnection;
    if IBConnection1^.Connected = true then
    begin
      SQLTransaction1:= TSQLTransaction.Create(nil);
      SQLTransaction1.DataBase:= IBConnection1^;
      SQLTransaction1.Active:=true;
      SQLQuery1:= TSQLQuery.Create(nil);
      SQLQuery1.DataBase:= IBConnection1^;
    end
    else
    begin
      Exit;
    end;
  end;
end;
 


Und hier die Stelle, wo es kracht

Code: Alles auswählen

 
 // Postfach
 if SQLQuery1.FieldByName('POSTFACH') <> nil then
   if SQLQuery1.FieldByName('POSTFACH').Value <> '' then
     sPostfach := SQLQuery1.FieldByName('POSTFACH').Value;
 


nil bzw. Null scheint wohl also bei Oracle was anderes zu sein, als bei Firebird. Wie fange ich das ab bei meiner if - Abfrage?

Weizenbaum
Beiträge: 28
Registriert: Mi 24. Aug 2016, 09:00

Re: SQLQuery ergibt Fehler bei Oracle DB mit NULL-Wert

Beitrag von Weizenbaum »

Habe den Fehler doch noch gefunden, bin wohl heute nicht so konzentriert.
Es waren genau 2 Fehler, der erste war: In meiner Firebird-Datenbank hat das Feld Postfach nicht den Wert Null sondern '' im Gegensatz zum Oracle-Pendant.
Der zweite war das Null sehr wohl ein Schlüsselwort ist, nur eben ein anderes als nil.

Dieser Quelltext funktioniert nun

Code: Alles auswählen

 
 // Postfach
 if SQLQuery1.FieldByName('POSTFACH').Value <> Null then
   sPostfach:= SQLQuery1.FieldByName('POSTFACH').Value
 else
   sPostfach:= '';
 

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: SQLQuery ergibt Fehler bei Oracle DB mit NULL-Wert

Beitrag von Eb »

Ich würde die NULL-Problematik umgehen, indem ich im SQL-Statement eine Funktion einsetze, die dafür sorgt, dass
NULL durch einen definierten Wert ersetzt wird.
In Informix heißt die Funktion NVL. Müsste bei Oracle genauso heißen:

Code: Alles auswählen

  -- Return 'N/A' if name is NULL
  SELECT NVL(name, 'N/A') FROM countries;

gsa
Beiträge: 9
Registriert: Fr 13. Jun 2008, 15:23
OS, Lazarus, FPC: Windows / Linux (FPC 3.2. fixes, Lazarus 2.0 fixes / trunk)

Re: SQLQuery ergibt Fehler bei Oracle DB mit NULL-Wert

Beitrag von gsa »

Weizenbaum hat geschrieben:Habe den Fehler doch noch gefunden, bin wohl heute nicht so konzentriert.
Es waren genau 2 Fehler, der erste war: In meiner Firebird-Datenbank hat das Feld Postfach nicht den Wert Null sondern '' im Gegensatz zum Oracle-Pendant.


Das war nicht dein Fehler. Für Oracle sind bei Zeichenketten ein leerer String und NULL äquivalent.

Gruß Gerd

Antworten