问题描述
我有这样的程序
CREATE OR REPLACE PROCEDURE "TRY-DQ-7a28fd25d95c0969bff16b963af1c832"()
LANGUAGE plpgsql
AS $$
DECLARE "Continue" boolean :=True;
BEGIN
COMMIT;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE;
INSERT INTO test1 (a) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
COMMIT;
END
$$;
我想使用PG-promise执行什么,此过程需要自动提交ON才能在pgAdmin上至少正确执行,我如何在pg-promise中实现相同?或它下面的驱动程序?
更新:
这似乎是PG中的错误/或者是我误会的东西(这是通过pg-promise出现的,所以首先我认为这与它有关)
设置:
CREATE OR REPLACE PROCEDURE "SP"(n integer)
LANGUAGE plpgsql
AS $$
BEGIN
FOR i IN 0..n LOOP
COMMIT;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE;
CREATE TEMP TABLE "x" (i integer) ON COMMIT DROP;
END LOOP;
END
$$;
pg-promise调用:
setInterval(() => {
pgWriter.any(`
DO
$$
BEGIN
CALL "SP"(10);
END
$$;`)
.then(console.log)
.catch(console.error);
},1000);
或 pgAdmin调用:
DO
$$
BEGIN
CALL "SP"(10);
END
$$;
结果:第一次调用失败,并显示以下消息( Only First ),在正常执行的同一连接上再次运行它。
ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any query
CONTEXT: sql statement "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE"
PL/pgsql function "Q"."SP"(integer) line 5 at SET
sql statement "CALL "Q"."SP"(10)"
PL/pgsql function inline_code_block line 3 at CALL
sql state: 25001
分析:到目前为止,我认为这应该是我的代码中的一个问题,也许他们在第一次运行时就进行了设置,这有助于他们以后多次运行(某些状态),也有趣的是,两行似乎很重要
-
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE;
-
CREATE TEMP TABLE "x" (i integer) ON COMMIT DROP;
如果社区对此一无所知,或者我的代码中出现错误,将对您有所帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)