Могу ли я выполнить процедуру с нулевыми параметрами по умолчанию?

Недавно я создал процедуру, которая определяется следующим образом:

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;

Когда я пытаюсь выполнить процедуру execute, я получаю сообщение об ошибке:

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

Вот что мой оператор выполнения выглядит так:

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

Теперь я понимаю, что означает ошибка, но я решил, что параметры по умолчанию равны нулю, тогда я мог бы просто пропустить их, но, видимо, нет. Есть ли способ обойти это?

Ответ 1

В PL/SQL вы можете вызвать процедуру, используя либо номенклатуру параметров, либо позиционную нотацию. Если вы хотите пропустить некоторые параметры, вам нужно будет использовать обозначение имени параметра

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

Обычно, когда вы разрабатываете процедуру, вы должны поместить все дополнительные параметры в конец, чтобы вызывающий мог также использовать позиционную нотацию.

Ответ 2

Вы можете использовать смешанный подход, позиционную нотацию до первого пропущенного параметра, обозначенного для остальных.

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;

Но я бы выбрал то, что предложил Джастин.