JOINing 存储过程的返回类型 - PostgreSQL

cze*_*rny 5 postgresql composite-types postgresql-9.3

是否可以使用连接表之一的表类型来表达返回连接表的存储过程的返回类型?

我的存储过程如下所示:

CREATE or REPLACE FUNCTION selectJoin()
RETURNS SETOF ???
AS $$
BEGIN
    RETURN QUERY SELECT t1.*, t2.name
                 FROM t1, t2
                 WHERE t1.t2_id = t2.id;
END; $$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

t1有很多(大约 70 个)列,所以我想以某种方式重用t1RETURNS 子句中的类型。类似(t1, varchar(30))或复合类型继承的东西。有可能吗?

PostgreSQL 9.3 版

Erw*_*ter 6

不,恐怕这是不可能的。我曾多次希望自己也能做到这一点。您要么拥有与返回类型匹配的已注册行(复合)类型,要么必须单独列出列。

CREATE or REPLACE FUNCTION select_join()
  RETURNS TABLE (col1 int, col2 date, ...) AS ...
Run Code Online (Sandbox Code Playgroud)

返回嵌套复合类型有一个有点尴尬的解决方法,但它并不完全相同。看:

或者创建一个复合类型

CREATE TYPE foo AS (col1 int, col2 date, ...);

CREATE or REPLACE FUNCTION select_join()
  RETURNS SETOF foo AS ...
Run Code Online (Sandbox Code Playgroud)

AVIEW还会自动注册其行类型。对于您提出的简单测试用例,您可能只使用视图而不是函数开始(如 @a_horse 评论):

CREATE OR REPLACE VIEW my_view AS 
SELECT t1.*, t2.name
FROM t1 JOIN t2 ON t1.t2_id = t2.id;
Run Code Online (Sandbox Code Playgroud)

或者您创建视图是为了方便注册行类型。您可以LIMIT 0在文档中添加视图不返回行的内容,但这是可选的。

CREATE or REPLACE FUNCTION select_join()
  RETURNS SETOF my_view AS ...
Run Code Online (Sandbox Code Playgroud)

请注意,这会引入依赖关系(与任何其他视图一样),并且 Postgres 将阻止删除表和其他一些操作,除非您首先删除依赖视图。