【发布时间】:2012-01-31 14:44:43
【问题描述】:
在我的代码的不同部分,我必须在出现异常后重试事务。但我不知道该怎么做。 这是我的测试功能:
CREATE OR REPLACE FUNCTION f() RETURNS VOID AS $$
DECLARE
user_cur CURSOR FOR SELECT * FROM "user" WHERE id < 50 limit 10;
row RECORD;
counter INTEGER DEFAULT 0;
dummy INTEGER DEFAULT 0;
BEGIN
RAISE INFO 'Start... ';
OPEN user_cur;
LOOP
FETCH user_cur INTO row;
EXIT WHEN row IS NULL;
BEGIN
UPDATE "user" SET dummy = 'dummy' WHERE id = row.id;
counter := counter + 1;
dummy := 10 / (5 % counter);
RAISE NOTICE 'dummy % , user_id %', (5 % counter), row.id;
EXCEPTION WHEN division_by_zero THEN
--What should I do here to retry transaction?
END;
END LOOP;
RAISE INFO 'Finished.';
RETURN;
END;
$$ LANGUAGE plpgsql;
【问题讨论】:
-
为什么不检查以避免条件或句柄将异常返回给调用它的代码?
-
遇到异常块时事务不会中止,只是数据库更改到上面的BEGIN。见postgresql.org/docs/9.1/static/…
-
我知道 =) 我需要像 GOTO 这样的东西来再次执行
UPDATE "user" SET dummy = 'dummy' WHERE id = row.id;,在当前迭代中使用当前 row.id
标签: postgresql exception stored-procedures rollback savepoints