Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 19/07/2012 15:12:49
- hyasinthe9
- Membre
PL/pgSQL
Bonjour à tous,
Besoin d'aide. Voici les codes:
CREATE OR REPLACE FUNCTION "AA_fh_merger_final"(ma_tab_1 text, ma_tab_2 text)
RETURNS void AS
$BODY$
DECLARE
toto refcursor; --CURSOR FOR ( SELECT * FROM ma_tab_2);
n integer;
m integer;
resultat RECORD;
a integer:=0;
BEGIN
BEGIN
EXECUTE 'SELECT count(*) FROM'||ma_tab_1::regclass
INTO n;
EXECUTE 'SELECT count(*) FROM'||ma_tab_2::regclass
INTO m;
END;
a:=n;
OPEN toto FOR EXECUTE 'SELECT * FROM ' ||ma_tab_2::regclass; --quote_ident(ma_tab_2); -- ouvrir le cursor
FOR I IN 1..m LOOP
a:=a+1;
--MOVE NEXT FROM toto;
FETCH toto INTO resultat; -- fetch une ligne dans un record
EXECUTE 'UPDATE' ||ma_tab_2::regclass|| 'SET' ||'id' ||'=' ||a || 'WHERE CURRENT OF'|| toto;--||quote_ident('id')
END LOOP;
CLOSE toto; -- fermer le cursor
EXECUTE 'INSERT INTO' ||ma_tab_1::regclass|| 'SELECT * FROM' ||ma_tab_2::regclass;
END$BODY$
LANGUAGE plpgsql VOLATILE
Ce code devrais permettre de merger deux tables.Mais il y a encore un petit bug.
Voici ma question:En général les lignes suivantes devraient retourner les nombres de lignes d'un tables, mais elles m'envoient "1" .pourquoi???
EXECUTE 'SELECT count(*) FROM'||ma_tab_1::regclass
INTO n;
EXECUTE 'SELECT count(*) FROM'||ma_tab_2::regclass
INTO m;
(voir 12ème et 14ème lignes)
Merci d'avance.
Hors ligne
#2 19/07/2012 17:11:02
- rjuju
- Administrateur
Re : PL/pgSQL
Bonjour,
je dirais qu'il manque un espace après le FROM
-> EXECUTE 'SELECT count(*) FROM '||ma_tab_1::regclass
INTO n;
cela devrait alors fonctionner.
Julien.
https://rjuju.github.io/
Hors ligne
#3 19/07/2012 17:17:41
- gleu
- Administrateur
Re : PL/pgSQL
Je ne comprends pas pourquoi vous faites un "::regclass".
Guillaume.
Hors ligne
#4 20/07/2012 08:35:53
- hyasinthe9
- Membre
Re : PL/pgSQL
Merci beaucoup pour cette réponse rjuju.
J'ai encore besoin d'aide sur le 23ème ligne:
EXECUTE 'UPDATE ' ||ma_tab_2::regclass|| ' SET ' ||'id' || ' = ' ||a || 'WHERE CURRENT OF toto';
(voir code ci-dessus)
Hors ligne
#5 20/07/2012 09:12:51
- rjuju
- Administrateur
Re : PL/pgSQL
Dans votre code il manque des espace après le UPDATE, autour du SET, avant le WHERE et après le CURRENT OF
Pour les requêtes générées il faut faire attentions aux espaces, et ne pas hésiter à en mettre trop que pas assez.
Julien.
https://rjuju.github.io/
Hors ligne
#6 21/07/2012 10:39:15
- hyasinthe9
- Membre
Re : PL/pgSQL
Salut rjuju,
Pour ma 1ère question c'était bien un problème d'espace:
EXECUTE 'SELECT count(*) FROM ' ||ma_tab_1::regclass
INTO n;
Mais pour la 2ème, j'ai tout essayé, ça ne fonctionne pas encore.
EXECUTE ' UPDATE ' ||ma_tab_2::regclass|| ' SET ' ||'id' || ' = ' ||a || ' WHERE CURRENT OF toto';
Est-il possible que je me suis trompé de syntaxe?
En faite je veux que ce ligne de code modifie l' 'id' de la table en fonction de la variable "a" en utilisant le curseur "toto".
Quelqu'un peut me conseiller une autre méthode?
Merci de votre participation.
Hors ligne
#7 21/07/2012 11:07:45
- gleu
- Administrateur
Re : PL/pgSQL
Donner le message d'erreur aide grandement à trouver la solution à votre problème. Néanmoins, ceci devrait vous aider :
EXECUTE ' UPDATE ' ||ma_tab_2::regclass|| ' SET ' ||'id' || ' = ' ||a || ' WHERE CURRENT OF "' || toto || '"';
Autrement dit, il faut placer la valeur de toto entre des guillemets doubles comme il s'agit d'un nom d'objet.
Guillaume.
Hors ligne
#8 26/07/2012 11:06:54
- hyasinthe9
- Membre
Re : PL/pgSQL
Merci gleu,
Votre suggestion m'a beaucoup aidé.Mes codes marchent très bien grâce à votre conseil sur guillemet ("toto").
Hors ligne