Function 在PostgreSQL函数中使用变量

Function 在PostgreSQL函数中使用变量,function,postgresql,variables,navicat,Function,Postgresql,Variables,Navicat,我在尝试运行自定义PostgreSQL函数时遇到此错误: ERROR: query has no destination for result data PostgreSQL函数对我来说是非常新的。我正在为PostgreSQL 11.0.17使用Navicat 我有一个名为translations的表,有三列:id、english、français。以下是我如何在Console窗口中创建我的函数: test=# CREATE FUNCTION add_translation(english

我在尝试运行自定义PostgreSQL函数时遇到此错误:

ERROR:  query has no destination for result data
PostgreSQL函数对我来说是非常新的。我正在为PostgreSQL 11.0.17使用Navicat

我有一个名为translations的表,有三列:id、english、français。以下是我如何在Console窗口中创建我的函数:

test=# CREATE FUNCTION add_translation(english varchar(160), français varchar(160))
  RETURNS integer 
  AS $BODY$
DECLARE
  translation_id integer;
BEGIN
  INSERT INTO translations
          ("english", "français")
   VALUES (english, français)
RETURNING id
       AS translation_id;
   RETURN translation_id;
END;
$BODY$
LANGUAGE plpgsql;
Query OK, 0 rows affected (0.02 sec)
当我从控制台窗口调用它时,会收到一条不太有用的错误消息

test=# add_translation('one', 'un');
ERROR:  syntax error at or near "add_translation"
LINE 1: add_translation('one', 'un')
        ^
当我从Design Function窗口调用它时,我会在顶部引用错误

我特别想隔离translation_id,因为在这个函数的最终版本中,我想将translation表中最新的id插入到另一个表中的新记录中

我也尝试过:

DECLARE
  translation_id integer;
BEGIN
  INSERT INTO translations
          ("english", "français")
   VALUES (english, français);
  SELECT LASTVAL() INTO translation_id;
  RETURN translation_id;
END;
当我从Design Function面板运行它时,它的行为是正确的,但是当我从控制台调用它时,我得到与以前相同的错误


如果您能推荐一些好的教程和示例来理解如何在postgres函数中正确使用变量,我将不胜感激。

在控制台中,您需要一个
选择
命令

select add_translation('one', 'un');

您的函数可以是纯SQL

create or replace function add_translation (
    english varchar(160), français varchar(160)
) returns integer as $body$
    insert into translations ("english", "français")
    values (english, français)
    returning id as translation_id;
$body$ language sql;
在plpgsql中,必须“从”查询“返回”某些类型

create or replace function add_translation (
    english varchar(160), français varchar(160)
) returns setof integer as $body$
begin
    return query
    insert into translations ("english", "français")
    values (english, français)
    returning id as translation_id;
end;
$body$ language plpgsql;
或者,要返回单个值,请在CTE中插入

create or replace function add_translation (
    english varchar(160), français varchar(160)
) returns integer as $body$
declare
  translation_id integer;
begin
    with i as (
        insert into translations ("english", "français")
        values (english, français)
        returning id
    )
    select id into translation_id from i;
    return translation_id;
end;
$body$ language plpgsql;
create or replace function add_translation (
    english varchar(160), français varchar(160)
) returns integer as $body$
declare
  translation_id integer;
begin
    with i as (
        insert into translations ("english", "français")
        values (english, français)
        returning id
    )
    select id into translation_id from i;
    return translation_id;
end;
$body$ language plpgsql;