jeudi 27 septembre 2012

Rechercher et supprimer des doublons dans une table.

Voici une requête qui me semble intéressante pour rechercher et supprimer des doublons en faisant la recherche avec le ROWID.

Avant ça, on va visualiser la table:

Donc, on voit que le nom et le prénom Kevin Feeney est en doublon. Pour rechercher la ligne en trop, exécuter cette requête:










Voici le code:
select * from employees a where a.rowid > ANY
(select b.rowid from employees b where a.first_name=b.first_name
 and a.last_name=b.last_name);


Pour supprimer le doublon, exécuter cette requête:
delete from employees a where a.rowid > ANY
(select b.rowid from employees b where a.first_name=b.first_name
 and a.last_name=b.last_name);


Si on fait un SELECT * FROM EMPLOYEES, le doublon ne sera pas affiché.

Renseigner une séquence à partir d'un trigger.

Voici les étapes pour renseigner une séquence à partir d'un trigger BD.
  • Créer une séquence.

CREATE SEQUENCE SEQ_EMPL
START WITH 1
INCREMENT BY 1
MAXVALUE 999;

  • Créer le trigger approprié à la séquence (avant l'insertion dans la table EMPLOYEES).














CREATE OR REPLACE TRIGGER TR_EMPL_ID
BEFORE INSERT ON EMPLOYEES
FOR EACH ROW

BEGIN
    SELECT SEQ_EMPL.NEXTVAL
    INTO :NEW.EMPLOYEE_ID FROM DUAL;
 END;

mercredi 26 septembre 2012

Visualiser les index posés sur une table.

Au fur et à mesure qu'on crée des clés (PK pour Primary Key, FK pour Foreign Key, etc..), autant d'index seront crées automatiquement. Pour savoir quels sont tous les index posés sur une table, exécuter cette requête (dans notre exemple, on a pris la table EMPLOYEES du schéma HR fourni par Oracle):

select index_name "Index" , lower(column_name) as "Colonne(s)"
from user_ind_columns
where table_name=upper('employees')
order by index_name,column_position
;

Voici les résultats sur l'écran:


lundi 24 septembre 2012

Connaitre les sessions actives.

Parfois, pour une raison quelconque, on ne sait pas si quelle session est bloquée et quel est l'utilisateur qui a bloqué (généralement ce genre de problème est dû à un verrouillage de l'enregistrement, par exemple une personne veut faire un UPDATE et une autre personne veut faire un DELETE sur le même enregistrement). Pour savoir quelles sont les informations de la session, exécuter cette requête (connecter avec un user sys as sysdba):

select a.USERNAME, a.OSUSER, a.PROGRAM, a.LOGON_TIME, a.MACHINE, a.MODULE, B.LOCK_ID1, a.SID, a.SERIAL#, 'BLOCKEUR'
  from v$session a, dba_waiters b
 where a.sid = b.holding_session
   and a.status <> 'KILLED'
union
select a.USERNAME, a.OSUSER, a.PROGRAM, a.LOGON_TIME, a.MACHINE, a.MODULE, B.LOCK_ID1, a.SID, a.SERIAL#, 'BLOCKER'
  from v$session a, dba_waiters b
 where a.sid = b.waiting_session
   and a.status <> 'KILLED'
union
select USERNAME, OSUSER, PROGRAM, LOGON_TIME, MACHINE, MODULE, TO_NUMBER(NULL), SID, SERIAL#, 'SESSION'
  from v$session
 where username is not null
   and status <> 'KILLED';


Si on veut KILLER une session bloquée, il suffit d'exécuter la requête suivante (dans notre exemple, le SID 145, serial 71).

ALTER SYSTEM KILL SESSION '145,71';
On peut faire également: SELECT * FROM DBA_BLOCKERS pour savoir quel est le ID de la session qui est bloqué ?.