Announcement

Collapse
No announcement yet.

Prozeduren/Funktionen mit NULL Werten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prozeduren/Funktionen mit NULL Werten

    Hallo zusammen,

    ich bin Oracle-Einsteiger und beschäftige mich gerade, meines Erachtens nach,
    mit einem absoluten Standardproblem - deswegen wohl auch Einsteiger...
    Zur Erläuterung:
    ich habe eine PL-SQL-Funktion, welche mehrere Parameter übergeben bekommt.
    Anschließend werden diese Parametern in eine WHERE-Bedinung eingefügt.
    Jeder Parameter kann den Wert NULL annehmen.
    Das ganze sieht in etwa so aus:

    Code:
    create or replace function f_insert (p1 number, p2 number, p3 varchar2) 
    return number is
      output number;
    begin
      select table_row_id into output
        from table
        where 
            column1 = p1
          and
            column2 = p2
          [...]
          
      return output;
    end f_insert;
    Das Problem ist die Bedingung in Verbindung mit NULL-Werten. Ist bspw. p1 := NULL, so müsste das Statement
    wie folgt geändert werden:
    Code:
    [...]
        where 
            column1 IS NULL
    [...]
    Füge ich IF-Bedinungen mit der Überprüfung auf NULL ein, so habe ich bei der Anzahl
    von Parametern schnell einen unübersichtlichen und schlecht wartbaren Code.
    Bei meiner Recherche bin ich auf zwei Möglichkeiten gestoßen, dieses Problem zu lösen:

    a) dyn. einen String erzeugen und diesen mittels EXECUTE IMMEDIATE ausführen.
    b) Den Standardwert der Spalten von NULL auf 0 setzen und mit NVL arbeiten. Das würde dann so aussehen
    Code:
    [...]
        where 
            column1 = NVL(p1, 0)
    [...]
    Gibt es eine bessere Möglichkeit das ganze zu realisieren? Ich bin dankbar für jeden Hinweis und Hilfe.

    Viele Grüße aus Hamburg
    Zuletzt editiert von oracle_rookie; 23.04.2009, 18:14.

  • #2
    Ich würds vielleicht anders rum machen:

    Code:
    [...]
      where 
        NVL(column1,0) = p1
    [...]
    und vorher p1 auf 0 setzen, wenn es NULL ist. Finde ich immer noch besser, als Werte in den Spalten zu vergeben die eigentlich nicht stimmen. Ausserdem erlaubt des das Datenmodell manchmal gar nicht.

    Und ich denke sooo schlimm ist die Parameterüberprüfung auch nicht.

    Code:
    if(p1 is NULL)p1 := 0;
    if(p2 is NULL)p2 := 0;
    if(p3 is NULL)p3 := 0;
    Finde ich nicht so tragisch. Kommt aber auf die Anzahl der Parameter an.

    Allerdings bin ich auch kein PL/SQL Guru

    Comment


    • #3
      Hallo,

      die Transformation mit NVL in einen bestimmten Wert - z.b. 0 - birgt natürlich die Gefahr das es zu Fehlfunktionen kommt, wenn dieser Wert - hier 0 - auch tatsächlich als Wert in der DB existiert.
      ein
      [highlight=sql]
      ...
      if(p1 is NULL)p1 := 0;
      ...
      where
      NVL(column1,0) = p1
      [/highlight]
      ist auch dann wahr, wenn column1 = 0 und p1 = NULL ist! (oder umgekehrt)

      Sicherer ist hier die IS NULL Abfrage zusätzlich einzubauen.
      [highlight=sql]
      ...
      where
      column1 = p1 OR (column1 IS NULL AND p1 IS NULL)
      [/highlight]
      Das ist zwar erstmal etwas mehr Schreiberei aber in jedem Fall exakter.

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment

      Working...
      X