当我尝试运行自定义PostgreSQL函数时出现此错误:
ERROR: query has no destination for result data
PostgreSQL函数对我来说非常新。我正在使用Navicat for PostgreSQL 11.0.17。
我有一个名为translation的表,有三列:id,english,français。以下是我在控制台窗口中创建函数的方法:
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')
^
当我从“设计功能”窗口调用它时,我会在顶部引用错误。
我特别想隔离translation_id,因为在此函数的最终版本中,我想将转换表中的最新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;
当我从“设计功能”面板运行它时,它表现正常,但是当我从控制台调用它时,我得到的错误与以前一样。
如果您可以推荐任何好的教程和示例来了解如何在postgres函数中正确使用变量,我将非常感激。
答案 0 :(得分:3)
在控制台中,您需要select
命令
select add_translation('one', 'un');
或
select * from 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中,setof
某些类型必须从查询“返回”
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;