Domanda

Le procedure in PL / SQL può avere valori di default per i parametri, ma il chiamante può passare valori che sono identici ai valori di default. C'è un modo dall'interno del PL / SQL per determinare se un parametro viene passato? Come si può intuire questo non può essere fatto confrontando il valore con il valore predefinito.

È stato utile?

Soluzione

Potrebbe essere possibile se si considera il sovraccarico di un procedimento. Si supponga di voler il valore predefinito di 5 per il parametro a e 7 per il parametro b e vuole anche per verificare se sono stati passati i parametri. In questo caso si deve sovraccaricare la procedura 4 volte per ogni combinazione di (con e senza parametri). Infine, il cosa reale accade nel privati ?? Procedura p_:

set serveroutput on size 100000 format wrapped

create or replace package tq84_test_pck as

   procedure p;
   procedure p(a number          );
   procedure p(          b number);
   procedure p(a number, b number);

end tq84_test_pck;
/

create or replace package body tq84_test_pck as

    procedure p_(a number := 5, a_default boolean,
                 b number := 7, b_default boolean) as
    begin

        dbms_output.put_line(
             'a: ' || a || 
             case when a_default then ' [default]'
                                 else ' [passed ]' end);

        dbms_output.put_line(
             'b: ' || b || 
             case when b_default then ' [default]'
                                 else ' [passed ]' end);

        dbms_output.new_line;

    end p_;

    procedure p is
    begin
        p_(a_default => true, 
           b_default => true);
    end p;

    procedure p (a number) is
    begin
        p_(a         => a, 
           a_default => false, 
           b_default => true);
    end p;

    procedure p (b number) is
    begin
        p_(b         => b, 
           a_default => true, 
           b_default => false);
    end p;

    procedure p (a number, b number) is
    begin
        p_(a         => a,
           b         => b, 
           a_default => false, 
           b_default => false);
    end p;

end tq84_test_pck;
/

show errors

declare

begin

   tq84_test_pck.p;
   tq84_test_pck.p( b => 7);
   tq84_test_pck.p( a => 7 );
   tq84_test_pck.p( a => null);
   tq84_test_pck.p( a => 5, b => 6);

end;
/

Altri suggerimenti

Così il mio modo di fare questo è Non faccio uso di valori di default. O meglio, li ho impostato su NULL come predefinito. Poi all'interno del mio corpo Procedura di controllo per vedere se è uguale a NULL, e se così impostarlo su un default sano. A quel punto si poteva manipolare una bandiera o due nello stesso spazio per vedere ciò che è stato impostato o non impostato.

Tuttavia, v'è il caso limite, se avevano intenzione di passare NULL per qualche ragione. Tuttavia, la maggior parte degli sviluppatori non trattano bene con tripletcase, quindi di solito non ti preoccupare che (in aggiunta, se sto passando un valore, ho bisogno di passare un valore, non nullo, quindi nulla per me significa never- è stato definito)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top