Utilisez %ROWTYPE
dans ce cas.
Modifier - cas simple
Les tests effectués par A.H. et DavidEG ont montré que cela ne fonctionnerait pas. Problème intéressant !
Vous pouvez essayer une solution de contournement . Tant que votre définition ressemble à l'exemple, vous pouvez simplement recourir à
CREATE FUNCTION test(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myvar comp_type;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Mais votre vrai problème n'est probablement pas aussi simple que ça ?
Edit 2 - le vrai problème
Comme prévu, le vrai problème est plus complexe :un type d'entrée polymorphe .
Solution car ce scénario était plus difficile, mais devrait fonctionner parfaitement :
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;
Appel :
SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar
Afficher le résultat complet :
SELECT * FROM test('("foo")'::comp_type);
Remarque pour PostgreSQL 9.0+
Il y a eu une mise à jour cruciale dans la v9.0. Je cite les notes de version :
Par conséquent, en plus de ma solution de contournement, vous pouvez utiliser directement les variables d'entrée.
Noms de fichiers dynamiques
- Comment cloner un RECORD dans PostgreSQL
- Comment définir la valeur d'un champ de variable composite à l'aide de SQL dynamique