为了账号安全,请及时绑定邮箱和手机立即绑定

如何返回未从存储过程中找到的记录

如何返回未从存储过程中找到的记录

Go
叮当猫咪 2021-08-23 17:14:35
当没有找到记录时,是否可以让存储过程的行为与常规选择查询完全相同,或者这是驱动程序问题。例如,对于 go,不返回任何行的查询将返回 sql.ErrNoRows 错误。但是,这不会:create table emptytable(id int);create function selectany() returns emptytable as $$DECLARE  _out emptytable;BEGIN  SELECT * INTO emptytable FROM emptytable limit 1;  RETURN _out;END;$$ LANGUAGE PLPGSQL;我尝试过 SELECT INTO STRICT,虽然这会引发“查询没有返回行”错误,但它与非存储过程查询不同。也没有提高 NO_DATA_FOUND。
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

2.5 选项:


1a) 如果你只需要返回一个查询,你可以使用SETOF和RETURN QUERY


1b) 或者只使用语言SQL作为@ClodoaldoNeto,它使用 sql 的SELECTstmt本机返回查询


2)如果你需要在程序中处理结果,你必须使用SETOFand RETURN NEXT,确保你检查IF FOUND THEN RETURN;(注意缺少NEXT,如果给定将作为单个空白行返回)


理想情况下,我不想使用SETOF已知的程序返回完全没有或 1 行,但似乎SETOF需要从应用程序中获取一个程序来查询,例如 sql 语句并让驱动程序识别NO ROWS RETURNED


下面的例子:


create table emptytable(id int);


create function selectany() returns setof emptytable as $$

DECLARE

  _out emptytable;

BEGIN

  SELECT * INTO _out FROM emptytable limit 1;

  IF FOUND THEN

    RETURN _out;

  END IF;

  RETURN;

END;

$$ LANGUAGE PLPGSQL;


create function selectany_rq() returns setof emptytable as $$

BEGIN

  RETURN QUERY SELECT * INTO _out FROM emptytable limit 1;

END;

$$ LANGUAGE PLPGSQL;  


查看完整回答
反对 回复 2021-08-23
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

正如评论中所建议的那样返回 setof emptytable


create function selectany()

returns setof emptytable as $$

    select *

    from emptytable 

    limit 1

    ;

$$ language sql;

普通的 sql 可以做到这一点


查看完整回答
反对 回复 2021-08-23
  • 3 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信