PL/SQL のサブプログラムのオーバーロード

現在では一般的な機能であるが PL/SQL においても同一の名前を持つプロシージャ、ファンクション、メソッドを複数定義することができる。

オーバーロードの用途として代表的なものは機能的な違いと高速化のための分岐が考えられる。

機能的な違いは例えば ADD というメソッドにおいて、「ある数に別のある数を足す」という 加算(ADD)ファンクションと「ある日付にある日数を足す」という加算ファンクションの同名のファンクションが2つ存在できるということである。(スタンドアロン・サブプログラム には使用できない)

高速化のためのオーバーロードとしてはある複雑な計算式を求めるファンクションを作成したときに呼び出すライブラリを整数演算処理と浮動小数点処理で分けることができる。(整数用のライブラリの方が高速に演算処理できるようにチューニングされているとする)

例) OVERLOADING パッケージに NUMBER 用と PLS_INTEGER 用の COMPLEX ファンクションを用意する。

CREATE OR REPLACE PACKAGE RIVUS.OVERLOADING
IS
    FUNCTION COMPLEX(N NUMBER)
    RETURN NUMBER;
 
    FUNCTION COMPLEX(N PLS_INTEGER)
    RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY RIVUS.OVERLOADING
IS
-- NUMBER 用  常に0を戻す
    FUNCTION COMPLEX(N NUMBER)
    RETURN NUMBER
    IS
    BEGIN
        RETURN 0;
    END;
-- PLS_INTEGER 用 常に1を戻す
    FUNCTION COMPLEX(N PLS_INTEGER)
    RETURN NUMBER
    IS
    BEGIN
        RETURN 1;
    END;
END;
/
SQL> set serveroutput on
SQL> declare
  2     n number := 1 ;
  3     p pls_integer := 2;
  4  begin
  5     dbms_output.put_line(overloading.complex(n));
  6     dbms_output.put_line(overloading.complex(p));
  7  end;
  8  /
0
1

ちなみに SQL から呼び出すと NUMBER 型のファンクションが呼ばれる。(SQL に PLS_INTEGER が存在しない)

 


日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)