Comment puis-je déterminer si une valeur de paramètre PL / SQL a été fait défaut?
-
22-08-2019 - |
Question
Supposons que j'ai une procédure stockée PL / SQL comme suit:
PROCEDURE do_something(foo VARCHAR2 DEFAULT NULL) IS
BEGIN
/* Do something */
END;
Maintenant, do_something
Supposer invoque deux manières différentes:
/* Scenario 1: The 'foo' parameter defaults to NULL */
do_something();
/* Scenario 2: The 'foo' parameter is explicitly set to NULL */
do_something(foo => NULL)
Comment puis-je définir la procédure de do_something
pour déterminer quel scénario appelle cela?
Edit: Clarifier mes intentions pour cette procédure:
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;
Voici quelques exemples d'utilisation de cette procédure avec les clauses SQL associées Souhaité:
/* 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)
La solution
Vous pouvez surcharger la procédure au lieu d'utiliser une valeur par défaut:
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;
Autres conseils
Qu'en est-il au lieu de défaut à null, par défaut, vous ne les valeurs des paramètres omis quelque chose utiliser dans le monde réel? Les valeurs que vous utilisez doivent appartenir à un domaine afin de choisir des valeurs en dehors de ce domaine.
par exemple
PROCÉDURE do_something (foo VARCHAR2 DEFAULT '* # @') est
l_foo VARCHAR2(32000); -- local copy of foo parm
BEGIN
IF foo = '*#@' THEN
-- I know the parm was omitted
l_foo := NULL;
ELSE
l_foo := foo;
END IF;
END;