mardi 22 janvier 2013

Savoir si les clés étrangères (FK) sont présente (Oracle)


Pour connaitre les tables qui dispose ou non de foreign key (clés étrangères –FK). j’ai conçus une petit fonction Oracle pour déterminer l’existence sur une table d’une FK par rapport a un champs.

lundi 21 janvier 2013

Merge Oracle et Taod


Ou comment mettre a jour des données d’une base sur une autre base oracle (ou un autre schéma)… Cas qui arrive assez fréquemment sur les environnements de production, de test/recette, de développement et d’intégration.

Toad est un formidable outil pour tous ce qui touche la base de données. Il permet entre autre d’utiliser une panoplie de raccourcis très pratiques.

Voici la liste des possibilités fourni par Toad :
image
  • Access Database File
  • Delimited Test
  • Excel File / Excel Instance
  • Fixe Field Spacing
  • HTML Table
  • Insert Statements
  • Merge Statements
  • SQL Loader
  • XML (plain) / XML (with XSL)

Aujourd'hui le MERGE Statement :

Préambule : Je veux mettre a jour mes données d’une table de l’environnement de production sur l’environnement de Test (sans truncate, drop ou autre)

Requête sur l’environnement de PROD

select * from NATIONALITE where rownum < 2

Requête générée par notre ami Toad :

  • Génération du mot clé MERGE
  • Utilisation d’une requete ‘Seclect’ fictive
  • Comparaison d’égalité grace a la clé primaire (PK, primary key)
    • Si Ok alors réalisation d’un UPDATE
    • Si NOk alors réalisation d’un INSERT
MERGE INTO NATIONALITE A USING
 (SELECT
  'YUG' as "NATIONALITE_ID",
  'YOUGOSLAVE' as "NATIONALITE_LIBELLE"
  FROM DUAL) B
ON (A.NATIONALITE_ID = B.NATIONALITE_ID)
WHEN NOT MATCHED THEN 
INSERT (
  NATIONALITE_ID, NATIONALITE_LIBELLE)
VALUES (
  B.NATIONALITE_ID, B.NATIONALITE_LIBELLE)
WHEN MATCHED THEN
UPDATE SET 
  A.NATIONALITE_LIBELLE = B.NATIONALITE_LIBELLE;

COMMIT;

C’est tout simple avec Toad, cela facilite grandement la tache sur ce genre d’opération. (Pour le coup, un truncate, et Insert Statement aurait bien également bien fonctionner)

mardi 8 janvier 2013

Optimisation Oracle Index et tables procédures (étape 2)


Il y a un petit moment j’ai mis un article concernant les requêtes permettant d’optimiser les tables et les index dans Oracle.

Ce script est très pratique, et je l’ai fait un peu évoluer afin de le rendre “automatique”. Je vous présente donc la monture v2 en en faisant une procédure. Cette dernière n’a rien de révolutionnaire, quelques curseurs pour parcourir les statements et les exécuter :

CREATE OR REPLACE PROCEDURE SU.REBUILD_INDEX (ma_table IN VARCHAR2)
IS
   CURSOR CURS_REBUILD
   IS
        -- rebuild  
    select 'ALTER INDEX ' || index_name || ' REBUILD ' as txt_sql from user_indexes  where UPPER(table_name) = UPPER(ma_table) and INDEX_TYPE!='LOB';
    R1         CURS_REBUILD%ROWTYPE;

   CURSOR CURS_STRUCT
   IS
        -- validate structure
    select 'ANALYZE INDEX ' || index_name || ' VALIDATE STRUCTURE ' as txt_sql from user_indexes  where UPPER(table_name) = UPPER(ma_table) and INDEX_TYPE!='LOB';
    R2         CURS_STRUCT%ROWTYPE;

   CURSOR CURS_STAT
   IS
        -- stat Analyse
    select 'Analyze Table ' || UPPER(ma_table) || ' Estimate Statistics ' as txt_sql from dual;
    R3         CURS_STAT%ROWTYPE;
      
BEGIN
    ---------rebuild  ----------------------------------------------------
   OPEN CURS_REBUILD;
       LOOP
          FETCH CURS_REBUILD INTO R1;        

            EXIT WHEN CURS_REBUILD%NOTFOUND;

            EXECUTE IMMEDIATE R1.txt_sql;
       END LOOP;
   CLOSE CURS_REBUILD;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 1 ok : TABLE : ' || ma_table);
      
   ----------validate structure---------------------------------------------------
   OPEN CURS_STRUCT;
       LOOP
          FETCH CURS_STRUCT INTO R2;        

            EXIT WHEN CURS_STRUCT%NOTFOUND;

            EXECUTE IMMEDIATE R2.txt_sql;
       END LOOP;   
   CLOSE CURS_STRUCT;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 2 ok : TABLE : ' || ma_table);
   
   -----------stat Analyse--------------------------------------------------
   OPEN CURS_STAT;
       LOOP
          FETCH CURS_STAT INTO R3;        

            EXIT WHEN CURS_STAT%NOTFOUND;

            EXECUTE IMMEDIATE R3.txt_sql;
       END LOOP;   
   CLOSE CURS_STAT;
   
   DBMS_OUTPUT.PUT_LINE('CURS_REBUILD 3 ok : TABLE : ' || ma_table);

END;
/

mardi 18 décembre 2012

Parcours fichier commande Doc (cmd)


Un petit script qui peux servir pour des taches planifiées.(en ligne de commande)
  • Instruction FOR … DO
  • Instruction DIR
  • Instruction GOTO
Comment parcourir un dossier avec un tri pas date de modification (last modified)
@echo off   
CLS
REM On fait un dir pour avoir les fichiers du répertoire en tri par DATE '/O:-D'
REM /B indique pas de summary
FOR /F %%i IN ('dir /B /O:-D C:\MonDossier') DO (
    REM Effectue la copie du dernier fichier 
    XCOPY ….
    
    GOTO FINISH
)
:FINISH

J’espère que cela vous aidera a faire vos petits petit scripts Sourire

lundi 17 décembre 2012

Tree Size - Taille des arborescences

Un petit utilitaire sympathique pour connaitre rapidement la taille de chaque dossier de votre arborescence Windows :
Il vous permet de voir ou gagner de la place...

TreeSize :
http://www.jam-software.com/treesize_free/#
image

Dans notre exemple Google Chrome conserve les installations, du coup .... hop 1Go de libre.

jeudi 24 mai 2012

Optimisation Oracle Index et tables

Bonjour,

Je viens de découvrir les ordres des requêtes SQL qui permettent d’optimiser les tables et index d'une table.

Cela permet via script (automatique) et par exemple suite a de grosse opération de mise a jour (update / delete), de restructurer la table en question.
select 'ALTER INDEX ' || index_name || ' REBUILD;' from user_indexes  where table_name = 'MA_TABLE';
select 'ANALYZE INDEX ' || index_name || ' VALIDATE STRUCTURE;' from user_indexes  where table_name = 'MA_TABLE';
Analyze Table MA_TABLE Estimate Statistics;

A la fin du script permet de tout mettre tout propre ^^

Voila en espérant que ces instructions puisse vous aidez.
Par contre, ce que je n'ai pas fait (par manque de temps) est le Benchmark de ses actions pour savoir le gain. Il aurait fallut analyse les performances avant la mise a jour des index/tables et après l'opération pour avoir le rapport de performance.
Dans tous les cas, cela ne peux pas faire de mal :)

vendredi 4 mai 2012

Concaténation Oracle

Bonjour a tous, Une petite astuce en Oracle pour concaténer des lignes sous forme de "Champs" (champ1, champ2...). Il suffit d'utiliser une fonction présent dans les fonctions d'oracle : wmsys.wm_concat avec un group by Comme cela :
select wmsys.wm_concat(libelle) as LIBELLE, max(date_creation) as MA_DATE, CHIFFRE
from maTable
where critere = 1
and critere2 in (1,2,3)
group by CHIFFRE
Le résultat
LIBELLE MA_DATE CHIFFRE
-------- ------------------- ----------
aa,bb,cc 2007-11-19 44000

mardi 28 décembre 2010

IndexOutOfRangeException: Index xx non valide - Nhibernate

Bonjour,

La gestion de Nhibernate est très complexe ... et je me permet de noter l'erreur suivante qui intervient lors d'un Update :

System.IndexOutOfRangeException: Index 29 non valide pour ce OracleParameterCollection avec Count=29

C'est erreur est lié a la mise a jour de trop de champs (champs en doublons dans le fichier hbm.xml : mapping de Nhibernate). C'est souvent le cas lorsque vous avez un many-to-one pour une assoc et qu'il existe également une property sur le même champs.

A ce niveau la, Nhibernate ne sait pas quel champs prendre, il utilise donc les deux ... et plante joyeusement ^^.


[...]


Dans mon cas, 29 correspond au nombre de champs (property) mappées dans mon fichier xml.

Pour résoudre le problème, deux solutions sont disponibles :
1- Rajouter les attributs update="false" insert="false" sur la/les property

2- Supprimer soit le/les many-to-one soit la/les property


Bonne journée

lundi 30 août 2010

Incorporer une ressources dans une DLL

Bonjour,

Petit billet pour expliquer comment incorporer n'importe qu'elle type de ressources (image, javascript, ...) dans un DLL puis en faire l'appel.

Problème : Comment faire si l'on a plusieurs sites web qui font appel à des même images et script en évitant la répétition ? (copier/coller)

1er élément : le mettre sur un serveur disponible n'importe ou. Du type Google (http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js), qui en interne (en entreprise) n'est pas spécialement le bon choix, on s'orientera plus sur le meme exemple avec nos propres serveurs du style : http://entreprise.intern.fr/ajax/libs/jquery/1.4.2/jquery.min.js.

Cette solution fonctionne parfaitement, mais ce n'est pas celle que j'ai retenu d'expliquer en détails. Le 2nd élément est la mise en place d'une DLL contenant les divers images, scripts nécessaire pour les sites web.

Pour cela nous avons besoins de 2projets (ils peuvent être dans la meme solution ou non).
1. ClassLibrary (bibliothèque de classes)
2. SiteMvc

Dans - ClassLibrary - ajouter une image a la racine du projet (ici worms.jpg) :
Dans les propriétés de l'image (ou de n'importe quelles ressources), changer l'action de génération de "Contenu" en "Ressource incorporée" ! Cette étape est obligatoire !
Ensuite, ajouter une nouvelle classe au projet ClassLibrary (ou ouvrir celle par défaut : Class1.cs). Ajouter en entête de classe :
[assembly: System.Web.UI.WebResource("ClassLibrary.worms.jpg", "image/jpg")]
namespace ClassLibrary
{
    public class Class1
    {

    }
}
Attention, la casse et le namespace/dossier sont très important, sinon depuis vos autres projets vous ne pourrez pas faire l'appel correctement !
Compiler votre 1er projet, il ne doit pas avoir d'erreur.

Maintenant sur votre 2nd projet, ajoutez la référence vers votre DLL ainsi créer. Et depuis l'une de vos vue, ajouter le code suivant pour faire appel a notre image (worms.jpg)

< img src="< % = ClientScript.GetWebResourceUrl(typeof(ClassLibrary.Class1), "ClassLibrary.worms.jpg") % >" / > 

Compilez/Exécuter, tadaaaaaaaa magique l'image des Worms s'affiche sur votre navigateur. Si vous regardez dans le source de la page vous devriez voir l'url peu commune :

< img src="/WebResource.axd?d=haVvUhxQKye3YgyVc9g8l32EYKRgja8RJmuPLLUPaamPyZ8Eyx76lCDu-nUPvlKb0&t=634187628689941128" / >

Voila, c'est tout pour l'instant, j'espère que vous avez appris quelque chose, et que cela vous a servi :)

Coding4Fun

jeudi 26 août 2010

Gestion des Type Enum C#

Bonjour a tous !

De retour de vacances, en forme pour de nouveau épisode de code sur mon Blog ^^. J'espère que pour vous que vos vacances se sont bien passé et que vous avez pu vous reposez et profitez du soleil.

Un petit billet pour faire quelques explication sur les Enum en C#.

Ma question initial était de pouvoir avoir des types défini et comparable en string. Cependant a ma connaissance les Enums n'etaient que comparable avec des int de cette manière :

private enum InputType
{
    Checkbox,
    Hidden,
    File,
    Password,
    Radio,
    Reset,
    Submit,
    Text
}

... InputType.Text == 7 ...

Or, ce que je souhaite c'est de pouvoir afficher le texte de mon Enum (et non la valeur) :

Console.WriteLine("Le champ Text : " + InputType.Text)
// produit : Le champ Text : 7

Pour cela, il faut utiliser les méthodes présentes dans System.Enum : (2 essentiellement)

// Récupération de tous les textes de l'enum en question
var tab = System.Enum.GetNames(typeof(InputType));
// Récupération du texte de l'enum donné
var elm = System.Enum.GetName(typeof(InputType), InputType.Checkbox);

Cependant, une méthode plus courte existe, l'utilisation du .ToString() sur le type donné. Néanmoins, l'intellissence de Visual Studio (2008 - C# 3.5) note que cette méthode est désapprouvée et qu'il faut utiliser System.Enum.ToString() ?!

Ça marche très bien comme cela :

string val = InputType.Text.ToString();