Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: NULL als Parameterübergabe

  1. #1
    Yufiel ist offline Neuer Benutzer
    Registriert seit
    25.05.2009
    Beiträge
    14

    Standard NULL als Parameterübergabe

    Hallo,
    wir benutzen pgsql 8.3 und wollen als Funktion eine Query dynamisch zusammenbauen, allerdings muss in dieser Query eine weitere Funktion aufgerufen werden. Das sieht dann z.B. so aus:

    sql := 'SELECT * FROM tabelle WHERE func_2(' || para_1 || ') ... ';

    Das Problem ist: wenn para_1 NULL ist, wird die ganze Query NULL, anstatt NULL an die func_2 zu übegeben.

    Wie können wir das lösen? Wie übergibt man die Funktionsparameter evt. richtig?
    Yufiel

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Schau mal nach COALESCE ...
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    Yufiel ist offline Neuer Benutzer
    Registriert seit
    25.05.2009
    Beiträge
    14

    Standard

    Hmmmm, ich denke das trifft es nicht ganz. Wir könnten zwar jetzt schreiben:

    sql := 'SELECT * FROM tabelle WHERE func_2(' || coalesce(para_1, 'default-qwert') || ') ... ';

    Aber in der Nachfolgenden Funktion func_2 brauchen wir auch NULL als möglichen Wert. :-(

    Gibt es noch eine Art der Übergabe?

    Yufiel
    P.S. Danke für die schnelle Antwort.

  4. #4
    achilles_69 ist offline Benutzer
    Registriert seit
    05.07.2006
    Ort
    Bielefeld
    Beiträge
    42

    Standard

    was spricht dagegen:

    Code:
    sql := 'SELECT * FROM tabelle WHERE func_2(' || coalesce(para_1, 'NULL') || ') ... ';
    ?

  5. #5
    Yufiel ist offline Neuer Benutzer
    Registriert seit
    25.05.2009
    Beiträge
    14

    Standard

    Weil in der func_2 der Parameter para_1 auf IS NOT NULL getestet wird. Sonst kann der parameter jede Zeichenfolge enthalten.
    Mit coalesce(para_1, 'NULL') wird dann die Zeichenfolge 'NULL' übergeben werden, nicht NULL ansich. :-(

    Yufiel

  6. #6
    achilles_69 ist offline Benutzer
    Registriert seit
    05.07.2006
    Ort
    Bielefeld
    Beiträge
    42

    Standard

    Du baust doch die Query in einer PL/pgSQL-Funktion zusammen, oder?
    Die dynamisch erstellte Query ist ja auch zunächst ein Text, nur dass dieser dann eben mit EXECUTE ausgeführt.

    Falls das ganze aber in einer externen Funktion (z.B. PHP) erstellt wird, geht das ganze natürlich nicht so, dann müsste mit Hilfe der Skript- / Programmiersprache der entsprechende Ausdruck zusammengebastlet werden.

  7. #7
    Yufiel ist offline Neuer Benutzer
    Registriert seit
    25.05.2009
    Beiträge
    14

    Standard

    Jo, baue die Funktion in PL/pgSQL-Funktion und führe darauf ein EXECUTE aus.

    Wenn ich: coalesce(para_1, 'NULL') so benutze bekomme ich aber bei Parametern die ein Integer erfordern, folgende Fehlermeldung:
    FEHLER: ungültige Eingabesyntax für ganze Zahl: »NULL«
    (Ich benutze pgAdmin III 1.8.2)

    (Deswegen dachte ich bei den varchars würde ich das gleich Problem bekommen, das habe ich nicht weiter ausprobiert...)

  8. #8
    achilles_69 ist offline Benutzer
    Registriert seit
    05.07.2006
    Ort
    Bielefeld
    Beiträge
    42

    Standard

    Zitat Zitat von Yufiel Beitrag anzeigen
    Jo, baue die Funktion in PL/pgSQL-Funktion und führe darauf ein EXECUTE aus.

    Wenn ich: coalesce(para_1, 'NULL') so benutze bekomme ich aber bei Parametern die ein Integer erfordern, folgende Fehlermeldung:
    FEHLER: ungültige Eingabesyntax für ganze Zahl: »NULL«
    (Ich benutze pgAdmin III 1.8.2)

    (Deswegen dachte ich bei den varchars würde ich das gleich Problem bekommen, das habe ich nicht weiter ausprobiert...)
    Okay, ich kenne pgAdmin nicht, vielleicht quotet pgAdmin das 'NULL' nochmal...

    Wird denn der Fehler von func_2 oder von der Funktion geliefert, die die Query zusammenbastelt? Gibt doch mal die Variable mit
    Code:
    RAISE NOTICE 'sql = %', sql
    aus und schick die Query dann direkt an PostgreSQL....

    (ich benutze übrigens ausschließlich psql)

  9. #9
    Yufiel ist offline Neuer Benutzer
    Registriert seit
    25.05.2009
    Beiträge
    14

    Standard

    Moin,
    also bei genauerer Analyse wo der Fehler herkommt habe ich festgestellt, das sie gar nicht mal vom EXECUTE kommt, sondern schon von coalesce().
    Dort hatte ich als ersten Parameter eine Zahl drinne und das führt zu dem Fehler: SELECT 'Hallo' || coalesce(2, 'NULL') || 'Bla';

    Ohne 'NULL' in der Anweisung, geht sie zwar, aber wenn statt der 2 wieder der para_1 steht und dort mal NULL drinne steht, gibts zwar keine Fehlermeldung, aber der gesamte Ausdruck ist dann weider NULL. :-(
    'Hallo' || coalesce(para_1) || 'Bla';

    Yufiel

  10. #10
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    wenn du dem coalesce natuerlich nur einen parameter uebergibst, dann kann das ergebnis freilich auch null sein. es ist i.d.R. sinnvoll als letzten parameter eine konstante anzugeben - damit IMMER etwas verschiedenes von NULL geliefert wird.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 11.02.2011, 12:23
  2. Probleme mit IS NULL etc.
    Von gregorich im Forum SQL
    Antworten: 6
    Letzter Beitrag: 05.12.2007, 16:27
  3. NULL und NOT NULL
    Von ipConfig im Forum SQL
    Antworten: 2
    Letzter Beitrag: 26.11.2007, 17:56
  4. Rechnen mit NULL-Wert
    Von byte im Forum SQL
    Antworten: 2
    Letzter Beitrag: 18.11.2007, 17:25
  5. Null Plan
    Von Trockennasenaffe im Forum Installation von PostgreSQL
    Antworten: 9
    Letzter Beitrag: 06.03.2006, 21:30

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum