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

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

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.

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

Pied de page des forums