猿问

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

当没有找到记录时,是否可以让存储过程的行为与常规选择查询完全相同,或者这是驱动程序问题。


例如,对于 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。


叮当猫咪
浏览 191回答 3
3回答

慕尼黑的夜晚无繁华

2.5 选项:1a) 如果你只需要返回一个查询,你可以使用SETOF和RETURN QUERY1b) 或者只使用语言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;  

白衣染霜花

正如评论中所建议的那样返回 setof emptytablecreate function selectany()returns setof emptytable as $$    select *    from emptytable     limit 1    ;$$ language sql;普通的 sql 可以做到这一点
随时随地看视频慕课网APP

相关分类

Go
我要回答