Могу ли я выполнить процедуру с нулевыми параметрами по умолчанию?
Недавно я создал процедуру, которая определяется следующим образом:
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;
Но я бы выбрал то, что предложил Джастин.