2017-10-19 17 views
0

J'ai besoin d'un moyen d'obtenir une "description" des colonnes d'une requête SELECT (curseur), telles que leurs noms, types de données, précision, échelle, etc., dans PostgreSQL (ou mieux encore PL/pgSQL).Comment décrire les colonnes (obtenir leurs noms, types de données, etc.) d'une requête SQL dans PostgreSQL

Je passe de Oracle PL/SQL, où je peux obtenir une telle description en utilisant une procédure intégrée dbms_sql.describe_columns. Il renvoie un tableau d'enregistrements, un pour chaque colonne d'un curseur donné (analysé).

EDB l'a mis en œuvre aussi (https://www.enterprisedb.com/docs/en/9.0/oracompat/Postgres_Plus_Advanced_Server_Oracle_Compatibility_Guide-127.htm#P13324_681237)

Un exemple d'une telle requête:

select col1 from tab where col2 = :a 

J'ai besoin d'une API (ou une solution de contournement) qui pourrait être appelé comme ça (je l'espère):

select query_column_description('select col1 from tab where col2 = :a'); 

qui renverra quelque chose de similaire à:

{{"col1","numeric"}} 

Pourquoi? Nous construisons des vues où ces requêtes deviennent des colonnes individuelles. Par exemple, la requête de vue ressemblerait à ce qui suit:

select (select col1 from tab where col2 = t.colA) as col1::numeric 
    from tab_main t 
+0

Quelque chose de similaire est disponible en utilisant psycopg2 (https://stackoverflow.com/questions/10252247/how-do-i-get-a-list-of-column-names-from-a-psycopg2-cursor), mais je espérais que je pourrais rester dans PL/pgSQL, donc je n'ai pas à faire avec (install/learn/etc.) psycopg2 juste pour ça (et peut-être d'autres fonctionnalités cool/nécessaires que je n'ai pas encore découvert) –

+0

rien de intégré du côté serveur. Du côté des clients, je sais que JDBC peut le faire, et je suppose aussi ODBC. Je suppose que les deux interfaces utilisent [SPI] (https://www.postgresql.org/docs/current/static/spi-interface-support.html) pour cela. –

+0

S'il vous plaît vote upvote la réponse si cela vous convient. Merci. – Indent

Répondre

0

http://sqlfiddle.com/#!17/21c7a/2

Vous pouvez utiliser la table des systèmes:

Première étape créer une vue temporaire avec votre requête (sans clause où)

puis sélectionnez

select 
    row_to_json(t.*) 
from (
    select 
     column_name, 
     data_type 
    from 
     information_schema.columns 
    where 
     table_schema = 'public' and 
     table_name = 'a_view' 
) as t 
+0

Merci @Indent. Je vais utiliser votre solution de contournement en créant une vue temporaire. –

+0

ok, cool. S'il vous plaît upvote la réponse si cela vous convient. Merci. Bonne journée. – Indent

+0

Désolée @Indent, je ne peux pas m'envoyer en raison de ma mauvaise réputation. Votre réponse m'a cependant beaucoup aidé. Merci encore. –