以下是我所拥有的函数的简化版本:
CREATE OR REPLACE FUNCTION my_funct(user_id integer)
RETURNS integer AS
$BODY$
DECLARE
my_var integer;
BEGIN
//....................
if not exists (select * from table1) then
return 0;
end if;
my_var := (SELECT COUNT(*) FROM table2
inner join ..............
);
RETURN (select field1 from table3) - my_var;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION my_funct(integer)
OWNER TO postgres;
但我从Play框架调用,我收到错误:
[PSQLException: ERROR: query has no destination for result data
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Where: PL/pgSQL function my_funct(integer) at SQL statement]
更新
------------------------------------------------
if not exists (select * from table1) then
select try_to_update_table1(user_id); -- probably the cause. only updates the table1
end if;
if not exists (select * from table1) then
return 0;
end if;
------------------------------------------------
答案 0 :(得分:1)
CREATE OR REPLACE FUNCTION my_funct(user_id integer) RETURNS integer AS
$BODY$
DECLARE
my_var integer;
BEGIN
//....................
PERFORM * FROM table1;
IF NOT FOUND THEN
RETURN NULL;
END IF;
SELECT COUNT(*) INTO my_var
FROM table2
INNER JOIN
..............
;
RETURN (SELECT field1 FROM table3) - my_var;
END;
$BODY$ LANGUAGE plpgsql VOLATILE STRICT;
在发布问题之前,您最好阅读PL/pgSQL 上的文档。
此外,不要将0作为错误代码返回,而是返回NULL
或RAISE
例外。这是所有数据库环境中的标准行为(如果field_1 FROM table3
具有与my_var
相同的值,该怎么办?)
答案 1 :(得分:1)
您显示的代码应该按原样运行。 (我在9.3测试过,确实如此。)
错误消息与您的问题中不的内容无关。 的答案:
Error: query has no destination for result data while using a cursor
(select field1 from table3)
条件的 WHERE
并没有多大意义,但仍然有效。
您的原始代码:
IF NOT EXISTS (SELECT * FROM table1) THEN
RETURN 0;
END IF;
明显优于建议的替代方案:
PERFORM * FROM table1;
IF NOT FOUND THEN
RETURN NULL;
END IF;
返回0
或NULL
是一个需求问题。没有"标准行为"。