Dans votre scénario, le type de retour changera en raison des différents noms et types de colonnes. Pour gérer cela, vous pouvez profiter de la capacité de PostgreSQL à renvoyer des types d'enregistrements anonymes :
<code class="language-sql">CREATE FUNCTION data_of(integer) RETURNS SETOF record AS ...</code>
Cependant, cette approche nécessite de spécifier manuellement les définitions de colonnes dans chaque appel de fonction :
<code class="language-sql">SELECT * FROM data_of(17) AS foo (colum_name1 integer , colum_name2 text , colum_name3 real);</code>
Pour éviter cette approche fastidieuse, vous pouvez utiliser des types de données de document comme JSON ou XML pour stocker des données non structurées :
<code class="language-sql">CREATE FUNCTION data_of(integer) RETURNS JSONB AS ...</code>
Cependant, cette approche sacrifiera les avantages des types de données structurés PostgreSQL.
Si votre structure de données est cohérente (sauf pour les noms de colonnes), vous pouvez renvoyer un nombre fixe de colonnes correctement nommées et saisies :
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, col2 text, col3 text) AS $func$ ...</code>
Pour plus de simplicité, chaque colonne est explicitement convertie en type TEXT.
Si vous avez un nombre variable de colonnes du même type, vous pouvez utiliser un tableau pour stocker les valeurs :
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS $func$ ...</code>
Vous pouvez également renvoyer les noms de colonnes sous forme de tableau :
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS $func$ ...</code>
Pour renvoyer toutes les colonnes d'un tableau, quelle que soit leur structure, vous pouvez utiliser le pseudo type de données anyelement
:
<code class="language-sql">CREATE FUNCTION data_of(_tbl_type anyelement, _id int) RETURNS SETOF anyelement AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT * FROM %s -- pg_typeof returns regtype, quoted automatically WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
Appelez cette fonction avec NULL du type de table souhaité pour déterminer dynamiquement le type de retour :
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!