Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
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
Pages : 1