DEFAULT和赋值运算符之间的PL / SQL差异

时间:2016-09-14 15:43:45

标签: oracle plsql

我是PL / SQL中的新手,这个问题看起来可能是幼稚的'所以我提前抱歉,但Google根本没有帮助我......

以下程序有什么区别吗?

public final class Card<S,V> {
    final S suit;
    final V value;
    public Card(S suit, V value) {
        this.suit = suit;
        this.value = value;
    }
    @Override
    public String toString() {
        return suit+" "+value;
    }
}
public class Deck<S extends Enum<S>,V extends Enum<V>> {
    protected final Set<S> allSuits;
    protected final Set<V> allValues;
    protected final List<Card<S,V>> allCards;

    public Deck(Class<S> suitType, Class<V> valueType) {
        Set<S> suits =EnumSet.allOf(suitType);
        Set<V> values=EnumSet.allOf(valueType);
        List<Card<S,V>> cardList=new ArrayList<>(suits.size()*values.size());
        for(S suite: suits){
            for(V value: values) {
                cardList.add(new Card<>(suite, value));
            }
        }
        allSuits =Collections.unmodifiableSet(suits);
        allValues=Collections.unmodifiableSet(values);
        allCards =Collections.unmodifiableList(cardList);
    }

    @Override
    public String toString() {
        return getClass().getSimpleName()+allCards;
    }
}
public class PokerDeck extends Deck<PokerDeck.Suits,PokerDeck.Values> {
    enum Suits  { SPADES, HEARTS, DIAMONDS, CLUBS }
    enum Values { ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,
                  EIGHT, NINE, TEN, JACK, QUEEN, KING }

    public PokerDeck(){
        super(Suits.class, Values.class);
    }
}
public class CarteBriscolaDeck
       extends Deck<CarteBriscolaDeck.Suits,CarteBriscolaDeck.Values> {
    enum Suits  { COPPE, DENARE, BASTONI, SPADE }
    enum Values { ASSO, DUE, TRE, QUATTRO, CINQUE, SEI, SETTE, FANTE, CAVALLO, RE }

    public CarteBriscolaDeck(){
        super(Suits.class, Values.class);
    }
}

我已经检查了它们,所以当我在没有args的情况下调用它们时输出为Procedure p1(a Number DEFAULT 0) Is Begin DBMS_OUTPUT.put_line(a); End; Procedure p2(a Number := 0) Is Begin DBMS_OUTPUT.put_line(a); End; ,但我不确定是否有任何副作用。

2 个答案:

答案 0 :(得分:2)

如果您关注Oracle的documentation

  

您可以使用关键字DEFAULT而不是赋值运算符   初始化变量。您也可以使用DEFAULT进行初始化   子程序参数,游标参数和用户定义的字段   记录。

     

对具有典型值的变量使用DEFAULT。使用   变量的赋值运算符(例如计数器和累加器)   没有典型的价值。

DECLARE
    blood_type CHAR DEFAULT 'O';         -- Same as blood_type CHAR := 'O';
    hours_worked    INTEGER DEFAULT 40;  -- Typical value
    employee_count  INTEGER := 0;        -- No typical value

  BEGIN
    NULL;
  END;
  /

所以我猜内部是一样的。

答案 1 :(得分:2)

让我们在撰写本文时查看最新Oracle版本(12c R1)的文档。你明确要求子程序参数,所以让我们首先考虑它。

Default Values for IN Subprogram Parameters

  

声明正式的IN参数时,可以为其指定默认值。具有默认值的形式参数称为可选参数,因为其对应的实际参数在子程序调用中是可选的。如果省略实际参数,则调用将默认值分配给形参。

文档没有提及default个关键字,但它仍然有效。示例(在12c R1中):

declare
  function f1(a in number)           return number is begin return a; end;
  function f2(a in number := 2)      return number is begin return a; end;
  function f3(a in number default 3) return number is begin return a; end;
begin
  dbms_output.put_line(f1(1));
  dbms_output.put_line(f2);
  dbms_output.put_line(f3);
end;
/

按预期打印1,2,3。

然而,由于在授权文档中未提及,我不鼓励在此上下文中使用default关键字。

其他有趣的背景是Initial Values of Variables and Constants

  

要指定初始值,请使用赋值运算符(:=)或关键字DEFAULT,后跟表达式。

这是唯一提及default个关键字的时间。所有文档示例仅使用分配。

<强>结论

技术上default关键字和分配是相同的,并且在两个上下文中都有效,但在文档中只提升了分配。我认为Oracle在这种情况下有效地弃用了default关键字,因此我不推荐在新的PL / SQL代码中使用它。 Assigment操作员可以毫不费力地完成同样的工作。