事务导致语法错误

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;