0

MySQL から PosgreSql に移行中ですが、バッチ更新で呼び出したい proc/function に若干の問題があります。

値を void と宣言しても常に値を返すように見える Postgresql 関数で更新を実行するにはどうすればよいですか。

これは、問題を説明するための単純な例です。

CREATE OR REPLACE FUNCTION update_function(
  IN i_id bigint)
  RETURNS void AS $$
  DECLARE
    d_id bigint;
  BEGIN
    UPDATE test_table set id = '' where id = i_id;
  RETURN;
END;
$$ LANGUAGE plpgsql;

SpringTemplate.update() メソッドを使用してこれを呼び出すと、「org.postgresql.util.PSQLException: 何も期待されていないときに結果が返されました」というエラーが発生します。update を呼び出して値を返すと、エラーがスローされることは理解しています。

私の質問は、postgresql関数が値を返さない方法はありますか、それともバッチ更新を行う別の方法を見つける必要がありますか? 関数を使用して更新を行う理由は、proc/関数で更新されるテーブルが多数あるためです。上記は簡単な説明です。

別の方法として、入力値の配列を解析してそれらをループすることもできます。

4

1 に答える 1

1

私が理解しているように、あなたの問題は、関数が結果セットを返さなかったとしても、PostgreSQL が結果セットに行を追加することです。実際、簡単なテストで、これらが PostgreSQL から null を返していることがわかりました。

私がしていること (そして、これが Spring のやり方ではないかもしれないことを認識しています) は、必要なことを実行し、有用な値を返す関数を用意することです。次に、その値を取得して、サニティ チェックの目的で使用します。たとえば、更新された行の総数 (または、おそらく最も親の行の最新バージョン) を返し、それをアプリケーションに渡して使用することができます。

ただし、はい、これを行うには別の方法を見つける必要があります。

于 2013-10-28T08:48:45.430 に答える