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

Posted

技术标签:

【中文标题】在 oracle 包中定义默认值的位置【英文标题】:where to define default value in oracle package 【发布时间】:2011-11-07 19:20:41 【问题描述】:

当您在 oracle 中定义一个包时,会有一个类似的标头,然后是一个主体。

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

此外,任何人都可以确认 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;

【问题讨论】:

TSQL 特定于 Microsoft。您可能需要修改该标签。 啊哈,你是……我一定是一厢情愿:) 【参考方案1】:

如果你想让一个参数可选,那么你必须指定一个默认值。如果默认值不在正文声明中,如果默认值正常工作,我会感到惊讶。

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

编辑:

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

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

【讨论】:

惊喜!哈哈。您绝对可以在规范中而不是正文中具有默认值。有谁知道这和在两个地方都有它有什么区别? 显然,它们必须在规范中,但在正文中是可选的。 完全正确。我的问题是,这有什么不同吗? @kralco626 这没什么区别;但想想调试这段代码,将来的人会来看它。如果发生的事情很明显并且默认值在规范和正文中,那么每个人的生活都会更轻松。 @DCookie,在规范中没有声明的函数可以在包体中有默认值吗?【参考方案2】:

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

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

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

This 应该会有所帮助。

【讨论】:

啊,在那种情况下@DCookie 是对的;绝对把它放在两者中,为自己省去很多麻烦。

以上是关于在 oracle 包中定义默认值的位置的主要内容,如果未能解决你的问题,请参考以下文章

Python解包中的默认值

如何在Python中定义静态变量

Oracle中插入默认时间

oracle关于创建表时用default指定默认值的坑

mysql表字段默认值

函数初识(缺默认函数的陷阱)