在oracle包中定义默认值的位置

kra*_*626 5 sql oracle plsql messagebroker

当你在oracle中定义一个包时,有一个类似标题,然后是一个正文.

必须在两个位置定义所有参数.我想为调用程序(IBM消息代理)创建一个可选参数.我是否必须在标题和正文定义中添加默认值?

另外,任何人都可以确认消息经纪人能够在没有指定默认参数的任何值的情况下调用proc吗?

谢谢!

更新:我注意到我可以将默认值添加到标题而不是正文中,或者我可以将其添加到两者中.我无法将它添加到身体中.

将它添加到两个vs只是标题之间有什么区别?

更新:

我可以这样做,我只指定规范中的默认值而不是正文.或者我也可以在两个地方指定默认值.差异是什么?

create or replace
package myPackage is
PROCEDURE myProc  (
    parm1 IN varchar2,                           
    parm1 IN date,                     
    parm1 IN number default null
);
end myPackage;

create or replace
package body myPackage is
PROCEDURE myProc  (
    parm1 IN varchar2,                           
    parm1 IN date,                     
    parm1 IN number
) is
...
...
...
end myProc;
end myPackage;
Run Code Online (Sandbox Code Playgroud)

DCo*_*kie 7

如果要使参数可选,则必须指定默认值.如果默认值正常,如果它不在正文的声明中,我会感到惊讶.

我已经养成了使我的所有包规范声明完全包装体声明的副本以避免问题的习惯.

编辑:

正如OP指出的那样,它只能在规范中并且可以正常工作.如果它在正文中但不在规范中,则会出现错误:

SQL> CREATE OR REPLACE PACKAGE p AS
  2  PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2);
  3  END;
  4  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
  2  PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1', p2 VARCHAR2)
  3  IS
  4  BEGIN
  5    dbms_output.put_line(p1||','||p2);
  6  END;
  7  END;
  8  /

Warning: Package body created with compilation errors
SQL>
Run Code Online (Sandbox Code Playgroud)

但如果仅在规范中,所有工作:

SQL> CREATE OR REPLACE PACKAGE p AS
  2  PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1Dflt', p2 VARCHAR2);
  3  END;
  4  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
  2  PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2)
  3  IS
  4  BEGIN
  5    dbms_output.put_line(p1||','||p2);
  6  END;
  7  END;
  8  /

Package body created
SQL> DECLARE
  2  BEGIN
  3    p.prc(p2=>'Test');
  4  END;
  5  /

P1Dflt,Test

PL/SQL procedure successfully completed

SQL> 
Run Code Online (Sandbox Code Playgroud)

也就是说,问题的答案是关于它有什么不同,似乎只在规范中或在两个地方放置默认值之间没有区别 - 最终结果是相同的.我会重申我的信念,你应该把它放在两个地方用于纪录.