私のデータベース・インタフェース・ライブラリjOOQでは、Oracle(またはDB2など)パッケージのサポートを追加したいと考えています。私はすでにストアド・プロシージャ/関数のサポートを実装しています。ここでは、ストアド・オブジェクトはすべて、生成されたJavaクラスとしてモデル化されています。例えば、この記憶された関数OracleパッケージとJavaパッケージ間のマッピング
CREATE FUNCTION f_author_exists (author_name VARCHAR2) RETURNS NUMBER;
このように使用することができるクラスを生成する(便利な方法の多くもある、注意、この例では、単に一般的な設計を示す):
// A new "function call instance". The function needs to be instanciated
// once per call
FAuthorExists f = new FAuthorExists();
// Set the function parameters on the call instance and call it
f.setAuthorName("Paulo");
f.execute(connection);
// Fetch the result from the function call instance
BigDecimal result = f.getReturnValue();
私がマッピングを選択した理由SQL関数 - >Javaクラスストアドプロシージャは、プロシージャをコールした後に1つずつフェッチできるようにする複雑な戻り値(複数のOUTまたはIN OUTパラメータ)を使用できるためです。
p.getOutParam1();
p.getOutParam2();
このデザインは、オーバーロードが不可能なストアドファンクション/プロシージャで正常に動作します。 Oracleの(またはDB2の)パッケージの中で、しかし、私は
CREATE PACKAGE my_package IS
FUNCTION f_author_exists (name VARCHAR2) RETURNS NUMBER;
FUNCTION f_author_exists (name VARCHAR2, country VARCHAR2) RETURNS NUMBER;
END my_package;
私は関数(またはプロシージャ)ごとにクラスを生成し、私はいくつかのFAuthorExists
Javaクラスとの名前の衝突を持つことになりますように、同じ名前を持ついくつかの機能を持つことができます。残念な解決策は、FAuthorExists2
,FAuthorExists3
のようなクラス名にインデックスを追加することです。もう一つの難解な解決策は、パラメータ名/型からある種のハッシュ値(または値そのもの)をFAuthorExistsVARCHAR2
、FAuthorExistsVARCHAR2VARCHAR2
などのクラス名に直接生成することです。明らかな理由から、いずれの解決策も望ましくない。
誰にもこの問題の簡単な解決策がありますか?このような関数名のオーバーロードの問題を引き起こさない、より優れた全体的なデザインのアイデアですか?
フィードバックが高く評価されました。
'実行() 'メソッドは、実際の呼び出しを行います。このメソッドは、関数の引数 'name'のために' setName() 'と呼ばれます。この例では、それをもっと明確にするように修正しました。あなたのアイデアは悪いものではありません。けれども、問題は非常に明確な引数セットでのオーバーロード関数名を持っている場合、それは可能である引数のどのような組み合わせで、見つけることが混乱になるかもしれないです。しかし、便利な方法では、実際に動作するかもしれません!引数の型ではなく名前で、実行時に –
@Lukasマッチングを正しいコールを決定するという考えのための+1は、私は私の提案によって意味したものだった - 私はそれが簡単になるかもしれないと思いました。私はどちらかというと原理的には可能だと思う。 –
引数の名前/種類/位置に基づいて関数を呼び出す方法についての良い実装を簡単に見つけることができます。しかし、難しいのは、生成されたコードを開発者に使いやすくすることです。だからこそ、私は生成されたメソッドで引数の名前を使用します –