Pages

Affichage des articles dont le libellé est trigger. Afficher tous les articles
Affichage des articles dont le libellé est trigger. Afficher tous les articles

Trigger pour fusionner et écrire 2 colonnes de la ligne en cours sujet

samedi 1 février 2014




Voilà,

j'utilise une station météo qui stocke les données dans une mysql.

J'ai donc une table appelée Meteo qui contient les colonnes suivantes (enfin, je ne recopie ici que les 3 premieres)

Code:


date                time                temperature
2014-02-01        17:07:00        4.2


Ma problématique est que je veux utiliser un deuxieme logiciel pour générer des graphiques qui viendrait donc piocher dans cette base de données.
Hors ce dernier n'arrive pas à reconnaitre le format date / heure de mysql.

Au lieu d'un champ date et d'un champ heure, ce programme souhaite un champ unique de la forme YYYYMMDDhhmmss

Au niveau du premier logiciel, je ne peux modifier sa façon dont il vient écrire la date et l'heure dans la base de données.


C'est là où je patauge, car je ne maitrise pas SQL....


La solution passerai par une colonne supplémentaire avec la date/heure au bon format (ex: 20140201183000)

J'ai donc ajouter une colonne supplémentaire nommée "datetime2"
Dans un premier temps, j'ai essayé un trigger qui va remplir cette nouvelle colonne à l'écriture des données.

Le Trigger utilisé:

Code:


DELIMITER //
DROP TRIGGER IF EXISTS `Test_insert_trigger`//
CREATE TRIGGER `Test_insert_trigger`
BEFORE INSERT ON `Meteo`
FOR EACH ROW
BEGIN
IF NEW.datetime2 = '0000-00-00 00:00:00' THEN
SET NEW.datetime2 = NOW();
END IF;
END;//


=> 2 problemes:
Le format de date n'est pas bon mais surtout, le plus important est qu'il note la date/heure du moment où la ligne s'écrit.
Dans mon cas ce n'est pas bon car il m'arrive d'injecter des données en retard. Elles ne seront donc pas horodaté correctement.


L'idéal est donc que je parte des deux premieres colonnes (date et time) pour en faire une seule.

J'ai fait cela:

Code:


SELECT CONCAT(YEAR(date),MONTH(date),DAY(date),HOUR(time),MINUTE(time),SECOND(time)) FROM Meteo

Avec pour but de l'inserer dans le trigger.

Le probleme est que cela fonctionne bien sur une ligne existante mais comment le faire sur une ligne en cours d'écriture ?

L'idéal serait que le trigger, à l'écriture de la ligne, recupere la date et l'heure des deux premieres colonnes pour ensuite venir l'ajouter en fin de ligne à la derniere colonne sous un format YYYYDDMMhhmmss.


Quel serait la solution à cette problématique ?

Merci beaucoup...




[10g] Trigger : sauvegarder les lignes d'une table dans un fichier texte après une mise à jour sujet




J'ai écrit un trigger qui suite à une modif devrait enregistrer toutes les lignes d'une table dans un fichier texte.

Code:


create or replace trigger trig_cli
  after update of nom on client for each row
   
        declare

        v_filehandle utl_file.file_type;
cursor cli Is
        select * from client;
        begin
                         
        v_filehandle :=utl_file.fopen('MY_DOCS','j2ee.txt','w');--Opening a file
           
        for v_cli_rec IN cli LOOP
         
            utl_file.putf(v_filehandle,'clients %s : %s\n',v_cli_rec.nom,v_cli_rec.prenom);                   
        end loop;
     
        UTL_FILE.fclose(v_filehandle);
               
    end trig_cli;


Le trigger est crée correctement.
Quand, je fais une maj de la table j'obtiens l'erreur suivante :

ORA-04091: la table MYDB.CLIENT est en mutation ; le déclencheur ou la fonction ne peut la voir
ORA-06512: à "MYDB.TRIG_CLI", ligne 5
ORA-06512: à "MYDB.TRIG_CLI", ligne 12
ORA-04088: erreur lors d'exécution du déclencheur 'MYDB.TRIG_CLI'

Y'a-t-il un moyen de corriger cette erreur ou d'exporter la table autrement pour éviter le problème de table en mutation?

Merci