PLはパッケージ内のプログラムをオーバーロードすることを許可します。オーバーロードとは、2つ以上のプログラムが同じ名前を持ちながら、異なるパラメータ変数、パラメータの順序、またはパラメータのデータ型を持つことを指します。呼び出し時には、渡されたパラメータの型に基づいてプログラムが選択されます。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
以下はパッケージヘッダーの例です。パラメータを数値型または文字列型で渡すことで、関数 query_obdept の使用方法を決定し、その後パッケージ本体の定義でそれぞれの機能を実装します。
CREATE OR REPLACE PACKAGE obdemo_pack1
IS
DeptRec obdept%ROWTYPE;
v_sqlcode NUMBER;
v_sqlerr VARCHAR2(2048);
FUNCTION query_obdept(dept_no IN NUMBER)
RETURN INTEGER;
FUNCTION query_obdept(dept_no IN VARCHAR2)
RETURN INTEGER;
END obdemo_pack1;
/
プログラムのオーバーロードにおけるクライアント側からの呼び出し時の注意点
JDBCなどのクライアントドライバーを介して、パッケージ内でオーバーロードされたストアドプロシージャや関数を呼び出す場合、ドライバーがExecuteフェーズでOUTパラメータやNULLパラメータのデータ型をOBServerに送信しなかったり、OBServerのバージョンがパラメータ型をサポートしないPrepareをサポートしなかったりすると、システムがパラメータ型に基づいて正しいオーバーロード版をマッチングできない可能性があります。
V4.4.2 BP2以前では、このシナリオでシステムはデフォルトで最初の同名プログラムを実行するため、実行結果が予想と異なり、それが検知しにくい場合がありました。V4.4.2 BP2以降では、このシナリオでシステムは直接エラーを返し、呼び出すオーバーロード版を特定できないことを示します。
この問題を回避するため、以下を推奨します:
- OceanBase Connector/J V2.4.16以降のバージョンを使用してください。
- JDBC URLで
obIncludeOutOrNullParamTypeInfo=trueパラメータを有効にしてください。 - OUTパラメータに対しては明示的に
registerOutParameter()を、NULLパラメータに対しては明示的にsetNull()を呼び出し、SQL型を指定してください。
例:
// JDBC URLでobIncludeOutOrNullParamTypeInfoを有効にする
String url = "jdbc:oceanbase://localhost:2881/test?obIncludeOutOrNullParamTypeInfo=true";
try (Connection conn = DriverManager.getConnection(url, user, password);
CallableStatement cs = conn.prepareCall("{call obdemo_pack1.get_dept_info(?, ?)}")) {
// NUMBER型を渡し、OUTパラメータに型を登録する
cs.setInt(1, 100);
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
String deptName = cs.getString(2);
// NULLパラメータを渡す際、SQL型を明示的に指定する
cs.setNull(1, Types.NUMERIC);
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
}