¿Cómo se determina si se ha de pagar un valor de parámetro PL / SQL?
-
22-08-2019 - |
Pregunta
Supongamos que tengo un procedimiento almacenado PL / SQL de la siguiente manera:
PROCEDURE do_something(foo VARCHAR2 DEFAULT NULL) IS
BEGIN
/* Do something */
END;
Ahora, supongamos que se invoca do_something
dos maneras diferentes:
/* Scenario 1: The 'foo' parameter defaults to NULL */
do_something();
/* Scenario 2: The 'foo' parameter is explicitly set to NULL */
do_something(foo => NULL)
¿Cómo puedo definir el procedimiento do_something
para determinar cuál es el escenario está llamando?
Editar: Aclaración de mis intenciones para este procedimiento:
FUNCTION find_customer(name VARCHAR2 DEFAULT NULL, number VARCHAR2 DEFAULT NULL) RETURN NUMBER IS
BEGIN
/* Query the "customer" table using only those parameters provided */
END;
A continuación se presentan usos de ejemplo de este procedimiento con las cláusulas SQL asociadas deseada:
/* SELECT * FROM customer WHERE customer.name = 'Sam' */
find_customer(name => 'Sam')
/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number = '1588Z' */
find_customer(name => 'Sam', number => '1588Z')
/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number IS NULL */
find_customer(name => 'Sam', number => NULL)
/* SELECT * FROM customer WHERE customer.name IS NULL */
find_customer(name => NULL)
/* SELECT * FROM customer WHERE customer.name IS NULL AND customer.number IS NULL */
find_customer(name => NULL, number => NULL)
Solución
Se podría sobrecargar el procedimiento en lugar de usar un valor por defecto:
PROCEDURE do_something(foo VARCHAR2) IS
BEGIN
/* Do something */
END;
PROCEDURE do_something IS
BEGIN
/* here you know: no argument. Then call do_something(null) */
END;
Otros consejos
¿Qué tal en lugar de morosos en nulo, por defecto los valores de los parámetros omitidos a algo que nunca va a usar en el mundo real? Los valores que utilice deben pertenecer a alguna de dominio a fin de elegir los valores fuera de ese dominio.
por ejemplo
PROCEDIMIENTO hacer_algo (foo VARCHAR2 DEFAULT '* # @') es
l_foo VARCHAR2(32000); -- local copy of foo parm
COMIENZO
IF foo = '*#@' THEN
-- I know the parm was omitted
l_foo := NULL;
ELSE
l_foo := foo;
END IF;
FIN;