PostgreSqlのストアドファンクションで PostgreSqlのストアドファンクションで連続的に複数のテーブルに書き込みを行う際に、 2つめ以降の書き込みで失敗しても、全部無かった事にしたいのですが、 どういう処理が必要でしょうか、具体的なコードを教えて下さい。 トランザクションの定義とロールバックの話です。 外部のアプリ(VB)から呼び出して使います。 何も書かない場合で、普通に処理が成功した場合、コミットされます。 1つ目の書き込みで失敗した場合は、そこで終了するので、それ以降は処理は行われません。 1つ目の書き込みで成功し、2つめの書き込みで失敗した場合、1つ目の書き込みをロールバックしたいのですが、 何も書かなければ、どうなりますか? ストアドファンクション内の書き込みは全てロールバックされますか? それとも、1つ目の書き込みはコミットされますか? また、もし後者なら、どう書けば全てロールバックできますか? CREATE OR REPLACE FUNCTION function1() RETURNS text AS $BODY$ DECLARE result text := null; BEGIN INSERT INTO tb1( item1 ) VALUES ( ,1 ); INSERT INTO tb2( item1 ) VALUES ( ,2 ); RETURN result; EXCEPTION WHEN others THEN SELECT SQLSTATE INTO result; RETURN result; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION function1() OWNER TO role1; COMMENT ON FUNCTION function1() IS 'ストアドテスト';
↧