我想创建一个存储函数。如果找到数据,我想在执行选择查询时返回列值或零值。但是我得到语法错误。我怎么解决这个问题?
错误是
ERROR: syntax error at or near "do" LINE 6: do $$
我的代码是:
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
最佳答案
do
用于匿名 PL/pgSQL block ,不适用于函数。在 PL/PgSQL 中,您需要 begin ... end
(事实上 在 DO block 中也需要)
但这只能修复关于不正确的 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
参数。
关于postgresql - Postgres 函数返回参数或零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41648570/