PL/SQL プログラミング入門(1) > 位置表記法と名前表記法

ストアドプロシージャの実行(位置表記法と名前表記法)

PL/SQL のプログラム からの プロシージャ、ファンクション、パッケージ などのサブプログラムの呼び出しには位置表記法、名前表記法、 および、両方を併用したパラメータの表記をすることができる。

位置表記法 (Positional Notation)

多くの開発言語で位置表記法が利用されている。 ほとんどの ファンクションやプロシージャの呼び出し では位置表記法が適していると思われる。

※ Oracle 10g までは SQL の呼び出しは位置表記法のみに限定されていたが Oracle 11g からは SQL の呼び出しにも位置表記法および両方を併用した混合表記も可能。 Oracle 11g

位置表記法による記述例
PRODUCT(P_NUM1 IN NUMBER,P_NUM2 IN NUMBER) を呼び出す例

x := PRODUCT(1,2) 

名前表記法 (Named Notation)

一般的に名前表記法は位置表記法に比べてソースコードが長くなるが、いくつかのケースでメリットがある。

  • パラメータに関数名から推測しにくい リテラル を指定している場合(ソースコードを判読しやすい)
  • 多くのオプションパラメータがある場合

名前表記法による記述例
PRODUCT(P_NUM1 IN NUMBER,P_NUM2 IN NUMBER) を呼び出す例

x := PRODUCT( P_NUM1=>1, P_NUM2=>2) 
または
x := PRODUCT( P_NUM2=>2, P_NUM1=>1)

ファンクションの本体でどちらの呼び出し方法を使用する。といった指定は必要ない。

ほとんどのパッケージにおいて位置表記法が使用できる、しかし一部には名前表記法しか受け付けないプロシージャ、ファンクションもある。
今のところ知っているのは下のパッケージだけであるが、他にもいくつかあるのではないかと思う。

  • DBMS_OBFUSCATION_TOOLKIT の ENCRYPT や DECRYPTO の RAW と VARCHAR2 の オーバーロード
    PL/SQL の データ型で RAW 型は VARCHAR2 のサブタイプであるため、位置表記法では引数が RAW か VARCHAR2 かを判別できない(※)ので 「PLS-00307: このコールに一致する'xxx' が複数宣言されています。」状態になる。
    補足:Oracle 10g では DBMS_CRYPTO を使った方がよいだろう。

(※) RAW の定義は 「subtype RAW is VARCHAR2;」と VARCHAR2 のサブタイプであるために起こる。

結合演算子 =>

オラクルの結合演算子(=>)は、結合演算子の左右に指定した2つのオペランドから「引数」を生成する演算子である。 ⇒ 比較演算子(単純比較条件グループ比較条件

結合演算子の左に「パラメータの名称」、右に「パラメータの値」を指定する。

結合演算子という名前は Association Operator の日本語訳である。

仮パラメータと実パラメータを関連付ける (Association) 演算子 (operator) で結合演算子であり、JOIN という意味は含まれていない。
個人的には「関連付け演算子」の方が体をあらわしているのではないかと思われる。 (連想配列(Associative Array)=結合配列 と同じ訳し方をしている都合があるのだろう)

混合表記法(Mixed Notation:位置表記法と名前表記法の併用)

最初は位置表記で記述していき、途中から名前表記法にするようなことも可能である。Mixed Notation これは、先頭の幾つかのパラメータが必須で後方に多数の任意指定のパラメータがあるときに利用すると便利だろう。

x := function_y(1, 2, 3, opt1=> 18, opt3=> 13)

但し、この例のように位置表記法にマジックナンバーを埋め込んだり、名前表記法でも optXX などの 抽象的な仮パラメータの名前をつけると双方の表記法によるメリットは減少し、ソースコードを読みやすくする事にも貢献しない。



日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト