9

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

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

此外,任何人都可以确认 messagebroker 能够在不为参数指定任何默认值的情况下调用 proc 吗?

谢谢!

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

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

更新:

我可以做到这一点,我只在规范中指定默认值而不是正文。或者我也可以在这两个地方指定默认值。有什么区别?

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

2 回答 2

12

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

我已经养成了使我所有的包规范声明与包体声明完全相同的习惯,以避免出现问题。

编辑:

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

也就是说,关于它有什么区别的问题的答案,似乎将默认值仅放在规范中或在两个地方都没有区别 - 最终结果是相同的。我要重申我的信念,即您应该将其放在两个地方以用于记录目的。

于 2011-08-31T18:53:51.650 回答
1

在包中,您可以在规范或正文中拥有默认变量/常量。就我个人而言,我将它们放入体内,因为我真的不需要查看规格来弄清楚发生了什么;我知道甲骨文官方不同意我的观点。在身体中,这应该直接在create or replace

我对您对参数一词的使用感到有些困惑,尽管这意味着您将其传递给包中​​的函数/过程。如果您在包规范或正文中设置了全局变量,则根本不需要在任何地方传递它。如果你正在改变一个全局,那么你是在要求一大堆乱七八糟的东西,或者将把一个送给在几年内跟随你的人。

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

应该会有所帮助。

于 2011-08-31T20:15:08.553 回答