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 15/05/2013 15:58:42

Gold.Strike
Membre

Procédure stockée de suppression commune à plusieurs tables

Bonjour,

Pour des opérations de maintenance sur ma base de données, j'ai besoin de supprimer des données sur certaines tables.
Les données seront supprimées via un batch quotidien qui traitera toutes les données à supprimer par lots.
J'aurais donc 2 procédures stockées :
- la première, qui fera un "loop", afin de parcourir l'ensemble des données à supprimer
- la seconde, qui réalisera la suppression, et loguera les éventuelles erreurs dans une table de synchronisation

J'ai des soucis avec la procédure stockée chagée de la supprression, car j'aurais souhaité qu'elle fonctionne pour toutes les tables :

-- Function: delete_data(bigint, text, text)
-- DROP FUNCTION delete_data(bigint, text, text);
CREATE OR REPLACE FUNCTION delete_data(data_id bigint, Colname text, tablename text)
  RETURNS integer AS
$BODY$ 
DECLARE
 curtime timestamp;
 table_name text;
 error text;
 request text;
 
BEGIN 

 -- on lance la suppression
 DELETE FROM tablename
 WHERE Colname=data_id;
 
 -- gestion des exceptions
 EXCEPTION WHEN OTHERS THEN
  curtime := 'now';
  table_name := tablename;
  error := cast(sqlstate as varchar);
  request := 'data_id : ' || cast(data_id as varchar);
  raise EXCEPTION  'error : % %', sqlstate, sqlerrm;
  INSERT INTO synchronisation_errors_logs("date", error, table_name, request) 
  VALUES(curtime, error, tablename, request);
  RETURN 0;
  
END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION delete_data(bigint, text, text)
  OWNER TO postgres;

J'obtiens le message d'erreur suivant :

ERREUR:  error : 42P01 la relation « tablename » n'existe pas

Est-ce normal?
Ne peut on pas définir un nom de table avec une variable?

Hors ligne

#2 15/05/2013 17:55:39

rjuju
Administrateur

Re : Procédure stockée de suppression commune à plusieurs tables

Bonjour,

il faut utiliser une requête dynamique, du genre EXECUTE 'DELETE FROM ' || tablename || ' WHERE ' || colname || ' = ' || data_id;

Hors ligne

#3 16/05/2013 14:20:13

Gold.Strike
Membre

Re : Procédure stockée de suppression commune à plusieurs tables

Ca marche bien, merci.

Hors ligne

Pied de page des forums