2015-04-22 3 views
0

У меня есть функция, которая возвращает запрошенную записьPostgreSQL: Доступ поля типов записей

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 и не допускает ошибок.

Любой намек на то, как решить эту проблему?

+0

Перевести это 'n'a па идентификатор пу ли Колонны«п»данс ле типа де données де л 'enregistrement' –

+0

@vivek На самом деле довольно удобно иметь ошибки на языке оригинала (хотя, конечно, английские сводки хороши). Исходное сообщение может быть скопировано в исходном коде после быстрого поиска в файлах перевода, чтобы получить шаблон английского сообщения, из которого он пришел. Перевод обычно не может быть. –

+0

@CraigRinger Я не понимаю, на каком языке это, если бы я знал, тогда я могу использовать переводчик. В этом случае только OP или тот, кто может читать этот язык, только понимают, что это значит :) –

ответ

0

Это происходит потому, что ваши projseg1 & projseg2 переменные record s, поэтому они automatically configure себя к типу строки результата запроса столбцов (что именно row(row(n, s, p)), но не то, что вы хотите: row(n, s, p)).

Чтобы выбрать только строку (которая не инкапсулируются в другой ряд), вы должны использовать:

SELECT * INTO projseg1 FROM atPeriod(seg1, p); 
-- or: 
projseg2 := atPeriod(seg2, p); 
Смежные вопросы