【问题标题】:Postgresql create function syntax error near BEGINPostgresql 在 BEGIN 附近创建函数语法错误
【发布时间】:2021-06-20 03:54:06
【问题描述】:

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

CREATE OR REPLACE FUNCTION test(key1 text)
RETURNS void AS $$ 
BEGIN
  INSERT INTO table1(c1) VALUES($1);
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($1);
    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($1);
    END;
    $$ LANGUAGE ''plpgsql'';');
    END IF;
END $$;

如何通过检查迁移历史表来创建 SQL 语句来创建/替换函数?

【问题讨论】:

  • $$ 美元报价更改为函数内部的其他位置,例如$other$。在线上的$$ RETURNS void AS $$ 正在终止DO $$ 报价。
  • 为什么会阻塞呢? create or replace 将始终有效,除非您更改签名或返回类型。另外(不相关):语言名称是一个标识符。不要将其括在单引号中。这已被弃用,并且可能在未来的版本中不起作用。请改用language plpgsql
  • @a_horse_with_no_name do begin 语句由迁移实用程序生成。

标签: sql postgresql entity-framework-core plpgsql


【解决方案1】:

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

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($1);
    END;
    $$ LANGUAGE ''plpgsql'';');
    END IF;
END $body$;

【讨论】:

    猜你喜欢
    • 2018-03-10
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2013-09-10
    相关资源
    最近更新 更多