Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何从Postgres函数返回多个值?_Postgresql_Plpgsql - Fatal编程技术网

Postgresql 如何从Postgres函数返回多个值?

Postgresql 如何从Postgres函数返回多个值?,postgresql,plpgsql,Postgresql,Plpgsql,我在PostgreSQL中使用这个函数,它可以工作,但现在我需要返回多个值,例如:\u value和\u prefix 我该怎么办 CREATE或REPLACE函数generate_sequence(_account_id integer,_sequencetext)将文本返回为$$ 声明 _前缀文本; _下一个值文本; _零位整数; _价值文本; 开始 选择asq.prefix,asq.next\u value::text,asq.zero\u pad 插入_前缀、_下一个_值、_零\u焊盘

我在PostgreSQL中使用这个函数,它可以工作,但现在我需要返回多个值,例如:
\u value
\u prefix

我该怎么办

CREATE或REPLACE函数generate_sequence(_account_id integer,_sequencetext)将文本返回为$$
声明
_前缀文本;
_下一个值文本;
_零位整数;
_价值文本;
开始
选择asq.prefix,asq.next\u value::text,asq.zero\u pad
插入_前缀、_下一个_值、_零\u焊盘
从帐户顺序asq
其中asq.account\u id=\u account\u id
和asq.sequence=_序列;
_值:=_前缀| | | u下一个_值;
如果_zero_pad不为空,则
_值:=lpad(_值,_零,'0');
如果结束;
更新帐户\u序列集
下一个值=下一个值+1
其中account\u id=\u account\u id
和序列=_序列;
返回_值;
结束;
$$语言plpgsql;

您应该使用
OUT
参数:

CREATE OR REPLACE FUNCTION fxreturns2(IN a int, OUT b int, OUT c int)
AS $$
BEGIN
  b := a + 1;
  c := a + 2;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

DO $$
DECLARE r record;
BEGIN
  r := fxreturns2(10);
  RAISE NOTICE 'b=% c=%', r.b, r.c;
END;
$$;

请阅读plpgsql。这个主题和其他主题在这里都有很好的描述,可能不到50页

有时更好的方法是返回复合类型的值。复合类型确保所有代码的一致性:

CREATE TYPE typ2 AS (b int, c int);

CREATE OR REPLACE FUCNTION fxtyp2(a int)
RETURNS typ2 AS $$
DECLARE r typ2;
BEGIN
  r.b := a + 1;
  r.c := a + 2;
  RETURN r;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
用法与使用
OUT
参数时相同

您的代码对于并发使用是不安全的。你应该读一些关于。您应该使用或强制-
选择更新
。应针对当前写入锁定将要更新的所有选定行

CREATE TYPE typ2 AS (b int, c int);

CREATE OR REPLACE FUCNTION fxtyp2(a int)
RETURNS typ2 AS $$
DECLARE r typ2;
BEGIN
  r.b := a + 1;
  r.c := a + 2;
  RETURN r;
END;
$$ LANGUAGE plpgsql IMMUTABLE;