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

时间:2011-08-31 16:58:32

标签: sql oracle plsql messagebroker

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

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

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

谢谢!

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

将它添加到两者与仅标题之间的区别是什么?

更新

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

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;

2 个答案:

答案 0 :(得分:6)

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

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

编辑:

正如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>

但如果仅在规范中,一切都有效:

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> 

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

答案 1 :(得分:1)

在包中,您可以在spec或body中使用默认变量/常量。就个人而言,我把它们放在体内,因为我不需要查看规范来弄清楚发生了什么;我知道Oracle官方不同意我的意见。在身体中,这应该直接在create or replace

我对你使用word参数感到有点困惑,虽然这意味着你将它传递给你的包中的函数/过程。如果在包规范或正文中设置了全局变量,则根本不需要将其传递到任何地方。如果你正在改变一个全球性的话,你就会要求一堆乱七八糟的东西,或者会给那些在几年后跟随你的人送礼。

如果您只将其用于一个函数/过程,则在声明中将其设置为该特定元素。

This应该有帮助。