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).

#101 Re : Général » [SQL] Ordre de tri non naturel » 22/10/2010 16:18:04

Marc Cousin a écrit :

Sous PostgreSQL, false<true

Ce qui est dangereux, c'est que ça dépend vraiment de comment le SGBD trie les booleens. Je doute donc que ça soit très portable d'un SGBD à l'autre.

A la lueur de cette explication, j'ai essayé ceci :

select * from actes order by ccam != 'ZZLP025'
et ceci
select * from actes order by ccam = 'ZZLP025' desc

et ça marche !

#102 Re : Général » [SQL] Ordre de tri non naturel » 22/10/2010 16:12:18

Oui,
  ça sent le tir groupé du vendredi après midi de ceux qui moulent devant leur poste parce qu'il est définitivement trop tard pour commencer un truc plus important.

Cordialement

#103 Re : Général » [SQL] Ordre de tri non naturel » 22/10/2010 16:02:35

gleu a écrit :

Oui, c'est possible. Si ta colonne s'appelle pays, ça peut donner quelque chose comme : ORDER BY pays='France', pays

Bonjour,
  je viens d'essayer sur une table que j'ai sous la main, et il faut que j'écrive ceci pour avoir l'acte ZZLP025 en premier, puis les auttres dabs le bon ordre :

select * from actes order by ccam = 'ZZLP025' desc, ccam asc

Cordialement

#104 Re : PL/pgSQL » curseur dans un curseur » 18/10/2010 15:32:38

Effectivement,
  mais j'avais d'autres projets pour eux (les stocker dans une table).

Mais je vais quand même les caster dans un premier temps.

Merci du coup du main

#105 Re : PL/pgSQL » curseur dans un curseur » 18/10/2010 15:13:30

Effectivement, ça pourrait être une solution mais :
- tout les champs renvoyés ne sont pas du même type
- idnum sera présent quoiqu'il arrive.

J'ai bien imaginé une alternative, mais elle me parait lourdingue. Dans ma table qualito, le pourrait avoir une colonne qui indiquerai le nombre de champs renvoyé par la requête "query", ce que je pourrait ensuite traité avec des if - elsif - then puisque je ne pense renvoyer de 1 à 4 champs grand max.

Sinon, il faudrait que je trouve un truc du style d'un array qui accepte le mélange de type.

Cordialement

#106 Re : PL/pgSQL » curseur dans un curseur » 18/10/2010 14:14:05

Hello,
  ce n'est pas le nombre de paramètres qui change, c'est le nombre de champ renvoyés.

la partie qui est concernée est la suivante :

    FOR result in EXECUTE qual.query using datdeb, datfin LOOP
      RAISE NOTICE '%', result;
    END LOOP;

le RECORD "result" pourrait avoir 1 à n champs, et c'est le nombre de champ de "result" que je souhaitera compter.

Pour être plus clair, sur mes deux requêtes de la table qualito, l'une cherche les codes postaux imprécis, l'autre les code postaux non renseignés.

La première me renvoie idnum plus la valeur du code postal incriminé, l'autre n'a besoin de me renvoyer que l'idnum. Donc mon result pourrait avoir 1 ou 2 champs dans ce cas, et c'est ce que je cherche à compter.

Cordialement

#107 Re : PL/pgSQL » curseur dans un curseur » 18/10/2010 13:44:17

Bonjour,
  cherchant à améliorer les choses, il me reste deux choses à élucider.

Sachant que les requêtes stockés dans la table qualito pourront renvoyer 1..n champs, y'a-t il un moyen de compter le nombre de champs d'un type RECORD ?

En relation avec la première question, plutôt que d'appeler chaque champ du RECORD ou du ROWTYPE par son nom, y-a t-il un moyen de l'appeler par son ordre (un peu comme quand on fait un ORDER BY 1,3 DESC par exemple)?

Cordialement

#108 Re : PL/pgSQL » curseur dans un curseur » 18/10/2010 11:24:37

Bonjour,
  finalement j'ai réussi à coup de FOR...LOOP

Pour ceux que ça pourraient intéresser, voila le résultat:

DROP TABLE IF EXISTS testing;
CREATE TABLE testing(
  idnum INTEGER,
  datsor DATE,
  codpos CHAR(5)
  );
INSERT INTO testing (idnum, datsor, codpos) VALUES
  (1,'2010-01-03','13005'),
  (2,'2009-12-27','13999'),
  (3,'2010-02-12','13999'),
  (4,'2010-01-25',NULL);

DROP TABLE IF EXISTS qualito;
CREATE TABLE qualito(
  idqry INTEGER,
  query VARCHAR,
  libqry VARCHAR
  );
INSERT INTO qualito VALUES (1,'select idnum, codpos from testing where codpos like ''%999'' and datsor between $1 and $2;','Code postal imprécis');
INSERT INTO qualito VALUES (2,'select idnum, codpos from testing where codpos is null and datsor between $1 and $2;','Code postal vide');

CREATE OR REPLACE FUNCTION plop(datdeb date, datfin date)
RETURNS VOID AS
$BODY$
DECLARE
  lstqry CURSOR FOR SELECT idqry, query, libqry FROM qualito;
  qual qualito%ROWTYPE;
  result RECORD;
BEGIN
  RAISE NOTICE 'Bornes des séjours : % à %', TO_CHAR(datdeb,'DD/MM/YYYY'),TO_CHAR(datfin,'DD/MM/YYYY');
  FOR qual IN lstqry LOOP
  RAISE NOTICE 'Exécution de la requête: % - %', qual.idqry, qual.libqry;
    FOR result in EXECUTE qual.query using datdeb, datfin LOOP
      RAISE NOTICE '%', result;
    END LOOP;
  END LOOP;
END;   
$BODY$
LANGUAGE PLPGSQL VOLATILE;
select plop(to_date('20100101','YYYYMMDD'),to_date('20101231','YYYYMMDD'));

#109 Re : PL/pgSQL » curseur dans un curseur » 15/10/2010 14:37:41

Ok, merci déjà pour ça qui m'enlève une épine du pied.
J'ai aussi testé ça qui semble fonctionner :

WHILE FETCH v_cursor INTO v_record LOOP
  -- instructions
END LOOP;

Cordialement

PS : j'avais oublié de dire que je suis débutant en plpgsql (et en création de function) mais je crois que ça s'est vu!

#110 PL/pgSQL » curseur dans un curseur » 15/10/2010 12:57:06

meles
Réponses : 14

Bonjour,
  suite à cette discussion [url]http://forums.postgresql.fr/viewtopic.php?id=1026[url], je me lances dans l'écriture d'une procédure, avec pour paramêtres des dates (debut et fin) qui devra aller lire une table de requête et les exécuter une a une avec les paramêtres de dates passés (jexpère être clair). A terme, je souhaiterai que les résultats de chaque requête soit écrit dans une table mais dans un premier temps, je vais me contenter d'un affichage écran.

Voila ou j'en suis:

drop table if exists testing;
create table testing(
  idnum integer,
  datsor date,
  codpos char(5)
  );
insert into testing (idnum, datsor, codpos) values
  (1,'2010-01-03','13005'),
  (2,'2009-12-27','13999'),
  (3,'2010-02-12','13999'); 

drop table if exists qualito;
create table qualito(
  idqry integer,
  query varchar,
  libqry varchar
  );
insert into qualito values (1,'select idnum, codpos from testing where codpos like ''%999'' and datsor between $1 and $2;','Code postal imprécis');

CREATE OR REPLACE FUNCTION plop(datdeb date, datfin date)
RETURNS VOID AS
$$
DECLARE
id INTEGER;
req VARCHAR;
lib VARCHAR;
lstqry CURSOR FOR SELECT * FROM qualito;
BEGIN
OPEN lstqry;
FETCH lstqry INTO id, req, lib;
WHILE FOUND LOOP
  RAISE NOTICE '%,%,%', id, req, lib;
END LOOP;
END;   
$$
LANGUAGE PLPGSQL
VOLATILE
COST 100;

select plop(to_date('20100101','YYYYMMDD'),to_date('20101231','YYYYMMDD'));

Je sèche un peu pour ouvrir une deuxième boucle dans la première (avec un nouveau curseur sur la requête lu dans la table qualito).
L'autre probleme est le comportement de ce code! il boucle et m'affiche plusieur fois le message RAISE NOTICE alors qu'il devrait ne le faire qu'une fois puisqu'il n'y a qu'une requete dans la table qualito.

Cordialement

#111 Re : Général » stockage et exécution de requêtes à partir d'une table » 14/10/2010 14:25:24

Super,
  merci beaucoup, je vais creuser tout ça.

Cordialement

#112 Re : Général » stockage et exécution de requêtes à partir d'une table » 14/10/2010 12:54:10

Bonjour,
  bon, c'est bien ce à quoi je pensait alors. Une procédure stockée me convient parfaitement. On va essayer de faire ça.

connaissez vous un projet libre avec ce type de chose que je puisse aller m'inspirer du code ?

sous quelle forme dois-je stocker mes requêtes ? un simple varchar suffirat-il ?

Cordialement

#113 Général » stockage et exécution de requêtes à partir d'une table » 14/10/2010 12:06:49

meles
Réponses : 4

Bonjour,
  dans le cadre d'un traitement de contrôle qualité sur mes données, je suis amené à exécuter près de 250 requêtes régulièrement. Actuellement, je fait ça à partir d'un source que je lance avec "psql -f".

N'y a t'il pas moyen de stocker les requêtes dans une table et de les exécuter à partir de cette dernière ? que faire s'il y a des paramètres à passer dans la requête ? Je souhaiterai également stocker les résultats dans une autre table (N° du dossier, Identifiant de la requête positive).

Bref, toutes pistes sur l'intérêt et la façon de réaliser ça sera bienvenue.

Cordialement

PS : si je ne suis pas clair, n'hésitez pas à le faire savoir.

#114 Re : Général » Syntaxe de COUNT(expression) » 09/06/2010 12:52:48

Bonjour,
  j'arrive un peu après la bataille mais il y aurai eu aussi ceci de possible :

SELECT sum (case when a=1 then 1 else 0 end), sum (case when a=2 then 1 else 0 end) from test;

Je ne sais pas ce qui est le plus rapide !

Cordialement

Pied de page des forums

Propulsé par FluxBB