1

update ステートメントを無限ループで実行する plpgsql 関数を作成する必要があります。

create function change_type() returns void as $$
begin
  loop  
    update table a set type = 1 where date < now(); 
  end loop;
end;
$$ LANGUAGE plpgsql;

この関数を呼び出すと、更新ステートメントは実行されませんが、ループが実行されていることがわかります。update ステートメントを単一のクエリとして実行したところ、機能しました。どうすればこの問題を解決できますか?

ありがとう

4

2 に答える 2

4

発生している問題は、PostgreSQL のストアド プロシージャが独自のトランザクションで自動的に実行されることです。したがって、更新行われますが、コミットされるまで表示されません。これは、ストアド プロシージャが終了したときに発生します (この場合は実行されません)。

これがもたらす実際的な影響は、アクティブなトランザクションが大きくなりすぎると、最終的にサーバーがディスク容量またはメモリ、またはその両方 (またはその他の組み込みの安全制限) を使い果たすことです。

解決策は、@JackManey が提案したように、戦略を完全に再考することです。あなたが達成しようとしていることを説明できれば、次の給料の小切手でそれを達成するためのより良い方法があると思います.

于 2012-04-23T08:02:30.480 に答える
3

あなたが探しているのは、特定の時間に(繰り返し)タスクをスケジュールするためのcronジョブだと思います。UNIX/LINUXシステムで試してみてください。できればシステムユーザーpostgresとして。man crontab

5分ごとにクエリを実行するには、cronテーブルに次のような行を入力します。私はcrontab -eLINUXの下でcronジョブを編集するために使用します:

* 5 * * * psql mydb -c 'UPDATE TABLE a SET type = 1 WHERE date < now()'

より複雑なジョブがある場合は、複数のSQLコマンドを使用してシェルスクリプトを作成し、次のように呼び出します。

* 5 * * * psql mydb -f '/path/to/my_script.sh'

または、plpgsql関数を作成して呼び出します。

* 5 * * * psql mydb -c 'SELECT myfunc()'

スーパーユーザーpostgresがパスワードなしでログインできるようにシステムを設定します(デフォルト)。


または、pgAdminに付属しているpgAgentをご覧ください。

于 2012-04-23T19:07:31.260 に答える