Използвайте %ROWTYPE
в такъв случай.
Редактиране - прост случай
Тестовете на A.H. и DavidEG показаха, че това няма да работи. Интересен проблем!
Можете да опитате заобиколно решение . Стига вашето определение да е като примера, можете просто да прибягвате до
CREATE FUNCTION test(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myvar comp_type;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Но вашият истински проблем вероятно не е толкова прост?
Редактиране 2 – истинският проблем
Както се очаква, истинският проблем е по-сложен:полиморфен тип вход .
Заобиколно решение тъй като този сценарий беше по-труден, но трябваше да работи безупречно:
CREATE FUNCTION test(param1 anyelement, OUT a integer, OUT myvar anyelement)
RETURNS record AS
$BODY$
BEGIN
myvar := $1; -- myvar has now the required type.
--- do stuff with myvar.
myvar := NULL; -- reset if you don't want to output ..
a := 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Обаждане:
SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar
Вижте пълния резултат:
SELECT * FROM test('("foo")'::comp_type);
Забележка за PostgreSQL 9.0+
Има важна актуализация във v9.0. Цитирам бележките по изданието :
Следователно, в допълнение към моето решение, можете да използвате директно входни променливи.
Имена на динамични файлове
- Как да клонирам ЗАПИС в PostgreSQL
- Как да зададете стойност на полето на съставна променлива с помощта на динамичен SQL