事务导致语法错误
Transaction results in syntax error
这个函数在没有事务块的情况下创建正常。如下所示,我收到以下错误...
ERROR: syntax error at end of input LINE 27: $$
^
********** Error **********
ERROR: syntax error at end of input
如果我取出 'COMMIT' 和相应的 'BEGIN' 然后它运行正常。
这是为什么?
CREATE OR REPLACE FUNCTION ContentDelete (
creatorUserId BIGINT,
toDeleteContentId BIGINT)
RETURNS VOID
AS $$
BEGIN
BEGIN
IF (SELECT EXISTS(SELECT
*
FROM
tbl_content
WHERE
ContentId = toDeleteContentId
AND
UserId = creatorUserId
LIMIT 1) AS "exists")
THEN
DELETE FROM tbl_content WHERE ParentContentId = toDeleteContentId;
DELETE FROM tbl_content WHERE ContentId = toDeleteContentId;
END IF;
COMMIT;
END
$$
LANGUAGE plpgsql;
PostgreSQL 中的函数 运行 到处都是事务。它可以是隐式事务(由 Postgres 启动)或显式事务(由用户启动)。而且你不能提交或回滚这个事务,因为它是在函数外启动的。
如果您的函数没有引发异常,则结果将被提交(如果其他人没有引发异常)。如果您要强制回滚 - 引发异常。唯一的解决方案是回滚外部事务。你的函数在 PostgreSQL 中可以大大减少(虽然你的逻辑看起来很乱):
CREATE OR REPLACE FUNCTION ContentDelete (creatorUserId BIGINT,
toDeleteContentId BIGINT)
RETURNS VOID AS $$
BEGIN
DELETE FROM tbl_content
WHERE ContentId = toDeleteContentId
AND UserId = creatorUserId;
IF FOUND THEN
DELETE FROM tbl_content WHERE ParentContentId = toDeleteContentId;
END IF;
RETURN;
END;
$$ LANGUAGE plpgsql;
这个函数在没有事务块的情况下创建正常。如下所示,我收到以下错误...
ERROR: syntax error at end of input LINE 27: $$ ^ ********** Error ********** ERROR: syntax error at end of input
如果我取出 'COMMIT' 和相应的 'BEGIN' 然后它运行正常。
这是为什么?
CREATE OR REPLACE FUNCTION ContentDelete (
creatorUserId BIGINT,
toDeleteContentId BIGINT)
RETURNS VOID
AS $$
BEGIN
BEGIN
IF (SELECT EXISTS(SELECT
*
FROM
tbl_content
WHERE
ContentId = toDeleteContentId
AND
UserId = creatorUserId
LIMIT 1) AS "exists")
THEN
DELETE FROM tbl_content WHERE ParentContentId = toDeleteContentId;
DELETE FROM tbl_content WHERE ContentId = toDeleteContentId;
END IF;
COMMIT;
END
$$
LANGUAGE plpgsql;
PostgreSQL 中的函数 运行 到处都是事务。它可以是隐式事务(由 Postgres 启动)或显式事务(由用户启动)。而且你不能提交或回滚这个事务,因为它是在函数外启动的。
如果您的函数没有引发异常,则结果将被提交(如果其他人没有引发异常)。如果您要强制回滚 - 引发异常。唯一的解决方案是回滚外部事务。你的函数在 PostgreSQL 中可以大大减少(虽然你的逻辑看起来很乱):
CREATE OR REPLACE FUNCTION ContentDelete (creatorUserId BIGINT,
toDeleteContentId BIGINT)
RETURNS VOID AS $$
BEGIN
DELETE FROM tbl_content
WHERE ContentId = toDeleteContentId
AND UserId = creatorUserId;
IF FOUND THEN
DELETE FROM tbl_content WHERE ParentContentId = toDeleteContentId;
END IF;
RETURN;
END;
$$ LANGUAGE plpgsql;