PostgreSQL v8.2(Greenplum)
CREATE OR REPLACE FUNCTION util.retrec(OUT p1 date, OUT p2 boolean)
RETURNS RECORD
AS
$BODY$
DECLARE
BEGIN
p1 := current_date;
p2 := true;
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
SELECT util.retrec();
这会返回
(2016-03-24,t)
- 我如何分别取出这两个值?
我可以与
SELECT p1,p2 FROM util.retrec();
交互地执行此操作,但是如何将两个值分配给过程中的两个变量?我试过这个:
SELECT util.retrec() INTO r1, r2;
不走运,这会尝试将记录分配给 r1。
SELECT the_date, the_bool FROM util.retrec();
只需列出字段及其名称,就可以了。
这里有几种方法:
do $$
declare
r1 date;
r2 boolean;
r record;
begin
r := retrec();
raise info '%', r;
raise info '%', r.p1;
raise info '%', r.p2;
select * into r from retrec();
raise info '%', r;
raise info '%', r.p1;
raise info '%', r.p2;
select * into r1, r2 from retrec();
raise info '%, %', r1, r2;
end; $$ language plpgsql;
注意它是在 PostgreSQL 9.5 上测试的
*根据我的研究,没有简单的方法来访问记录(行)的元素。
例如,您创建
person
表,然后向其中插入 2 行,如下所示:
CREATE TABLE person (
id INTEGER,
name VARCHAR(20)
);
INSERT INTO person (id, first_name, last_name, age)
VALUES (1, 'John'), (2, 'David');
然后,您创建
my_func()
函数,该函数返回带有 person_row
的记录(行),如下所示:
CREATE FUNCTION my_func()
RETURNS RECORD
AS $$
DECLARE
person_row RECORD; -- Here
BEGIN
SELECT * INTO person_row FROM person WHERE id = 2;
RETURN person_row;
END;
$$ LANGUAGE plpgsql;
然后,调用
my_func()
会得到一条记录(行),如下所示:
postgres=# SELECT my_func();
my_func
-----------
(2,David)
(1 row)
现在,您可以使用
to_json()
、to_jsonb()
和row_to_json()
访问记录(行)的元素,如下所示:
postgres=# SELECT to_json(my_func())->'name' AS name;
name
---------
"David"
(1 row)
postgres=# SELECT to_jsonb(my_func())->'name' AS name;
name
---------
"David"
(1 row)
postgres=# SELECT row_to_json(my_func())->'name' AS name;
name
---------
"David"
(1 row)
*备注:
可以省略
AS name
。
文档解释了这些功能。
此外,您可以使用trim()从
"
修剪"David"
,如下所示。 *小心,省略 ::VARCHAR(20)
会得到 错误:
postgres=# SELECT trim(BOTH '"' FROM (to_json(my_func())->'name')::VARCHAR(20)) AS name;
name
-------
David
(1 row)
postgres=# SELECT trim(BOTH '"' FROM (to_jsonb(my_func())->'name')::VARCHAR(20)) AS name;
name
-------
David
(1 row)
postgres=# SELECT trim(BOTH '"' FROM (row_to_json(my_func())->'name')::VARCHAR(20)) AS name;
name
-------
David
(1 row)