PostgreSQL存储过程错误

时间:2016-08-25 03:44:45

标签: postgresql stored-procedures

我有一个存储过程:

CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6))
RETURNS SETOF postalcode AS $BODY$
BEGIN
    WITH RECURSIVE tblParent AS 
    (
        SELECT * 
        FROM postalcode 
        WHERE postalcode.code = ccode

        UNION ALL 

        SELECT postalcode.* 
        FROM postalcode  
        JOIN tblParent ON postalcode.code = tblParent.parent
    )
    SELECT * FROM tblParent;

END;$BODY$ LANGUAGE plpgsql;

成功编译,但在运行时我有

  

错误:查询没有结果数据的目标; SQL状态:42601;

     

提示产品:>如果要放弃SELECT的结果,请使用PERFORM   代替。上下文:PL / pgSQL函数postalcode_lookup(字符)行   3在SQL语句

请帮我解决。非常感谢。

2 个答案:

答案 0 :(得分:0)

如果是Function,我们必须返回值

如果我们按照以下方式编写函数,我们可以获得所需的结果

    CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6))
    RETURNS refcursor AS $BODY$
    DECLARE 
    cur_postalcode refcursor;
    BEGIN
Open cur_postalcode for
        WITH RECURSIVE tblParent AS 
        (
            SELECT * 
            FROM postalcode 
            WHERE postalcode.code = ccode

            UNION ALL 

            SELECT postalcode.* 
            FROM postalcode  
            JOIN tblParent ON postalcode.code = tblParent.parent
        )
        SELECT * FROM tblParent;
    return cur_postalcode;

    END;$BODY$ LANGUAGE plpgsql;

执行此功能时,您将获得一个光标。从给定查询的游标运行中获取值。

SELECT postalcode_lookup(--ccode);

fetch all "<unnamed portal 1>";

希望它有所帮助。

答案 1 :(得分:-1)

由于您没有任何过程代码,请使用纯SQL函数:

CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6))
   RETURNS SETOF postalcode AS 
$BODY$
    WITH RECURSIVE tblParent AS 
    (
        SELECT * 
        FROM postalcode 
        WHERE postalcode.code = ccode

        UNION ALL 

        SELECT postalcode.* 
        FROM postalcode  
        JOIN tblParent ON postalcode.code = tblParent.parent
    )
    SELECT * 
    FROM tblParent;
$BODY$ LANGUAGE sql;

为了完整性,PL / pgSQL版本需要使用RETURN QUERY

CREATE OR REPLACE FUNCTION postalcode_lookup(ccode character(6))
   RETURNS SETOF postalcode AS 
$BODY$
BEGIN
    RETURN QUERY --<< this does the magic
    WITH RECURSIVE tblParent AS 
    (
        SELECT * 
        FROM postalcode 
        WHERE postalcode.code = ccode

        UNION ALL 

        SELECT postalcode.* 
        FROM postalcode  
        JOIN tblParent ON postalcode.code = tblParent.parent
    )
    SELECT * 
    FROM tblParent;
END;
$BODY$ LANGUAGE plpgsql;

但是普通的SQL函数应该是首选的,因为它会更快(并且可以在更复杂的语句中使用时更好地优化,例如使用连接或其他where条件。

在这两种情况下,该功能都可以像表一样使用:

select * 
from postalcode_lookup('ABCDEF');

不相关,但是:使用character数据类型几乎总是一个糟糕的选择。请改用varchartext