かなり複雑なストアド プロシージャとして始まったものは、非常に単純なユース ケースに要約され、期待どおりに機能していないようです。
私のテストでは、ストアド プロシージャは次のようになります。
CREATE OR REPLACE PROCEDURE proc_test(
v_someString varchar2
) as
BEGIN
dbms_output.put_line('test');
END;
呼び出し可能なステートメント API を使用して、Java からこのストアド プロシージャを呼び出すことができます。
java.sql.CallableStatement stmt = conn.prepareCall("call proc_test(?)");
stmt.setObject(1,null);
stmt.execute();
上記は期待どおりに機能します。メソッドが実行され、正常に完了します。ここがトリッキーになります。次のようなより複雑な構造を渡すことができるように、オラクル オブジェクト タイプのセットを作成しました。
CREATE OR REPLACE
type SOMETYPE_TYPE force UNDER BASE_TYPE (value varchar2(255),
CONSTRUCTOR FUNCTION SOMETYPE_TYPE RETURN SELF AS RESULT) NOT FINAL;
次のように、これらの型をパラメーターとして受け入れるように手順を変更するだけです。
CREATE OR REPLACE PROCEDURE proc_test(
v_someString SOMETYPE_TYPE
) as
BEGIN
dbms_output.put_line('test');
END;
オラクルは壊れますPLS-00306: wrong number or types of arguments in call to 'CNV_CREATE_PERSON'
何を与える?null を値として別のプロシージャからこのプロシージャを呼び出すと、正常に動作します。Java API から呼び出すだけで壊れます。
解決策についてドキュメントを精査してきましたが、見つかりません。おそらく、賢明で学識のある皆さんの 1 人が、私を正しい方向に向けてくれるかもしれません。
ありがとう