在plpgsql存储过程中,我试图根据表A
中的活动列写入主机列表(使用PL / Proxy - 与此问题无关),其中A
包含列主机和列活动,指示主机是否处于活动状态且应写入({1}中的每一行} A
,active = TRUE
)。函数write_to_host(A.host)
从write_hosts
表读取,仅选择标记为A
的主机。
在尝试写入其中一个主机时捕获异常时,我想更新表active=TRUE
,设置A
,并继续尝试写入其他主机。看起来类似于以下内容,我想尝试插入,失败,更新A.active = FALSE WHERE A.host = <badhost>
表将行标记为非活动状态,然后递归调用A
函数,该函数应该看到剩余的活动条目并且只尝试写入它们:
write_doc
这导致无限循环,我必须使用CNTRL-C。
当我注释掉CREATE OR REPLACE FUNCTION write_doc(args...)
RETURNS SETOF JSON AS $$
BEGIN
SELECT * FROM write_to_host(args...);
RETURN NEXT ARRAY_TO_JSON(ARRAY[TRUE::text, 'inserted']);
RETURN;
EXCEPTION WHEN OTHERS THEN
IF SQLERRM ~ '.+Connection refused.+' THEN
EXECUTE 'UPDATE hosts SET active = FALSE WHERE host = ''' || _bad_host || '''';
END;
RETURN QUERY SELECT * FROM write_doc(args...);
$$ LANGUAGE plpgsql;
位时,停用适用于相关主机。当我将其保留时,表RETURN QUERY
不会更新(至少在我停止执行程序之前不会更新)。
使用带有LOOP的替代方法,它仍然无限循环为我,并且表A
没有更新...类似于以下内容,其中 RETURN 语句应该退出循环:
A
我知道所有存储过程都是事务性的,但是认为表会在事务中更新并且可以通过存储过程中运行的代码查看,猜猜我错了吗?
有人可以给出任何建议/信息以引导我朝着正确的方向前进吗?有任何问题请不要犹豫