2013-08-23 17 views
10

Niedawno stworzył procedurę, która jest zdefiniowana następująco:Czy mogę wykonać procedurę z domyślnymi parametrami zerowymi?

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; 

Gdy próbuję execute procedurę, otrzymuję komunikat o błędzie informujący, że:

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

Oto co mój wykonać zestawienie wygląda :

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

teraz rozumiem, co oznacza, że ​​błąd, ale pomyślałem, jeśli parametry są domyślnie null potem mógł po prostu je pominąć, ale najwyraźniej nie. Czy istnieje sposób obejścia tego?

+0

Spróbuj podejmowania 'p_cost_max' do' legal_court_cost.cost_range_max% domyślny typ NULL' W przeciwnym razie trzeba przekazać parametr do procedury, ponieważ spodziewa się, że wartość jako nie zdefiniowano 'DEFAULT NULL' – user75ponic

+0

Jeśli nie spodziewałem się, że null, musisz przekazać parametr do procedury. – user75ponic

+0

Jedynymi parametrami, które mogą mieć wartość NULL są sądy, a saldo min. I maks. W moim wykonaniu mam wszystkie te, które nie mogą być puste. – user2405778

Odpowiedz

35

W języku PL/SQL można wywołać procedurę, korzystając z nazwanej notacji parametru lub notacji pozycyjnej. Jeśli chcesz pominąć niektóre parametry, trzeba używać notacji nazwany parametr

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); 

Generalnie, gdy jesteś projektowania procedurę, należy umieścić wszystkie parametry opcjonalne na końcu, tak aby rozmówca mógł także użyj zapisu pozycyjnego.

+0

Ahhh, tak, dzwoni dzwonek. Pamiętam, że czytałem o tym chwilę wcześniej, ale musiało mi to umknąć. Dziękuję Ci bardzo! – user2405778

+1

Justin +1 za wyjaśnienie tego bardzo dobrze. – user75ponic

5

Można stosować podejście mieszane, notację pozycyjną do pierwszego pominiętego parametru, nazwaną notacją dla pozostałych.

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; 

Ale wybrałbym to, co zaproponował Justin.