PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 09/12/2015 16:10:58

Papychampi
Membre

Requête avec tableau

Bonjour à tous,

Je souhaite faire une requête avec un tableau... En fait je dois faire une requête avec toutes les données stockées dans les colonnes de ce tableau... Je voudrais savoir si c'est possible et si oui de quelle manière?

Cordialement,

Papychampi

Hors ligne

#2 10/12/2015 01:43:52

gleu
Administrateur

Re : Requête avec tableau

Euh oui ou non. C'est tellement vague comme question que je ne vois pas qui pourrait répondre quelque chose de plus précis smile


Guillaume.

Hors ligne

#3 10/12/2015 10:19:43

Papychampi
Membre

Re : Requête avec tableau

Bonjour,

Je vais essayer d'être plus précis...

J'ai une première requête qui me retourne un tableau contenant plusieurs id... et je dois faire une requête en faisant un WHERE id = {Le contenu de TOUT le tableau}

Je sais pas si c'est plus précis... Par l'exemple ce sera plus précis:

SELECT family AS _family FROM product_types WHERE ptypeid = _ptypeid;                                         // retourne une chaine
SELECT ptypeid AS _ptypeidtab FROM product_types WHERE family = _family;                                     // retourne un tableau
SELECT max(x'right( sn, 4)'::integer) AS _dddd FROM products WHERE ptypeid = _ptypeidtab;              // Doit faire une requête avec tout le contenu du tableau

PS: C'est dans une fonction PGSQL mais la question est plus d'ordre général que d'ordre de PGSQL

Cordialement,

Hors ligne

#4 11/12/2015 09:36:02

edlm
Membre

Re : Requête avec tableau

Bonjour,


est-il possible d'avoir la définition de la table product_types ou au minimum de la colonne ptypeid ?


Que fait exactement:

max(x'right( sn, 4)'::integer)

?

Pouvez vous expliquer ce que vous cherchez à faire d'un point de vue logique ? Dans le style "Je voudrais extraire le maximum des 4 1ers caractères convertis en nombre de...".


Tout cela permettrait de comprendre le but de l'opération et sur quelle structure de données s'appuie les requêtes.


Éric

Hors ligne

#5 11/12/2015 10:27:40

Papychampi
Membre

Re : Requête avec tableau

Bonjour,

Je fais des procédures stockées qui sont censée créer des commandes... Seulement les numéros de séries des produits doivent être incrémenté de la manière suivante:

XXXXXXXXXXXXX_0001
XXXXXXXXXXXXX_0002
XXXXXXXXXXXXX_0003
XXXXXXXXXXXXX_0004
XXXXXXXXXXXXX_0005
XXXXXXXXXXXXX_0006
XXXXXXXXXXXXX_0007
XXXXXXXXXXXXX_0008
XXXXXXXXXXXXX_0009
XXXXXXXXXXXXX_000A
XXXXXXXXXXXXX_000B
XXXXXXXXXXXXX_000C
XXXXXXXXXXXXX_000D
XXXXXXXXXXXXX_000E
XXXXXXXXXXXXX_000F
XXXXXXXXXXXXX_0010

Pour cela j'utilise:

max(x'right( sn, 4)'::integer)

qui récupère les 4 derniers caractères du dernier numéro de série rentré par l'utilisateur
Voici la définition de la table product_types:

PK           PTypeId          Clé primaire
               Family            Famille principale du produit (US-CORE, US-ICC, US-RACK, US-8I-RJ)
               Name             Désignation commerciale (US-COREV3, US-ICC2)
               Fab                Type de fabrication (FAB_A, FAB_B,...)
               Version          Version majeure du produit
               SubVersion     Version additionnelle du produit
               PN                 Part Number associé à l’état matériel du Produit (ne prend pas en compte des personnalisations logicielles comme l’ajout de licences)
               Description     Description du produit

Le truc étant que le numéro de série doit augmenter selon le dernier de la famille et pour une famille je peux avoir plusieurs PTypeId. Du coup, je suis obligé de faire un

SELECT family AS _family FROM product_types WHERE ptypeid = _ptypeid;  

Qui me récupère la famille pour un type de produit et ensuite faire un:

SELECT ptypeid AS _ptypeidtab FROM product_types WHERE family = _family;

qui me récupère tout les PTypeId qui ont cette famille...

et à partir de là je dois récupérer le plus haut incrément que je concatène au reste du numéro de série...

Je sais pas si je suis précis en fait...

En tous cas merci de m'aider!

Dernière modification par Papychampi (11/12/2015 10:28:03)

Hors ligne

#6 11/12/2015 10:35:51

edlm
Membre

Re : Requête avec tableau

Merci pour ces précisions qui permettent de mieux comprendre ce que vous voulez faire mais il manque encore un élément essentiel à savoir la définition exacte de la table product_types.


Est-il possible d'avoir la requête SQL CREATE TABLE concernant cette fameuse table product_types au au minimum les types de chaque colonne ? Ou le résultat sous psql de \d product_types ?


Éric

Hors ligne

#7 11/12/2015 10:38:22

Papychampi
Membre

Re : Requête avec tableau

Bien sûr:

CREATE TABLE product_types
(
  ptypeid integer NOT NULL DEFAULT nextval('"Product_Types_PTypeId_seq"'::regclass),
  family text,
  name text,
  fab text,
  version text,
  subversion text,
  pn text,
  description text,
  CONSTRAINT "PK_Product_Type" PRIMARY KEY (ptypeid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE product_types
  OWNER TO postgres;

Hors ligne

#8 11/12/2015 11:18:19

edlm
Membre

Re : Requête avec tableau

Merci.


Donc la requête:

SELECT ptypeid AS _ptypeidtab FROM product_types WHERE family = _family;                                     // retourne un tableau

ne retourne pas un tableau contrairement au commentaire indiqué mais un ensemble de lignes de type entier (integer).


Et la requête qui doit extraire les lignes de la table products ne serait plus:

SELECT max(x'right( sn, 4)'::integer) AS _dddd FROM products WHERE ptypeid = _ptypeidtab;              // Doit faire une requête avec tout le contenu du tableau

mais plutôt:

SELECT max(x'right( sn, 4)'::integer) AS _dddd FROM products WHERE ptypeid IN (SELECT ptypeid AS _ptypeidtab FROM product_types WHERE family = _family) ; 

Quoi que le 'x' dans max(x'right... doit être plutôt perturbant ;-)


Voir même plus simple en fonction de la définition de la table products.


Sinon sur le principe, et dans la mesure où ptypeid est automatiquement alimenté par la clause "DEFAULT nextval..." pourquoi voulez vous calculer vous même cet entier alors que la base va le créer automatiquement ? Mais bon peut être n'ai je pas tout compris ou il y a des choses qui m'échappent...

Dernière modification par edlm (11/12/2015 11:19:19)


Éric

Hors ligne

#9 11/12/2015 11:48:33

Papychampi
Membre

Re : Requête avec tableau

Ok merci! C'est cool ça marche!

Seulement j'ai un petit soucis sur une requête qui pourtant me parait basique:

DECLARE
    i         integer;
    j         integer;
    _sorderid     integer;
    _sdeliveryid     integer;
    _dddd        integer;
    _test        integer;
    _ret         boolean;
    _hex        text;
    _family        text;
    _ptypeidtab    integer[];
BEGIN
    /* Création de la commande + Récupère l'identifiant */
    INSERT INTO supplierorders (orderform, startdate, quantity, supplier) VALUES (_orderform, _stardate, _total, _supplier) RETURNING "sorderid" INTO STRICT _sorderid;
    FOR j IN 1 .. _cadences LOOP

        /* Vérification du numéro de série */
        _ret := check_sn(_sn[j]);
        
        /* Détermination du numéro d'incrément pour la famille de produit */
        SELECT family AS _family FROM product_types WHERE ptypeid = _ptypeid[j];                                                                                                                               -- CETTE LIGNE LA BUG
        SELECT max(x'right( _sn[j], 4)'::integer) AS _dddd FROM product WHERE ptypeid IN (SELECT ptypeid AS _ptypeidtab FROM product_types WHERE family = _family) ;
        /* Si c'est le premier produit on commence la numérotation à 1 */
        IF (_dddd IS NULL)
        THEN
            _dddd = 0;
        END IF;
        
        /* Création de la cadence + Récupère l'identifiant */
        INSERT INTO supplierdeliveries (sorderid, ptypeid, batch, quantity) VALUES (_sorderid, _ptypeid[j]::integer, _batch[j]::integer, _quantity[j]::integer) RETURNING "sdeliveryid" INTO STRICT _sdeliveryid;

        /* Création des produits liés à la cadence */
        FOR i IN 1 .. _quantity[j] LOOP
            _hex = right('0000' || int_to_hex(_dddd + i),4);
            _sn[j] := left(_sn[j], -4) || UPPER(_hex);
            
            /* Insertion */
            INSERT INTO product (sdeliveryid, ptypeid, sn, status, date) VALUES (_sdeliveryid, _ptypeid[j]::integer, _sn[j]::text, 'Ordered', _stardate);
        END LOOP;
    END LOOP;
END;

Avec ce code d'erreur...

la requête n'a pas de destination pour les données résultantes

Mais ce que je comprend pas c'est que quand je le fait à la main ça marche donc je pense que ce n'est qu'une question d'indice... Les tableaux commencent à partir de 1 ou 0 en postgresql?

Hors ligne

#10 11/12/2015 12:41:57

edlm
Membre

Re : Requête avec tableau

SELECT family AS _family FROM product_types WHERE ptypeid = _ptypeid[j];  -- CETTE LIGNE LA BUG

L'errreur est claire: il manque une destination, c'est à dire une variable dans laquelle mettre le résultat de la requête:


SELECT family AS _family FROM product_types WHERE ptypeid = _ptypeid[j] INTO myvariable;

Éric

Hors ligne

#11 14/12/2015 16:24:57

Papychampi
Membre

Re : Requête avec tableau

Bon bah du coup un gros GG à edlm qui m'a bien aidé sur coup là!

Hors ligne

Pied de page des forums