Oracle 我可以用默认的空参数执行一个过程吗?

Oracle 我可以用默认的空参数执行一个过程吗?,oracle,plsql,procedure,Oracle,Plsql,Procedure,我最近创建了一个定义如下的过程: 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 I

我最近创建了一个定义如下的过程:

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;
当我试图执行该过程时,我得到一个错误,指出:

PLS-00306: wrong number or types of arguments in call to 'SPM_UPDATE_COURT_COST'
下面是我的execute语句的样子:

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

现在我理解了错误的含义,但我想如果参数默认为null,那么我可以跳过它们,但显然不能。有办法解决这个问题吗?

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

通常,在设计过程时,您会将所有可选参数放在末尾,以便调用者也可以使用位置表示法。

您可以使用混合方法,位置表示法,直到第一个省略的参数,其余的参数命名为表示法

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;

但我会选择Justin建议的方法。

尝试将
p\u cost\u max
设置为
legal\u court\u cost.cost\u range\u max%TYPE DEFAULT NULL
否则必须向过程传递一个参数,因为如果您不希望它为NULL,它需要一个值,因为您没有定义
DEFAULT NULL
,然后你必须向程序传递一个参数。唯一允许为空的参数是法庭,以及平衡最小值和最大值。在我的执行中,我有所有不允许为空的参数。请参阅Justin的答案,因为他已经很好地解释了这一点
p_cost_max
不能为空。啊,是的,这听起来很有道理。我记得不久前读到过这篇文章,但我一定是忘记了。非常感谢你!贾斯汀+1很好地解释了这一点。