Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle PL\SQL Null-Eingabeparameter WHERE-Bedingung

Eine Methode wäre die Verwendung einer Variante von

 WHERE column = nvl(var, column)

Hier gibt es jedoch zwei Fallstricke:

  1. Wenn die Spalte nullfähig ist, filtert diese Klausel Nullwerte, während Sie in Ihrer Frage die Nullwerte im zweiten Fall nicht filtern würden. Sie könnten diese Klausel ändern, um Nullen zu berücksichtigen, aber es wird hässlich:

        WHERE nvl(column, impossible_value) = nvl(var, impossible_value)
    

    Natürlich wenn irgendwie der impossible_value jemals eingefügt wird, werden Sie auf andere (lustige) Probleme stoßen.

  2. Der Optimierer versteht diese Art von Klausel nicht richtig. Es wird manchmal einen Plan mit UNION ALL erzeugen, aber wenn es mehr als ein paar nvl gibt , erhalten Sie einen vollständigen Scan, selbst wenn vollkommen gültige Indizes vorhanden sind.

Aus diesem Grund verwende ich gerne dynamisches SQL, wenn es viele Parameter gibt (z. B. mehrere Suchfelder in einem großen Formular):

DECLARE
   l_query VARCHAR2(32767) := 'SELECT ... JOIN ... WHERE 1 = 1';
BEGIN
   IF param1 IS NOT NULL THEN
      l_query := l_query || ' AND column1 = :p1';
   ELSE 
      l_query := l_query || ' AND :p1 IS NULL';
   END IF;
   /* repeat for each parameter */
   ...
   /* open the cursor dynamically */
   OPEN your_ref_cursor FOR l_query USING param1 /*,param2...*/; 
END;

Sie können auch EXECUTE IMMEDIATE l_query INTO l_result USING param1; verwenden