postgresql - Postgres 函数返回参数或零值

标签 postgresql

我想创建一个存储函数。如果找到数据,我想在执行选择查询时返回列值或零值。但是我得到语法错误。我怎么解决这个问题?

错误是

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/

相关文章:

mysql - 将简单的 postgreSQL 函数转换为 Mysql

PostgresQL:查找 ARRAY_AGG() 输出的数组长度

c# - NHibernate 在 PostgreSQL 9.0 中不断丢失我的 DateTime 的时区

postgresql - PostgreSQL 中的 UPDATE 与 INSERT 语句性能

django - 如何让 Jython-Django 与 Postgresql JDBC 一起工作

java - postgresql order by desc 对于字符串不起作用

postgresql - hstore 运算符优先级在版本之间发生了变化

postgresql - PG 中的动态 SQL 和 Setof 函数

sql - 连续时间戳对之间间隔的中值长度

sql - 如何按 ruby​​ 中字符串的整数值排序?