【问题标题】:Syntax error when declaring a postgres variable [duplicate]声明postgres变量时出现语法错误[重复]
【发布时间】:2020-04-16 21:08:02
【问题描述】:

尝试在 Postgresql 中声明变量时遇到 SQL 错误。在下面查看我的代码:

declare number int8;

begin
 select ID into number from public.People p where p."Name" = 'Jeff';
 if found then
   insert into public.Friends ("PeopleID", "Name", "PhoneNumber")
   values (number, 'Jeff', '205-123-4567')
 end if;
end;

当我尝试运行它时,它会返回此异常:

SQL 错误 [42601]:错误:“int8”或附近的语法错误

我预计只有一个名为“Jeff”的条目,因此我不必担心“number”可能有多个值。

【问题讨论】:

  • 嘿 Colby,这些命令不是 SQL。您可能想将此代码放在 plpgsql 函数或过程中:)

标签: sql postgresql stored-procedures sql-insert plpgsql


【解决方案1】:

您不能在 Postgres 中以纯 SQL 声明变量,这与 SQL Server 或 MySQL 等其他 RDBMS 不同。

当我将您的代码放在 plgpsql 过程中时,您的代码在 this Postgres 12 db fiddle 中正确编译(不过,您应该考虑使用另一个名称 number 作为变量)。

create procedure test_proc() language plpgsql AS '
declare number int8;
begin
    select ID into number from people p where p."Name" = ''Jeff'';
    if found then
        insert into friends ("PeopleID", "Name", "PhoneNumber")
            values (number, ''Jeff'', ''205-123-4567'');
    end if;
end;
';

或者在 Postgres a void function:

create function test_proc() returns void language plpgsql AS '
declare number int8;
begin
    select ID into number from people p where p."Name" = ''Jeff'';
    if found then
        insert into friends ("PeopleID", "Name", "PhoneNumber")
            values (number, ''Jeff'', ''205-123-4567'');
    end if;
end;
';

您可能还想考虑这个 insert ... select 查询,它在单个数据库调用中达到相同的目的:

insert into friends("PeopleID", "Name", "PhoneNumber")
select ID, "Name", '205-123-4567' from people where p."Name" = 'Jeff'

【讨论】:

  • 嗯,虽然这看起来不错,但它现在返回一个异常,内容为“SQL 错误 [42601]:错误:在“过程”或附近出现语法错误”
  • @ColbyWilloughby:您可以看到它正在 DB Fiddle 中编译...您正在运行哪个版本的 Postgres?
  • 看起来像 PostgreSQL 10.9
  • @ColbyWilloughby:好的 Postgres 10 没有存储过程,因此您可以使用函数(请参阅我更新的答案)。但我建议在我的回答结束时考虑该查询。它无需功能/程序即可完成相同的工作。
  • 正要说同样的话!看起来有效!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多