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

Prüfen Sie, ob der Parameter in der WHERE-Klausel NULL ist

Anstatt den Parameterzustand Ihrer Prozedur in der SQL-Anweisung selbst auszuwerten, verschieben Sie diese Auswertung in den enthaltenden PL/SQL-Block, sodass sie nur einmal ausgeführt wird, bevor die ideale SQL-Anweisung übermittelt wird. Zum Beispiel:

CREATE OR REPLACE PROCEDURE my_sp (p_DrumNo VARCHAR2)
IS
BEGIN
    IF p_DrumNo IS NULL THEN
        SELECT ...
        INTO ... -- Assumed
        FROM ...
        WHERE my_column = p_DrumNo;
    ELSE
        SELECT ...
        INTO ... -- Assumed
        FROM ...
        WHERE ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY);
    END;
END;

Ich hatte auch einige Erfolge beim Optimieren von SQL-Anweisungen mit einem OR durch Aufteilen der Anweisung in zwei sich gegenseitig ausschließende Anweisungen mit UNION ALL:

SELECT ...
FROM ...
WHERE p_DrumNo IS NULL
AND ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY)
UNION ALL
SELECT ...
FROM ...
WHERE p_DrumNo IS NOT NULL
AND my_column = p_DrumNo;