Frage

Angenommen, ich habe ein PL/SQL -gespeicherter Verfahren wie folgt:

PROCEDURE do_something(foo VARCHAR2 DEFAULT NULL) IS
BEGIN
    /* Do something */
END;

Nehmen wir nun an do_something wird auf zwei verschiedene Arten aufgerufen:

/* Scenario 1: The 'foo' parameter defaults to NULL */
do_something();

/* Scenario 2: The 'foo' parameter is explicitly set to NULL */
do_something(foo => NULL)

Wie kann ich das definieren? do_something Verfahren Um festzustellen, welches Szenario es nennt?

Bearbeiten: Klärung meiner Absichten für dieses Verfahren:

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;

Im Folgenden finden Sie beispielsweise Verwendungen dieses Prozedur mit den zugehörigen SQL -Klauseln:

/* 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)
War es hilfreich?

Lösung

Sie können die Prozedur überladen, anstatt einen Standardwert zu verwenden:

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;

Andere Tipps

Wie wäre es, anstatt Null zu versiegen, die ausgelassenen Parameterwerte für etwas standardmäßig in der realen Welt zu standardisieren? Die von Ihnen verwendeten Werte sollten zu einer Domäne gehören. Wählen Sie also die Werte außerhalb dieser Domäne aus.

z.B

Prozedur do_Something (foo varchar2 Standard '*#@') ist

l_foo  VARCHAR2(32000); -- local copy of foo parm

START

IF foo = '*#@' THEN

-- I know the parm was omitted

   l_foo := NULL;

ELSE

   l_foo := foo;

END IF;

ENDE;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top