PostgreSQL:访问记录类型的字段

时间:2015-04-22 10:05:31

标签: postgresql field record

我有一个返回记录的函数

CREATE OR REPLACE FUNCTION atPeriod(
    IN segment segmentST,
    IN period period,
    OUT n integer,
    OUT s segmentST,
    OUT p pointST)
  RETURNS record AS
'$libdir/Hermes', 'atPeriodSegmentSTV1'
  LANGUAGE c STABLE STRICT
  COST 1;

我在另一个函数中调用该函数

CREATE OR REPLACE FUNCTION distance(seg1 segmentST, seg2 segmentST) RETURNS realTS AS
$BODY$
DECLARE 
    projseg1 record;
    projseg2 record;
BEGIN
    SELECT atPeriod(seg1,p) INTO projseg1; 
    SELECT atPeriod(seg2,p) INTO projseg2; 
    IF (projseg1).n = 2 AND (projseg2).n = 2 THEN
        ...
    END IF;
END;
$BODY$ LANGUAGE plpgsql;

当我执行第二个功能时,我收到错误

********** Error **********

ERROR: record "projseg1" has no field "n"
SQL state: 42703

如果我在SQL语句中调用第一个函数

WITH Rec AS (
select 2 as seg_id, atPeriod(SegmentST(
pointst('2012-01-01 08:00:00', 1, 2),
pointst('2012-01-01 08:02:00', 2, 2)),
period('2012-01-01 08:00:00', '2012-01-01 08:01:00')
) as seg
)
Select (seg).n from rec

我收到值2且没有错误。

有任何提示如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这种情况发生了,因为您projseg1& projseg2个变量是record个,所以他们自己automatically configure自己查询结果列的行类型(正是row(row(n, s, p))但不是,你想要的是什么:row(n, s, p))。

要仅选择行(未封装到另一行),您应该使用:

SELECT * INTO projseg1 FROM atPeriod(seg1, p);
-- or:
projseg2 := atPeriod(seg2, p);