2

1つの入力値と2つの出力パラメーターを受け取り、実行時に値を返すストアドプロシージャがあります

インターネット上で私はCallを使用して参照を見ました

CallableStatement cstmt = conn.prepareCall("{call ? = spName(?, ?, ?)}");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setObject(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.NVARCHAR);
cstmt.registerOutParameter(4, Types.NVARCHAR);

しかし、これは私にエラーを与えます

"Incorrect syntax near '{'"

次に、SQLManagementStudioで生成されたSQLコードを使用することにしました。

CallableStatement cstmt = conn.prepareCall("exec ? = spName ?, ?, ?");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setObject(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.NVARCHAR);
cstmt.registerOutParameter(4, Types.NVARCHAR);

しかし、これは私にエラーを与えます

"Incorrect syntax near '='"

これは、クエリがに変換されるためだと思います

"exec @P1 OUT = spName @P2, @P3 OUT, @P4 OUT" 

また、「OUT」は「=」の前に表示されるため、SQLManagementStudioでも機能しません。

そして、それはどちらの方法でも機能しないので、これは私にアイデアを残します。

助言がありますか?

ありがとうございました!

4

2 に答える 2

4

ストアドプロシージャを呼び出すための構文は次のとおりです。

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

callしたがって、最初の例では、戻り値の前に置くため、JDBC呼び出しエスケープのパーサーで例外がトリガーされます。2番目の問題についてはよくわかりません。

したがって、最初の例を次のように変更すると、機能することが期待されます。

CallableStatement cstmt = conn.prepareCall("{?=call spName(?, ?, ?)}");

特にMicrosoftJDBCドライバーの詳細については、MSDNを参照してください。

于 2013-02-12T20:08:09.080 に答える
0

また、引数のないストアドプロシージャの場合、次のようになります...

this.connection.prepareCall("{call dbo.storedProcedure()}")
于 2015-06-23T17:48:38.287 に答える