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 29/01/2010 19:30:45

sophonie
Membre

Fonctionnement des curseurs sous PL/pgSQL

Bonsoir à toutes et à tous,

J'ai crée 2 tables :
table1(num1 INTEGER)           table2(num2 INTEGER)

J'ai crée un script PL/pgSQL permettant de stocker dans table1 les nombres de 1 à 100,
et dans table 2 la "table de multiplication par 12" des nombres stockés dans table 1 (les nombres allant de 1 à 100).

J'ai crée une table "multiplication "
multiplication(resultat INTEGER)
Le but de cette table est de stocker la table de multiplication (le produit de chacun des
enregistrements clé par clé) des valeurs des tables table1 et table2.

Pour effectuer cette opération, j'ai utilisé un curseur, voici mon code

CREATE OR REPLACE FUNCTION stockerLesTables() RETURNS SETOF multiplication.resultat%TYPE AS
$$
DECLARE
	c_table CURSOR FOR SELECT num1 FROM table1;
	val multiplication.resultat%TYPE;
BEGIN
	FOR val IN c_table LOOP
	 INSERT INTO multiplication(resultat) VALUES (val.num1 * (SELECT num2 FROM table2 WHERE num2 = val.num1)); 
	END LOOP;
	RETURN NEXT val;
END;
$$ LANGUAGE plpgsql;

Lorsque j'exécute le script SQL en faisant \i monscript.sql tout ce passe bien, de même
que lorsque j'appelle la fonction stockerLesNombres().
Par contre lorsque je fais un SELECT * FROM multiplication;
J'ai bien 100 enregistrements mais seul 8 enregistrements sont récupérés ... les autres
valeurs sont vides.

Merci d'avance.
Sophonie.

Dernière modification par sophonie (30/01/2010 13:34:49)

Hors ligne

#2 30/01/2010 11:24:21

jpargudo
Administrateur

Re : Fonctionnement des curseurs sous PL/pgSQL

Bonjour,

J'imagine que tout cela est à but pédagogique n'est-ce pas? Car il y a des façons plus simples de peupler multiplication... Bref.

Votre problème est ici :

SELECT num2 FROM table2 WHERE num2 = val.num1

Si table2 contient des multiples de 12, l'égalité num2= val.num1 sera vraie tous les 12 tuples.

C'est à dire qu'entre 0 et 100, cette égalité sera vraie 8 fois.

Le reste du temps, c'est null. Et null x valeur = null. Ce qui explique vos "blancs" dans la table, qui sont en fait des null.

Je vous laisse corriger? smile

Bon week-end,

Hors ligne

#3 30/01/2010 13:54:08

sophonie
Membre

Re : Fonctionnement des curseurs sous PL/pgSQL

Bonjour jpargudo,

Tout cela est effectivement à but pédagogique, et aura une finalité professionnelle à terme. Dans un premier temps, je constate que le problème provient de ma requête SQL.
Ce qui témoigne qu'apparemment, j'aurai "plus ou moins" compris le fonctionnement des
curseurs, des types de données, des valeurs retournés par une fonction dans PostgreSQL ...

Je n'en suis qu'à ma première semaine d'autoformation au PL/pgSQL et je souhaite continuer car c'est un langage passionnant avec une documentation riche.
Par contre, j'aurai souhaité savoir si vous disposez d'exercices pratiques sur le langage PL/pgSQL car je veux aller plus loin dans l'extrapolation de ce langage.

En effet, mon administration (un service d'inventaire patrimonial) à un projet de numérisation, de localisation de ses ressources dans une Base de données (j'ai choisi PostgreSQL et PostGIS).
Il nous faudra travailler avec un prestataire de services, en l'occurence Dalibo pour la partie administration du serveur, mais il faut un developpeur sur place (c'est à dire moi).
C'est pour cela que je me penche sur la question concernant ce projet de mise en oeuvre
d'une Base de données PostgreSQL.

Merci d'avance.
Sophonie.

Hors ligne

#4 01/02/2010 15:14:24

jpargudo
Administrateur

Re : Fonctionnement des curseurs sous PL/pgSQL

Bonjour Sophonie,

Tout d'abord, si je vous ai répondu, ce n'était pas pour faire de la pub à ma société, mais juste parce que j'avais trouvé, ce Samedi matin, la réponse à vos tourments :-)

Cependant, votre réponse me flatte.

Pour ce qui est des exercices pratiques sur PL/pgSQL, je vais me renseigner pour savoir ce que nous pouvons faire, dans la mesure où nous avons effectivement un cursus de formation sur ce langage, avec des TPs justement.

Bonne journée,

Hors ligne

#5 03/02/2010 15:52:14

sophonie
Membre

Re : Fonctionnement des curseurs sous PL/pgSQL

Bonjour jpargudo,

jpargudo a écrit :

Votre problème est ici :

SELECT num2 FROM table2 WHERE num2 = val.num1

Si table2 contient des multiples de 12, l'égalité num2= val.num1 sera vraie tous les 12 tuples.

Je viens juste de me repencher sur les exercices en PL/pgSQL (priorités professionnelles) oblige
en fait implicitement vous m'apportiez la réponse, si la table contient des multiples de 12
alors il faut diviser par 12 la valeur récupérée par le curseur, ie num2 = val.num/12

J'attends votre retour pour les exercices d'approfondissement sur PL/pgSQL.

Merci encore.
sophonie.

Dernière modification par sophonie (03/02/2010 15:52:59)

Hors ligne

Pied de page des forums