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

lundi 8 septembre 2014

Tips n°4 - Suppression doublon caractères Oracle (regexp replace)

Bonjour,

Une astuce que je viens de découvrir, elle ne sert pas tous les jours mais on se sait jamais.
Il s'agit du remplacement des caractères en double, triple ... dans une chaîne oracle.
Au finale une expression régulière toute simple mais très puissante :

SELECT regexp_replace('aa125s6df222bbbddddccc', '(.)\1+', '\1') FROM DUAL;

Résultat : 

aa125s6df222bbbddddccc
a125s6df2bdc

Associé à une petite fonction Oracle, c'est le top !

Happy coding !

mardi 24 décembre 2013

Tips n°3 - Oracle, compter le nombre de colonne dans les tables

Bonjour,

Aujourd'hui une petite astuce Oracle, et comment voir quelles sont les tables avec le plus de colonne ? Oracle vous propose donc d'utiliser une table system : ALL_TAB_COLUMNS

SELECT   table_name, COUNT (*)
    FROM all_tab_columns
GROUP BY table_name
ORDER BY COUNT (*) DESC

C'est tout simple, ca sert pas tous les jours, mais si vous aimez les statistiques vous aimerez cette requete :)

Joyeuse fetes !

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;
/

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 13 avril 2010

Récupération valeur d'une séquence Oracle avec NHibernate

Bonjour à tous,

Aujourd'hui je vais vous présentez comment récupérer une valeur d'une séquence oracle (SEQ_NAME.NEXTVAL) à l'aide de NHibernate sans écrire la requête SQL. A vrai dire l'information n'est pas facile a dénicher sur le net.

Donc voici les quelques lignes de code qui permettent de récupérer la nouvelle valeur :

NHibernate.Dialect.Oracle10gDialect dial = new NHibernate.Dialect.Oracle10gDialect();
string sqlString = dial.GetSequenceNextValString("SEQ_NAME"); // génère Select SEQ_NAME.NEXVAL FROM DUAL

ISQLQuery sqlQuery = _session.CreateSQLQuery(sqlString);
return sqlQuery.UniqueResult().ToString();

C'est plutôt simple, et donc il est facile d'étendre vos objets pour rendre cette partie un peu plus générique ;)

Bonne journée à tous

mercredi 3 février 2010

TP Active Record - Articles/Catégorie [Compil] (Partie 4)

Nous voici dans la 4nd section TP Active Record, ceci est l'explication pas à pas d'un TP de création de site Web permettant de créer des articles et d'en associer des catégories.
Voici la liste des articles disponibles :
Dans cette partie nous allons verifier le fonctionnement du code que vous avons produit dans les parties précédentes.

TP Active Record - Articles/Catégorie [NHibernate] (Partie 3)

Nous voici dans la 3nd section TP Active Record, ceci est l'explication pas à pas d'un TP de création de site Web permettant de créer des articles et d'en associer des catégories.
A ce niveau la nous utiliserons le pattern  " ActiveRecord " de l'API Castle Project utilisant NHibernate. ActiveRecord est un design pattern qui permet de masquer la complexité des interactions avec la base de données en évitant d'écrire du code SQL
Le gros avantage avec ce pattern c'est qu'il permet d'écrire aussi dans une seule et même classe le mapping base de données et la classe/l'objet métier. Je vous invite à lire l'article montrant les différences de fonctionnement entre " ActiveRecord " et un accès classique NHibernate (Mapping_NHibernate_2010-01 ...).

TP Active Record - Articles/Catégorie [Archi] (Partie 2)

Nous voici dans la 2nd section TP Active Record, ceci est l'explication pas à pas d'un TP de création de site Web permettant de créer des articles et d'en associer des catégories.
Nous allons décrire les étapes pour créer une solution depuis Visual Studio 2008 simple et pratique pour la réalisation de notre TP. Je rappel que cette solution n'est pas l'unique solution, mais me convient pour l'instant.

TP Active Record - Articles/Catégorie [Intro] (Partie 1)

Bonjour a tous,

Dans ce 1er TP, nous allons créer un site permettant de gerer des articles associés a des catégories. Un sujet classique, cas d'école, qui nous permettra de voir les différents concepts : NHibernate, MVC 3.5, Castle Active Record, Linq et bien d'autres.
Voici le sommaire que je vous propose :

lundi 1 février 2010

Portage du tutoriel Contact Manager de Entity Framework à NHibernate (et Oracle)

De la même maniere que mon cher collègue Michel, sur son blog (Linq To SQL). Je vais vous présentez comment migrer de Entity Framework à NHibernate + Oracle.

Tout d'abord les informations nécessaires

Création du modèle
Tout de suite, ici il ne s'agit pas de faire du drag'n drop de vos tables avec de beaux object Visual Studio ! Il faut coder lignes par lignes notre modele de persistance.
Tout d'abord supprimez :
  • le fichier "modele" .edmx
  • les références inutiles (System.Data.Entity)
  • le repository : EntityContactManagerRepository.cs

lundi 25 janvier 2010

Exception Oracle 64 bits / 32 Bits

Si vous etes sous un environnement 64bits comme moi et que vous developpez avec visual studio et avec Oracle il vous est peut etre déjà arrivé de voir cette erreur :

La tentative de chargement des bibliothèques du client Oracle a renvoyé BadImageFormatException. Ce problème se produit en mode 64 bits avec les composants du client Oracle 32 bits installés.
Tout simplement, c'est que le client Oracle installé sur votre machine n'est pas de type 64bits et donc de ce fait, l'application s'exécutant en 64bits pose souci !

Pour y remédier, tout simplement : Bouton droit >> Propriétés de votre Application, Onglet "Générer" et choisissez x86


lundi 11 janvier 2010

Création d'un contrainte de type booleen Oracle (Check)

Bonjour,

La petite astuce du jour, et de créer un champs "Booleen" dans Oracle. Or Oracle n'a pas ce type de champs possible lors de la création de table. Il n'existe que en PL/SQL.

Cependant, il existe une méthode simple pour effectuer ce contrôle : UNE CONTRAINTE CHECK.

En voici un exemple :
ALTER TABLE SU.POSTS ADD (
  CONSTRAINT BOOL_POSTISPUBLIC
 CHECK (ispublic=0 OR ispublic=1));

Tout simplement, on rajoute la contraint Check sur la tabel "POSTS" et sur le champs ISPUBLIC pour authoriser uniquement la valeur 0 ou 1.


Bonne journée

vendredi 8 janvier 2010

NHibernate et les Séquences Oracle

Bonjour, voici un nouveau billet concernant l'utilisation de NHibernate avec Oracle et .Net.

Le problème rencontré était l'utilisation d'un identifiant unique pour la création de données dans une table. Comme vous le savez peut etre déja, Oracle n'a pas de type "AUTO-INCREMENT"/"IDENTITE" comme Mysql ou SqlServeur. Pour pallier a cette contrainte il "suffit" de créer une SEQUENCE et d'utiliser cette derniere pour prendre de maniere unique l'identifiant de notre table.

Le but de ce billet n'etant pas d'expliquer les Sequence, je vous laisse la lecture de ce site pour la compréhension : http://www.commentcamarche.net/contents/oracle/oracseq.php3

Revenons a nos mouton : NHibernate est-il capable de gérer nativement les identifiants uniques ? C'est effectivement le cas ! Chouette ! Comment vous allez me dire ? C'est pas très compliqué, il suffit de modifier votre fichier de mapping comme ceci :

lundi 19 octobre 2009

Vider le cache Oracle

Voici quelques lignes de code pour effectuer le vidage du cache d'oracle.

Afin de permettre d'exécuter 2fois des requêtes sans que Oracle ne fasse sa propre gestion de cache du résultat. Faussant ainsi les délais d'exécution des requêtes suivantes.

alter system flush shared_pool;
alter system flush buffer_cache;

Site tres utile pour Oracle : http://www.aide-oracle.net/