Postgres存储函数如何返回表 [英] How can a Postgres Stored Function return a table

查看:16
本文介绍了Postgres存储函数如何返回表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想了解 Postgres 存储函数如何返回带有已识别列的表.我使用了 return setof returnType:

I would like to find out how a Postgres stored function can return a table, with identified columns. I've used returns setof returnType:

-- create employeeSearchResult returnType
create type employeeAllReturnType as
(
  id bigserial,
  "positionId" integer,
  "subjectId" bigint,
  "dateEngaged" date,
  "nextKin" text,
  "nrcNo" text,
  dob date,
  father text,
  mother text,
  wife text,
  "userId" integer,
  "statusId" integer,
  "mainCode" text,
  "subCode" text
);


-- Search for emmployee by name
CREATE OR REPLACE FUNCTION "employee_search_by_name"(employeeNameIN text)
returns setof employeeAllReturnType as 
$$
declare
    results record;
    resultsRow employee%rowtype;
    nameIn text;
begin
    nameIn = employeeNameIN || '%';
    for results in select 
        employee.id,-- bigserial NOT NULL,
  employee."positionId",-- integer,
  employee."subjectId",-- bigint NOT NULL,
  employee."dateEngaged",-- date,
  employee."nextKin",-- text,
  employee."nrcNo",-- text,
  employee.dob,-- date,
  employee.father,-- text,
  employee.mother,-- text,
  employee.wife,-- text,
  employee."userId",-- integer NOT NULL,
  employee."statusId",-- integer,
  employee."mainCode",-- character(5) NOT NULL,
  employee."subCode"-- character(10),
     from employee, subject where employee."subjectId" = subject.id and (subject.name1 ILIKE nameIn OR subject.name2 ILIKE nameIn OR subject.name3 ILIKE nameIn OR subject.name4 ILIKE nameIn) loop
      return next results;
    end loop;
end;
$$ language 'plpgsql';

并且还返回 table():

and also return table():

-- Search for emmployee by name
CREATE OR REPLACE FUNCTION "employee_search_by_name"(employeeNameIN text)
returns table (id bigserial,
  position integer,
  subject bigint,
  date_engaged date,
  next_kin text,
  nrc_no text,
  dob date,
  father text,
  mother text,
  wife text,
  user_id integer,
  status_id integer,
  main_code text,
  sub_code text) as 
$$
declare
    results record;
    resultsRow employee%rowtype;
    nameIn text;
begin
    nameIn = employeeNameIN || '%';
    for results in select 
        employee.id,-- bigserial NOT NULL,
        employee."positionId",-- integer,
        employee."subjectId",-- bigint NOT NULL,
        employee."dateEngaged",-- date,
        employee."nextKin",-- text,
        employee."nrcNo",-- text,
        employee.dob,-- date,
        employee.father,-- text,
        employee.mother,-- text,
        employee.wife,-- text,
        employee."userId",-- integer NOT NULL,
        employee."statusId",-- integer,
        employee."mainCode",-- character(5) NOT NULL,
        employee."subCode"-- character(10),
     from employee, subject where employee."subjectId" = subject.id and (subject.name1 ILIKE nameIn OR subject.name2 ILIKE nameIn OR subject.name3 ILIKE nameIn OR subject.name4 ILIKE nameIn) loop
      return next results;
    end loop;
end;
$$ language 'plpgsql';

但两者都有以下格式的输出:

But both have outputs in the following formats:

"(1,1,1,2011-12-01,Timea,fg1254,1981-12-27,moses,sarada,timea,1,1,"ADM  ","1         ")"
"(37,3,10,2011-11-11,s,s,2011-11-11,s,s,s,1,1,"OP   ","1         ")"

无论如何我可以有输出,例如从表中选择结果的输出?

Is there anyway in which I can have outputs such as those of a select result from a table?

"1";1;1;"2011-12-01";"Timea";"fg1254";"1981-12-27";"moses";"sarada";"timea";1;1;"ADM  ";"1         "

这样从前端处理结果数据就不需要解析器了.

Such that handling result data from the front end wont require a parser.

推荐答案

你应该像这样查询你的函数:

You should query your function like this:

SELECT * FROM employee_search_by_name('Bob');

另外,为了简化您的功能,您可以查看 RETURN QUERY EXECUTE ... 构造.并且不需要引用 plpgsql 关键字.

Also, to simplify your function, you might look into the RETURN QUERY EXECUTE ... construct. And there's no need to quote plpgsql keyword.

这篇关于Postgres存储函数如何返回表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆