SQL函数(plpgsql)类型定义的输出?

时间:2014-07-08 18:55:48

标签: sql postgresql postgresql-9.3

我一直在将方法的输出定义为......

CREATE TABLE person AS (
  id serial PRIMARY KEY,
  name text NOT NULL,
  fingerprint text
);

CREATE TYPE person_output AS (
  name text
);

CREATE OR REPLACE FUNCTION my_schema.create_person(_name text) 
  RETURNS person_output AS $$
  DECLARE
    output person_output;
  BEGIN
    INSERT INTO person (name) VALUES (_name) RETURNING name INTO person_output;
    RETURN person_output;
  END;
$$ LANGUAGE plpgsql;

我想知道这个为函数输出的类型创建类型的规则是否在行业内是标准的?或者,最好是创建一个视图,只是返回1或引发错误,具体取决于它是成功还是失败,然后调用服务器端python代码中的视图返回?

我可以看到基于类型的输出有利于创建“升级”,例如CREATE TYPE person_output_v002用于下一版本,并创建用于调整的模板,但是再次,如果有的话,则不需要视图。

我决定不使用视图的唯一原因是因为我有像人群一样的东西,我想为组创建视图,但我需要添加WHERE group_id = _GROUP_ID类型的东西选择我认为不可能的视图时。

有没有办法选择带有其他查询参数的VIEWS?

----更新------

如果current_user之间的某些输出在多个RETURN _current_user_output中重复为FUNCTION,那么创建一个TYPE current_user_output是一个好主意,这样我们就可以确定所有输出FUNCTION的{​​{1}}返回相同的内容?

1 个答案:

答案 0 :(得分:0)

根本不需要行类型。甚至不是PL / pgSQL函数。简化:

CREATE OR REPLACE FUNCTION my_schema.create_person(_name text) 
  RETURNS text AS
$func$
   INSERT INTO person (name)
   VALUES (_name)
   RETURNING name;
$func$ LANGUAGE sql;

没有rule of creating a type for what the function should output。要求是声明返回类型,并且SQL需要在执行时知道类型。要返回多个列,您不必创建类型。您可以使用RETURNS TABLE

RETURNS TABLE (col1 int, col2 text, ...)

我建议阅读本手册的这两章:

您可以使用现有表格或多态类型的易于定义的行类型:
Refactor a PL/pgSQL function to return the output of various SELECT queries

补充问题:

  

...这样我们可以确定输出current_user的所有FUNCTION返回相同的东西?

如果您的功能只返回text,那么您可以肯定。对于行类型可能有意义。然后定义要共享的复合类型会很有用。使维护变得复杂。如果要更改返回类型,则必须立即更改alls功能。但这可能是预期的......