IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

composite type array


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut composite type array
    Bonjour,

    Difficile de trouver l'info dans la jungle de réponse que provoque cette recherche.

    J'ai une base de donnée Postgres 8.3 (avec extension postgis)
    J'essasye de créer une fonction mais je bloque sur une erreur qui me fait me deamnder :

    Est-ce que les array de types composés fonctionnent ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TYPE seps_type AS (id BIGINT, structtyp INTEGER, the_geom geometry, elev INTEGER, featid BIGINT);
     
    CREATE OR REPLACE FUNCTION a_test()
    RETURNS INTEGER AS $$
    DECLARE
    	arr seps_type[];
    BEGIN
    	SELECT ARRAY(SELECT ps.id, ps.structtyp, ps.the_geom, se.elev, se.featid 
    		     FROM bel_1_se se INNER JOIN bel_1_ps ps ON se.id = ps.id 
    		     LIMIT 5) INTO arr ;
    	RAISE NOTICE '1 %', array_upper(arr, 1);
    	return 1;
    END;
    $$ LANGUAGE 'plpgsql';
     
    SELECT a_test();
    Erreur à l'exécution :
    ERROR: subquery must return only one column

    J'ai pourtant cru lire qu'en 8.3 ceci devrait fonctionner

    Si non, quelle alternative ais-je pour pouvoir faire quelque chose dans ce goût là ? (Sachant que l'objectif est de pouvoir faire un bloc logique sur le résultat d'une requête similaire et que je ne connais pas d'autres alternative qu'une array pour ça.)

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut que tu trans-type (CAST) explicitement dans le type composé voulu, car il n'y a aucune chance que le SGBD devine ton intention avec juste une sous-requête.
    Je n'ai pas la syntaxe en tête et de mémoire c'est délicat à écrire, idéalement il faut faire ça avec un oeil sur la doc ou trouver des exemples tous faits sur le web.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Ok d'accord, je vais me renseigner.

    je ne savais pas que le casting existait.

    [Edit]

    La philosophie est de se dire que dans ce cas de figure, l'array doit être unidimensionnelle et donc n'avoir qu'une et une seule colonne.

    Pour ce faire, il faut empaqueter les données de plusieurs colonnes dans un seul type.

    On utilise "ROW()" pour grouper les colonnes
    et un casting "::seps_type" pour indiquer le type de row
    l'instruction finale de construction de l'array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    arr := ARRAY(SELECT ROW(ps.id, ps.structtyp, ps.the_geom, se.elev, se.featid)::seps_type 
    	     FROM bel_1_se se INNER JOIN bel_1_ps ps ON se.id = ps.id 
    	     LIMIT 5
    	);
    voilà,

    merci pour l'aiguillage vers le casting

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Si les tableaux font l'affaire, pourquoi pas.
    En général la réponse la plus directe au problème initial ("bloc logique sur le résultat d'une requête") serait plutôt de renvoyer un curseur, que l'appelant parcourrait ensuite avec des FETCH, MOVE etc... plutôt qu'un tableau. On reste dans ce cas dans un résultat au format classique en lignes et colonnes de différents types, comme une table.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    je débute en plpgsql donc je ne connaissais pas.

    merci du tuyeau

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. composite type array affectation atomique
    Par Ghurdyl dans le forum Requêtes
    Réponses: 0
    Dernier message: 14/10/2009, 16h53
  2. [XML] Type array dans XML
    Par jambonstar dans le forum Delphi
    Réponses: 1
    Dernier message: 11/10/2006, 14h09
  3. type array possible avec pl/pgsql ?
    Par Sakalam dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 31/08/2006, 17h34
  4. [Tableaux] Argument de type array dans __construct ??
    Par shadeoner dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2006, 20h03
  5. [Tableaux] Variable de type array dans un formulaire
    Par ThAOTh dans le forum Langage
    Réponses: 3
    Dernier message: 14/03/2006, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo