Postgresql 在 BEGIN 附近创建函数语法错误

Postgresql create function syntax error near BEGIN

这是我试图通过迁移脚本执行的功能。

CREATE OR REPLACE FUNCTION test(key1 text)
RETURNS void AS $$ 
BEGIN
  INSERT INTO table1(c1) VALUES();
END;
$$ LANGUAGE 'plpgsql';

上面的脚本执行成功,但是当我尝试使用 .NET Core 幂等迁移脚本时,它给出了一个错误 ERROR: syntax error at or near "BEGIN"

这是迁移脚本。

DO $$
BEGIN
    IF NOT EXISTS(SELECT 1 FROM __EFMigrationsHistory WHERE "MigrationId" = 'migrationid') THEN
    CREATE OR REPLACE FUNCTION test(key1 text)
    RETURNS void AS $$ 
    BEGIN
      INSERT INTO table1(c1) VALUES();
    END;
    $$ LANGUAGE 'plpgsql';
    END IF;
END $$;

我也尝试添加 EXECUTE 仍然是同样的错误。

DO $$
BEGIN
    IF NOT EXISTS(SELECT 1 FROM __EFMigrationsHistory WHERE "MigrationId" = 'migrationid') THEN
    EXECUTE('CREATE OR REPLACE FUNCTION test(key1 text)
    RETURNS void AS $$ 
    BEGIN
      INSERT INTO table1(c1) VALUES();
    END;
    $$ LANGUAGE ''plpgsql'';');
    END IF;
END $$;

如何通过检查迁移历史 table 为 create/replace 函数创建 SQL 语句?

解析器对美元引号的重复使用感到困惑。只需给其中之一一个别名就可以了,例如

DO $body$
BEGIN
    IF NOT EXISTS(SELECT 1 FROM __EFMigrationsHistory WHERE "MigrationId" = 'migrationid') THEN
    EXECUTE('CREATE OR REPLACE FUNCTION test(key1 text)
    RETURNS void AS $$ 
    BEGIN
      INSERT INTO table1(c1) VALUES();
    END;
    $$ LANGUAGE ''plpgsql'';');
    END IF;
END $body$;