在 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 包中定义默认值的位置的主要内容,如果未能解决你的问题,请参考以下文章