2011-08-31 11 views
4

當你在oracle中定義一個包時,有一個像頭然後是一個正文。在oracle包中定義默認值的位置

必須在兩個位置定義所有參數。我想爲調用程序(IBM消息代理)設置其中一個可選參數。我是否必須在標題和正文定義中添加默認值?

附加地,任何人都可以確認messagebroker將能夠調用proc,並指定該參數的默認值爲?

謝謝!

更新:我注意到,我可以將默認添加到標題,而不是正文,或者我可以將它添加到兩個。我不能將它添加到正文中。

將它添加到兩個vs只是標題之間有什麼不同?

更新:

我能做到這一點,我只指定在規範的默認,而不是身體。或者我也可以在這兩個地方指定默認值。有什麼不同?

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; 
+0

TSQL特定於Microsoft。您可能想要修改該標籤。 – Paparazzi

+0

ahhh,對,你是...我一定是一廂情願的想法:) – kralco626

回答

5

如果你想使一個參數可選,那麼你必須指定一個默認值。如果默認值不在正文的聲明中,那麼我會很驚訝。

我已習慣於製作我的所有包規範聲明的完整副本的包體聲明以避免問題。

編輯:

由於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> 

這就是說,問題的答案至於什麼不同的是,似乎只在規範中或在兩個地方放置默認值 - 最終結果是相同的。我想重申我的信念,你應該把它放在兩個地方作紀錄。

+0

驚喜!大聲笑。你肯定可以在規範中有一個默認值,而不是在主體中。有人知道這兩者之間有什麼不同嗎? – kralco626

+0

顯然,它們必須在規範中,但在身體中是可選的。 – DCookie

+0

。我的問題是,它有不同之處嗎? – kralco626

1

在包中,您可以在規範或正文中使用默認變量/常量。就我個人而言,我把它們放在身體裏,因爲我不需要看規範就能知道發生了什麼;我知道官方Oracle對我不同意。在身體這應該是直接在create or replace

我有點困惑,你使用的單詞參數,雖然這意味着你傳遞這個函數/程序在你的包。如果您在包規範或正文中設置了全局變量,則根本不需要將其傳遞到任何位置。如果你正在改變一個全球化的局面,那麼你就會要求整整一堆的混亂,否則將會在一年之內向任何一個跟隨你的人贈送一個。

如果您僅將它用於一個函數/過程,則將其設置在對該特定元素的聲明中。

This應該有所幫助。

+0

你不能指定一個默認的身體參數,而不是規範... – kralco626

+0

也許我的更新將有助於澄清 – kralco626

+0

啊,在這種情況下@DCookie是正確的;絕對是爲了節省你自己的很多麻煩。 – Ben