PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL :Comment renvoyer des lignes dynamiques à partir d'une table sans utiliser la liste de définition de colonne ?

La gestion de anyelement comme type de retour est décrit dans Types polymorphes :

Cet argument dans votre cas est relation_name tapé comme anyelement , et en passant NULL::table1 , cela indique en effet au planificateur que cet appel particulier de function1 doit renvoyer SETOF table1 . Jusqu'ici tout va bien.

Maintenant, le problème est qu'une fois exécutée, la fonction ne renvoie pas SETOF table1 mais autre chose. Ce n'est pas ce à quoi l'exécuteur s'attendait, d'où l'erreur.

Bien que le titre de la question soit Comment retourner des lignes dynamiques... , ce que vous semblez vouloir, ce sont des colonnes dynamiques ou des ensembles de résultats polymorphes.

Et c'est une bataille difficile avec SQL, car pour construire le plan d'exécution d'une requête, le planificateur doit connaître chaque colonne avec son type pour chaque résultat intermédiaire. Si vous concevez votre requête avec une fonction qui doit être exécutée afin de trouver la structure de sa sortie, cela crée un problème de poule et d'œuf :la planification doit précéder l'exécution, elle ne peut pas en dépendre.

Avec sa technique d'inférence de type dynamique appliquée à anyelement , PostgreSQL repousse déjà les limites pour implémenter autant de polymorphisme que possible compte tenu de cette contrainte.