Sql 如何在postgres中返回类型表?

Sql 如何在postgres中返回类型表?,sql,postgresql,types,Sql,Postgresql,Types,我创建一个类型,然后使用它创建一个表,例如: CREATE TYPE PARTOK AS (col1 VARCHAR(58), col2 VARCHAR(58), expiration VARCHAR(58), last_update BIGINT, date TIMESTAMP); CREATE TABLE PARTOK_JOB OF PARTOK; 然后我插入了几行: INSERT INTO PARTOK_JOB VALUES ('one', 'test1','nothing', 0,

我创建一个类型,然后使用它创建一个表,例如:

CREATE TYPE PARTOK AS (col1 VARCHAR(58), col2 VARCHAR(58),  expiration VARCHAR(58), last_update BIGINT, date TIMESTAMP);
CREATE TABLE PARTOK_JOB OF PARTOK;
然后我插入了几行:

INSERT INTO PARTOK_JOB VALUES ('one', 'test1','nothing',  0, null);
INSERT INTO PARTOK_JOB VALUES ('one', 'test2','nothing',  0, null);
INSERT INTO PARTOK_JOB VALUES ('one', 'test3','nothing',  0, null);
INSERT INTO PARTOK_JOB VALUES ('two', 'test3','nothing',  0, null);
我创建了一个简单的函数来返回该类型的表:

CREATE OR REPLACE FUNCTION get_partok(
in_col1 VARCHAR(40)
)
RETURNS PARTOK_JOB

LANGUAGE sql
AS
$$
SELECT * FROM partok_job WHERE col1 = in_col1 ;
$$
;
然后使用以下名称将其命名为:

SELECT * FROM get_partok('one'); 
问题是它只返回一行。我怎样才能让它返回所有相关记录? 是否有一种使用该类型表的方法,或者我必须定义返回表的每一列

Thx根据

SQL函数执行任意SQL语句列表,返回列表中最后一个查询的结果在简单(非集合)情况下,将返回最后一个查询结果的第一行。(请记住,除非使用ORDER BY,否则多行结果的“第一行”并没有很好的定义。)如果最后一个查询恰好没有返回任何行,则将返回null值

或者,可以通过将函数的返回类型指定为SETOF sometype,或者通过将其声明为返回表(列),将SQL函数声明为返回集合(即多行)。在这种情况下,将返回最后一个查询结果的所有行。更多详情见下文

您需要使用
设置_of
。只需在代码中替换

RETURNS PARTOK_JOB

整个函数定义应该是

CREATE OR REPLACE FUNCTION get_partok(
in_col1 VARCHAR(40)
)
RETURNS setof PARTOK_JOB

LANGUAGE sql
AS
$$
SELECT * FROM partok_job WHERE col1 = in_col1 ;
$$
;
进行此更改后,选择

从get_partok('one')中选择*;
输出是

 col1 | col2  | expiration | last_update | date 
------+-------+------------+-------------+------
 one  | test1 | nothing    |           0 | 
 one  | test2 | nothing    |           0 | 
 one  | test3 | nothing    |           0 | 
(3 rows)

工作原理与解释完全一致,谢谢!
 col1 | col2  | expiration | last_update | date 
------+-------+------------+-------------+------
 one  | test1 | nothing    |           0 | 
 one  | test2 | nothing    |           0 | 
 one  | test3 | nothing    |           0 | 
(3 rows)