2013-08-23 6 views
10

Recentemente ho creato una procedura che viene definito in questo modo:Posso eseguire una procedura con parametri null di default?

create or replace 
PACKAGE 
pkg_dml_legal_transactions 
AS 
    PROCEDURE spm_update_court_cost(
    p_court_state  IN legal_court_cost.state%TYPE, 
    p_tran_code  IN legal_court_cost.transaction_code%TYPE, 
    p_legal_court  IN legal_court_cost.court%TYPE default null, 
    p_end_date  IN legal_court_cost.end_date%TYPE, 
    p_cost_min  IN legal_court_cost.cost_range_min%TYPE, 
    p_cost_max  IN legal_court_cost.cost_range_max%TYPE, 
    p_bal_min   IN legal_court_cost.bal_range_min%TYPE DEFAULT NULL, 
    p_bal_max   IN legal_court_cost.bal_range_max%TYPE DEFAULT NULL); 

end pkg_dml_legal_transactions; 

Quando tento di execute la procedura, ottengo un errore che indica che:

PLS-00306: wrong number or types of arguments in call to 'SPM_UPDATE_COURT_COST' 

Ecco ciò che la mia esecuzione dichiarazione assomiglia :

execute pkg_dml_legal_transactions.spm_update_court_cost('NJ',1,sysdate,1000,40000); 

Ora capisco cosa significa l'errore, ma ho pensato che se i parametri sono stabilizzati a null poi ho potrebbe semplicemente saltarli, ma apparentemente no. C'è un modo per aggirare questo?

+0

Provare a fare "p_cost_max' a' legal_court_cost.costo_max% TYPE DEFAULT NULL' Altrimenti è necessario passare un parametro alla procedura perché si aspetta un valore come non è stato definito 'DEFAULT NULL' – user75ponic

+0

Se non ci si aspetta che sia null, quindi è necessario passare un parametro alla procedura. – user75ponic

+0

Gli unici parametri che possono essere nulli sono il campo, e il saldo minimo e massimo. Nella mia esecuzione ho tutti quelli che non possono essere nulli. – user2405778

risposta

35

In PL/SQL, è possibile chiamare una procedura utilizzando la notazione dei parametri con nome o la notazione posizionale. Se si desidera saltare alcuni parametri, è necessario utilizzare il nome del parametro notazione

execute pkg_dml_legal_transactions.spm_update_court_cost(p_court_state => 'NJ', 
                  p_tran_code => 1, 
                  p_end_date => sysdate, 
                  p_cost_min => 1000, 
                  p_cost_max => 40000); 

In genere, quando si sta progettando una procedura, si dovrebbe mettere tutti i parametri opzionali alla fine in modo che il chiamante potrebbe anche usa la notazione posizionale.

+0

Ahhh sì, suona un campanello. Ricordo di aver letto un po 'di tempo fa, ma mi è sfuggito di mente. Grazie mille! – user2405778

+1

Justin +1 per aver spiegato questo molto bene. – user75ponic

5

È possibile utilizzare l'approccio misto, la notazione posizionale fino al primo parametro omesso, la notazione denominata per il resto.

declare 
    procedure do_something(p_foo IN NUMBER 
         ,p_bar IN VARCHAR2 DEFAULT NULL 
         ,p_baz IN VARCHAR2) IS 
    begin 
    null; 
    end; 
begin 
    do_something(12, p_baz => 'abc'); 
end; 

Ma sceglierei cosa ha proposto Justin.