Ankündigung

Einklappen
Keine Ankündigung bisher.

Leeren String statt NULL

Einklappen
X

Leeren String statt NULL

Einklappen
  • Filter
  • Zeit
Alles löschen
neue Beiträge

  • Leeren String statt NULL

    Hallo zusammen,

    ich möchte in einer ProgreSQL-Datenbank einige Felder updaten.

    Dazu nutze ich im Groovy-Script eines Prozesses den folgenden Code:
    Code:
    def conn = g_dbConnections["Datenquelle"];
    g_dbQuery.executeUpdate(conn, "UPDATE ${targetTable} SET ${fieldChanges} WHERE id = '$id}'");
    "fieldChanges" enthält dabei eine Liste von Update-Anweisungen ("feld1 = 'xyz', feld2 = 'abc', feld3 = '', feld4 = 'uvw'").
    Die sonstigen Variablen sind natürlich alle sinnvoll belegt, das Statement wird auch ausgeführt.

    Was mich jetzt überrascht: Wenn ich ein Feld auf einen leeren String setzen möchte (im Beispiel oben "feld3"), so wird dieses trotzdem auf NULL gesetzt.
    Wenn ich das gleiche Statement über ein SQL-Tool ausführe, enthält das Feld (korrekt) einen leeren String.

    Hat jemand eine Idee, woran das liegen könnte?

    Vielen Dank schon mal!

  • #2
    Also begegnet ist mri das noch nicht, müsste ich jetzt nachstellen.
    Wo ich aber dringend drauf hinweisen möchte ist, dass es maximal unsicher ist, Variablen direkt in den SQL String zu schreiben. Stattdessen sollte man die Parametrisierung von Prepared Statements nutzen.
    Man kann dazu mit Schleifen arbeiten um das SQL zusammenzubauen und dann die Werte ebenfalls in einer Schleife als Parameter an das Statement übergeben.

    Kommentar


    • #3
      Danke für deinen Hinweis, da hast du natürlich völlig recht!
      Ich habe es jetzt auf Prepared Statementes umgestellt. Am Ursprungsproblem hat es allerdings leider nichts geändert (das hatte ich ja insgeheim gehofft ;-) ).

      Code:
      def conn = g_dbConnections["GIS-Daten"];
      stm = conn.prepareStatement("UPDATE person SET address=? WHERE id=12345");
      stm.setString(1, '');
      stm.executeUpdate();
      produziert in besagtem Feld ein NULL statt einem leeren String. :-(

      Kommentar


      • #4
        Hallo Zusammen,

        ich hole dieses Thema noch einmal hoch, da ich genau das Problem gerade habe.
        Gibt es dafür mittlerweile eine Lösung MartinW ?

        Hier mal mein Groovy-Code in meiner Test-Applikation:
        PHP-Code:
        import de.uplanet.scripting.groovy.util.Safely

        def conn 
        g_dbConnections.systemConnection
        def stmt 
        null
        int lid 
        g_request.lid

        try
        {
            
        stmt conn.prepareStatement("""UPDATE XREPLACECHILD
                                            SET XTITELOHNELEERZEICHEN = REPLACE(XTITEL, ' ', '')
                                            WHERE FKLID = ?"""
        )

            
        stmt.setInt(1lid)

            
        stmt.executeUpdate()
        }
        finally
        {
            
        stmt Safely.close(stmt)
        }

        ​ 
        Damit sollen eigentlich ganz simpel alle Leerzeichen aus dem String im Feld "XTITEL" durch einen leeren String ersetzt werden und in das Feld "XTITELOHNELEERZEICHEN" gespeichert werden.
        Was Intrexx daraus aber macht, sehe ich im SQL Profiler deutlich:
        PHP-Code:
        exec sp_executesql N'UPDATE XREPLACECHILD
        SET XTITELOHNELEERZEICHEN = REPLACE(XTITEL, '' '', NULL)
        WHERE FKLID = @P0'
        ​ 
        Intrexx ersetzt die beiden einfachen Hochkommas ('') durch NULL, wodurch die Funktion auf SQL-Ebene das ganze Feld NULL setzt.

        Kommentar

        Lädt...
        X