我有一个存储过程:
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语句
请帮我解决。非常感谢。
答案 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
数据类型几乎总是一个糟糕的选择。请改用varchar
或text
。