查询没有结果数据的目的地,尽管它应该

时间:2014-05-17 06:18:35

标签: sql postgresql plpgsql postgresql-9.2

以下是我所拥有的函数的简化版本:

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;

 ------------------------------------------------

2 个答案:

答案 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作为错误代码返回,而是返回NULLRAISE例外。这是所有数据库环境中的标准行为(如果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;

返回0NULL是一个需求问题。没有"标准行为"。