En lugar de evaluar el estado de los parámetros de su procedimiento en la declaración SQL misma, mueva esa evaluación al bloque PL/SQL contenedor para que se ejecute solo una vez antes de que se envíe la declaración SQL ideal. Por ejemplo:
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;
También he tenido cierto éxito ajustando sentencias SQL con un OR
dividiendo la declaración en dos declaraciones mutuamente excluyentes con 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;