PostgreSql как у создаваемого типа данных получить значение поля?

Создаю свой тип данных

CREATE TYPE student AS ( "firstName" character varying, "secondName" character varying, "age" integer, "status" character varying );

Есть функция change_status(student, old_status, new_status) которая возвращаем student c изменёнными значениями полей

Мне нужно создать функцию которая возвращает поле firstNameиз student

CREATE FUNCTION student_name (IN "currentStudent" student, IN "secondName" character varying) RETURNS character varying LANGUAGE 'plpgsql'
AS BEGIN RETURN change_status(currentStudent,secondName).firstName; END;

Но происходит ошибка syntax error около точки, то есть он не понимает блок .firstName. В oracle я так значение полей получать мог а тут нет. Может кто знает как получить из созданного типа данных значение поля?


Ответы (1 шт):

Автор решения: Alexander Pavlov

Чтобы читать поле из возвращаемого функцией объекта, надо вызов функции дополнительно оборачивать в скобки (getObject(params)).field

В твоём случае будет

CREATE  TYPE student AS ( firstName text, secondName text, age integer, status text);


CREATE OR REPLACE FUNCTION change_status (currentStudent student, secondName text) 
  RETURNS student AS
$$
BEGIN
   RETURN (
       SELECT ROW(currentStudent.firstName, secondName, currentStudent.age, currentStudent.status)::student
     );
END
$$
LANGUAGE plpgsql;


CREATE FUNCTION student_name(currentStudent student, secondName text) RETURNS text AS 
$$
BEGIN
 RETURN (
  SELECT (change_status(currentStudent,secondName)).firstName
 );
END 
$$ 
LANGUAGE 'plpgsql';


select student_name(row('John', 'Smith', 12, 'alive')::student, 'Snow') ;
John
→ Ссылка