Postgres函数返回参数或零值

时间:2017-01-14 09:39:02

标签: postgresql

我想创建一个存储函数。我想在找到数据时执行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

1 个答案:

答案 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参数。