PL / PgSQL函数中的“查询没有结果数据的目的地”

时间:2013-07-11 05:54:15

标签: postgresql

我需要显示Tree_Nodes表数据

CREATE OR REPLACE FUNCTION sample()
      RETURNS TABLE() AS
    $BODY$ 

    BEGIN
        select * from "Tree_Nodes";
    END;
    $BODY$

      LANGUAGE plpgsql VOLATILE
      COST 100
      ROWS 1000;
    ALTER FUNCTION sample()
      OWNER TO postgres;

失败了:

 ERROR:  query has no destination for result data

避免错误,我会在所有数据中获得表格列格式

2 个答案:

答案 0 :(得分:3)

要返回SELECT的结果,纯SQL函数更合适:

CREATE OR REPLACE FUNCTION sample()
  RETURNS TABLE ( .... ) AS
$BODY$ 
  select * from "Tree_Nodes";
$BODY$
LANGUAGE sql;

或者如果你真的需要PL / pgSQL,你需要使用return query(手册中有明确记载)

CREATE OR REPLACE FUNCTION sample()
      RETURNS TABLE (....) 
AS
$BODY$ 
BEGIN
   return query select * from "Tree_Nodes";
END;
$BODY$
LANGUAGE plpgsql;

但是你不能只指定returns table()你必须定义结果的结构:

CREATE OR REPLACE FUNCTION sample()
  RETURNS TABLE(id integer, some_column text, other_column decimal(10,2), ...) 
AS

答案 1 :(得分:2)

引用的确切错误是由于在PL / PgSQL中使用SELECT而没有INTO子句引起的。您必须使用SELECT INTO somevariable,使用RETURN QUERY,如果要放弃数据,请使用PERFORM语句代替SELECTas covered by the PL/PgSQL manual

使用RETURN QUERY SELECT ....修复后,您会发现该功能仍然不起作用,因为RETURNS TABLE()没有意义。您将返回一个空结果集。它会失败,抱怨声明返回的结果集与函数不匹配。

无论如何这样做是没有意义的,因为你可以把它写成一个简单的SQL函数,如:

CREATE OR REPLACE FUNCTION sample()
      RETURNS SETOF "Tree_Nodes"
AS $$
    SELECT * FROM "Tree_Nodes";
$$ LANGUAGE sql;

此功能似乎没有用处。你想用它做什么?

(顺便说一句,你通常应该避免在生产代码中使用SELECT *。列出列。这样,如果你以后添加一列,使用该表的东西不会突然停止工作。)