我想创建一个存储函数。我想在找到数据时执行select查询时返回列值或零值。但我得到语法错误。我怎么解决这个问题?
错误是
错误:语法错误在或附近"做" 第6行:做$$
我的代码是:
CREATE OR REPLACE FUNCTION tuvimer.getProjectTypes(
OUT id integer,
OUT name character varying)
RETURNS SETOF record AS
do $$
IF EXISTS (select t.id, t.name from tuvimer.tuvi_project_category t) THEN
RETURN t.id, t.name;
ELSE
RETURN 0;
END IF;
$$
LANGUAGE plpgsql
答案 0 :(得分:2)
do
用于匿名 PL / pgSQL块,不适用于函数。在PL / PgSQL中,您需要begin ... end
(事实上,在 DO块中也是如此)
但这只能解决有关错误DO
用法的明显语法错误,但由于以下几个原因它仍然无法正常工作:
您不能仅在代码中返回t.id, t.name
而没有为其指定值 - 实际上别名t
不存在于select语句之外。
exists
检查似乎没有任何意义。它检查表中是否至少有一行,如果没有,你正在尝试从该表中的一些随机值 - 没有意义
您还可以从定义的函数返回标量值(0
),以返回包含两列的结果。您需要至少返回一行两个列。
如果我猜到了:你正试图返回一个"虚拟行"如果找不到任何东西如果是这样,您可以调整this example from the manual
CREATE OR REPLACE FUNCTION tuvimer.getProjectTypes(
OUT id integer,
OUT name character varying)
RETURNS SETOF record AS
$$
BEGIN --<< The BEGIN goes into the body
return query select t.id, t.name from tuvimer.tuvi_project_category t;
IF NOT FOUND THEN
-- return a dummy row
return query select 0, null::character varying;
END IF;
END; --<< And you need an END here
$$
LANGUAGE plpgsql
不相关,但是:我更喜欢语法returns table (id integer, name varchar)
而不是returns setof record
,并将列定义为OUT
参数。