Oracle : Update or Insert = MERGE

J’ai du répondre à une question simple de prime abord, comment mettre un jour un référentiel, non prévu pour être versionné, et ayant pu évoluer de manière différente sur chacun des différents sites de manière indépendante.

Après quelques recherches, le principal mot clé qui pouvait revenir était : MERGE

Un merge pour un développeur, c’est quelque chose de connu et ce n’est pas souvent envisager comme quelque chose de simple et de généralisable.
En théorie si, mais en pratique, c’est souvent durant cette étape que la livraison de son code prend un retard inattendu.

Alors avant d’envisager une telle pratique quand on utilise traditionnellement le SQL pour faire de simple CRUD … on cherche du simple … on envisage de se mettre au PL …. voir de faire une mini application faisant ce que l’on veut.

Et pourtant, le merge cela peut aussi être simple dans certain cas et cela peut rapidement être mis en place.

Comme dit en introduction, mon contexte était le suivant :
– Mise à jour de référentiel
– Pas d’assurance sur l’état du référentiel avant travaux
– Pas nécessairement le temps de s’assurer de la cohérence des données pour chacun des sites.

A priori, il existe plusieurs techniques, plus ou moins simple pouvant arriver à ce résultat.
Dans mon cas, il fallait que le génération du script se fasse dans un temps relativement court … et en ne demandant pas de devenir DBA au passage.

Le processus choisit pour l’actualisation de la table fut le suivant :

– Mise en place d’une date de fin pour l’ensemble des champs du référentiel utilisé en production (assurance de conserver les champs pour les données déjà saisies).
– Injection de la nouvelle table de référentiel
– merge proprement dit entre l’ancienne table et la nouvelle afin d’actualiser les champs utiles, quelques soit l’état de la table initialement.

En SQL, cela donne cela :


-- Généralisation de la date de fin à l'ensemble des occurrences de la table
update SOC_TYPE_DOMICILE set datefin= '01/11/14';

-- Injection de la table référentiel nouvelle version
CREATE TABLE "SOC_TYPE_DOMICILE_REF"
( "CODE" VARCHAR2(10 BYTE),
"CODEREGROUPEMENT" VARCHAR2(10 BYTE),
"DATEDEBUT" DATE,
"DATEFIN" DATE,
"LIBELLE" VARCHAR2(100 BYTE),
"RANGAFFICHAGE" NUMBER(3,0),
"ANCIENCODECSD" VARCHAR2(10 BYTE),
"CODEREGROUPEMENTTYPE" VARCHAR2(10 BYTE),
"ID_LIBELLE" NUMBER(7,0)
);

Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('SIFO','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Sans information','1','0',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('HEBST','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Hébergement stable','2','2',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('HEBPR','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Hébergement précaire ou de durée incertaine','3','A',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('HOP','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Hôpital sans perspective de logement à la sortie','4','B',null,null);
Insert into SOC_TYPE_DOMICILE_REF (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE) values ('SAB','SIT_LOC',to_date('01/01/07','DD/MM/RR'),to_date('01/11/14','DD/MM/RR'),'Sans abri, absence totale d hébergement','5','1',null,null);

-- Merge
-- deux cas : la ligne existe : dans ce cas on modifie le libellé pour qu'il corresponde exactement avec le résultat attendu (les valeurs, même modifiées, ne changent pas de sens)
-- La ligne n'existe pas, on l'insère
MERGE INTO SOC_TYPE_DOMICILE S
USING SOC_TYPE_DOMICILE_REF R
ON ( S.CODE = R.CODE )
WHEN matched
THEN UPDATE SET S.DATEFIN = null, S.LIBELLE = R.LIBELLE, S.RANGAFFICHAGE = R.RANGAFFICHAGE, S.ANCIENCODECSD = R.ANCIENCODECSD
WHEN not MATCHED
THEN INSERT (CODE,CODEREGROUPEMENT,DATEDEBUT,DATEFIN,LIBELLE,RANGAFFICHAGE,ANCIENCODECSD,CODEREGROUPEMENTTYPE,ID_LIBELLE)
VALUES (R.CODE,R.CODEREGROUPEMENT,R.DATEDEBUT,R.DATEFIN,R.LIBELLE,R.RANGAFFICHAGE,R.ANCIENCODECSD,R.CODEREGROUPEMENTTYPE,R.ID_LIBELLE);

-- et c'est fini ...

Duplication de clé USB

des fois on se fait plaisir avec peu de ligne de commande ..

Duplication de la clé
dd if=/dev/sdc of=/dev/sdd bs=4096 conv=notrunc,noerror

Hors avec des clés de tailles différentes, on obtient :

fsck /dev/sde1
fsck from util-linux 2.20.1
e2fsck 1.42.8 (20-Jun-2013)
La taille du système de fichiers (selon le superbloc) est de 7793408 blocs
La taille physique du périphérique est de 7674624 blocs
Le superbloc ou la table des partitions est peut-être corrompue !

Un simple : resize2fs -f /dev/sde1 7674624

et tout est de nouveau opérationnel :

fsck /dev/sde1
fsck from util-linux 2.20.1
e2fsck 1.42.8 (20-Jun-2013)
/dev/sde1 : propre, 25468/1925120 fichiers, 303289/7674624 blocs

Je vais de nouveau mettre ma sd card classique dans le Eeepc et la microSD dans une nouvelle go-pro ^^

Maisons de santé, un projet en devenir

Travaillant depuis maintenant deux ans pour un éditeur de logiciel en phase avec le monde de la santé, c’est avec un grand intérêt que je suis le projet de l’Asip Santé quand à son label maisons de la santé.

L’objectif est de permettre aux acteur de la santé de s’assurer que le logiciel qu’ils évaluent ou qu’ils possèdent répond correctement à un ensemble conséquent mais indispensable de fonctionnalités.

A l’inverse, cette homologation permet pour un éditeur de connaître, dans les grandes lignes le périmètre d’une solution pour ce type d’acteur.

A titre perso, cette définition de périmètre me permet de voir l’étendu du travail à accomplir pour réaliser ce type de développement … et après un premier passage sur le DSFT de l’Asip santé ( lien ext ), il y a du travail en perspective.

Mise à jour de wordpress

Depuis quelques temps, les mises à jours automatiques ne se faisait plus pour raison de mémoire, et là,
je n’ai pas fait attention à qui à changer ses pré-requis mais elle est passée.

Avec cette mise à jour et la suppression de tous les commentaires non-validés (rien de moins que 50 000), c’est peut être l’occasion de relancer ce blog

A bienôt.

Résumé des tweets de la semaine

Article pas très original mais qui me permet de faire le point sur les diverses infos que j’ai relayé cette semaine.

Sauget Marc ‏@marcSauget
Pub inside : Save 50% on all ebooks and videos, 40% on all print books http://oreil.ly/RvYxcT

4 Sept Sauget Marc ‏@marcSauget
@jugedadouche @Maitre_Eolas Shit ou situation sociales ? Il suffit de croiser des Djeuns (sans shit) pour avoir déjà très peur …

3 Sept Sauget Marc ‏@marcSauget
Encore quelques mois à ce rythme et je me transforme en un Hudson à moi à tout seul 🙁

Le conducteur était ivre, avait fumé du cannabis et n’avait plus le permis. http://franche-comte.france3.fr/2012/08/29/accident-de-pomoy-le-conducteur-etait-ivre-et-avait-consomme-du-cannabis-64491.html …” : sélection naturelle ???

28 Août Sauget Marc ‏@marcSauget
Test Astah Community sur un projet perso … c’est con que la génération de code soit absente de cette version #fail #UML #test

Post Bookmaks, de tous et de rien, mais surtout de rien

Histoire de mettre un peu de vie sur ce site … désolant mort, voici quelques liens divers et variés :

Dans la rubrique moto :
le contrôle technique semble est remis à plus tard … en espérant que le plus tard soit jamais car le défaut technique n’intervient que rarement comme cause dans les accidents motos (de l’ordre du pourcent) par contre il pourrait revenir par l’aspect écologie … Je ne suis pas contre l’écologie, mais bon, des contrôles sur route par les forces de l’ordre, c’est aussi possible, moins systématique (mais moins source de revenu aussi … )

D’un point de vue sécurité routière, la chasuble est oublié .. mais revient sous la forme d’un timbre poste (150 cm2) à avoir entre le coup et les hanches … encore un truc inutile ..servant juste à ne pas perdre la face … politique de m …

Niveau nouveauté sympa, un casque branché sur un accéléromètre

http://www.moto-net.com/breve.php?RefBreve=4577

[ad#Google Adsense]

Niveau informatique, que du vieux en ce qui me concerne, les évaluations de technologie prennent leur temps, et niveau recherche je n’en parle pas, pour le moment, même lecture d’article me semble loin ….

Cariatides est DMP Compatible

Cariatides est maintenant DMP Compatible pour sa version 6.8 pour les 3 profils du DMP (Dossier Médical Patient) :  Profil création, Profil alimentation et Profil consultation.

Au bout de 3 mois, on voit une sortie positive pour ce projet 😀
Maintenant, il ne reste plus qu’à faire qu’il soit utilisable par des utilisateurs lambdas … Ce n’est pas rien mais le plus important est fait.

Pour info : Cariatides est logiciel de suivit de patient pour les hôpitaux psychiatriques, concu et développé par le GIP Symaris (Rouffach) basé sur le WebObjects associé à une base Oracle.

[ad#Google Adsense]

Manque de souffle

Ce blog n’a jamais été très régulier, mais là,j’avoue qu’il manque cruellement de mise à jour. Un nouveau job, une nouvelle thématique … tout en n’essayant de poursuivre en à coté des activités de recherche, cela prend du temps et cela n’en laisse plus beaucoup au reste …

Comme on dit, cela commence à se poser et je vais bientôt pouvoir reprendre une petite activité de publication ici même.

[ad#Google Adsense]

Dans les tuyaux, beaucoup de découverte en ce qui me concerne, que se soit :
– d’un point vue OS, puisque je travailles sous Mac depuis début septembre.
– d’un point de vue technologie car mon nouvel emploi dans le développement d’application WEB me permet d’approfondir un pan complet de l’informatique, que je n’utilisais que peu jusqu’à peu de temps.
– d’un point de vue recherche, avec l’accomplissement d’une nouvelle étude sur la décomposition de domaine pour l’apprentissage de réseau de neurones, mais aussi, avec surement dans peu de temps, une nouvelle version d’EgsToolkit afin publier les dernières modifications de ce logiciel.

A bientôt

Les trois vallées, roadbook moto

Une magnifique balade à faire en un ou deux jours.

On y trouve la cote de Maîche, les enfilades le long du doubs entre Morteau et Pontalier, la splendide vallée de la Loue, de sa source à Quingey, puis ensuite un retour sur le nord Franche-Comté par la vallée de l’Ognon



Agrandir le plan