gpt4 book ai didi

sql - 在哪里定义oracle包中的默认值

转载 作者:行者123 更新时间:2023-12-04 14:18:04 25 4
gpt4 key购买 nike

当您在oracle中定义一个包时,有一个标题和一个正文。

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

另外,任何人都可以确认messagebroker能够调用proc而无需为参数指定任何默认值吗?

谢谢!

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

将其同时添加到 header 和添加 header 之间有什么区别?

更新:

我可以在仅在规范中指定默认值而不在主体中指定默认值的地方执行此操作。或者,我也可以在两个地方都指定默认值。有什么区别?

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;

最佳答案

如果要将参数设为可选,则必须指定默认值。如果默认值不在主体声明中,则默认值可以正常工作,我会感到惊讶。

我习惯于使我所有的包规范声明都与包主体声明完全相同,以免出现问题。

编辑:

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

就是说,这个问题有什么区别的答案,看来默认是只在规范中还是在两个地方都没有区别-最终结果是相同的。我重申我的信念,即出于记录目的,您应该将其放在两个位置。

关于sql - 在哪里定义oracle包中的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7260634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com