lundi 25 novembre 2013

ALTER TABLESPACE ... RENAME TO

On peut changer le nom d’un tablespace depuis Oracle 10. Dans l’exemple suivant, que j’ai testé sur Oracle 11, je commence avec un tablespace qui s’appelle USERS et je le renomme à NEW_USERS:
 
SQL> select tablespace_name from dba_tablespaces
  2  where tablespace_name like '%USERS%'
  3  /
 
TABLESPACE_NAME
------------------------------
USERS
 
SQL> alter tablespace users
  2  rename to new_users
  3  /
 
Tablespace modifie.
 
SQL> select tablespace_name from dba_tablespaces
  2  where tablespace_name like '%USERS%'
  3  /
 
TABLESPACE_NAME
------------------------------
NEW_USERS
 
SQL>

dimanche 16 juin 2013

ORA-01452

Si on essaie d'ajouter un indice unique sur une colonne qui contient des doublons, Oracle répond avec une erreur ORA-01452. J'ai testé cette erreur sur Oracle version 11.2.0.2.7. D'abord j'ai créé une table avec les noms des propriétaires de tous les objets dans la vue DBA_OBJECTS. La plupart de ces propriétaires possède plus qu'un objet. Il y a donc plusieurs doublons dans la table. Ensuite j'ai essayé de créer un indice unique sur la table mais la commande a echoué: 

SQL> alter session set nls_language = 'FRENCH'
  2  /
 
Session modifiee.
 
SQL> create table owners1
  2  as select owner
  3  from dba_objects
  4  /
 
Table creee.
 
SQL> create unique index owners1_idx
  2  on owners1 (owner)
  3  /
on owners1 (owner)
   *
ERREUR a la ligne 2 :
ORA-01452: CREATE UNIQUE INDEX impossible ; il existe
des doublons

SQL>

J'ai répété le processus, en ajoutant le mot DISTINCT quand je créais la table. Par conséquent il n'y avait pas de doublons dans la table et j'ai pu créer mon indice unique sans problèmes: 

SQL> create table owners2
  2  as select distinct owner
  3  from dba_objects
  4  /
 
Table creee.
 
SQL> create unique index owners2_idx
  2  on owners2 (owner)
  3  /
 
Index cree.
 
SQL>

samedi 8 juin 2013

TNS-12599

Avez-vous une base de données sur Oracle 11.1 ou 11.2? Voyez-vous beaucoup d'erreurs comme celle-ci? Elles pourraient être produites par le bug 9844654. Ce bug pose des problèmes aux bases qu'on surveille avec Enterprise Manager. Selon ce que j'ai lu, ce bug n'est pas important mais s'il vous embête, des patchs et une solution provisoire (workaround) sont disponibles: 

Sun Jul 22 02:00:08 2012
***********************************************************************
NI cryptographic checksum mismatch error: 12599.
  VERSION INFORMATION:
     TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
     Oracle Bequeath NT Protocol Adapter for 64-bit Windows: Version 11.2.0.1.0 - Production
     Windows NT TCP/IP NT Protocol Adapter for 64-bit Windows: Version 11.2.0.1.0 - Production
  Time: 22-JUL-2012 02:00:08
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12599
   
TNS-12599: TNS:cryptographic checksum mismatch
    ns secondary err code: 2526
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0

dimanche 26 mai 2013

La Compilation Automatique d’une Procédure

J’ai testé cet exemple sur Oracle 11.2.

SQL> alter session set nls_language = 'FRENCH'
  2  /

Session modifiee.

SQL>

J’ai crée une table qui pourrait être utilisée par une procédure et j’ai inséré un salarié dans la table:

SQL> create table salarie
  2  (nom     varchar2(6),
  3   salaire number)
  4  /

Table creee.

SQL> insert into salarie values ('Andrew',1000)
  2  /

1 ligne creee.

SQL> select * from salarie
  2  /

NOM       SALAIRE
------ ----------
Andrew       1000

SQL>


J’ai créé une procédure pour augmenter les salaires dans la table:

SQL> create or replace procedure augmenter
  2  (mon_nom in varchar2, augmentation number) as
  3  begin
  4   update salarie
  5    set salaire = salaire + augmentation
  6    where nom = mon_nom;
  7  end;
  8  /

Procedure creee.

SQL>

La procédure avait été compilée car elle était déjà valide:

SQL> select status from user_objects
  2  where object_name = 'AUGMENTER'
  3  /

STATUS
-------
VALID

SQL>

J’ai modifié la structure de la table et après la procédure n’était plus valide:

SQL> alter table salarie modify
  2  (nom varchar2(7))
  3  /

Table modifiee.

SQL> select status from user_objects
  2  where object_name = 'AUGMENTER'
  3  /

STATUS
-------
INVALID

SQL> 


J’ai compilé la procédure moi-même:

SQL> alter procedure augmenter compile
  2  /

Procedure modifiee.

SQL> select status from user_objects
  2  where object_name = 'AUGMENTER'
  3  /

STATUS
-------
VALID

SQL> 


J’ai modifié la structure de la table pour la deuxième fois et après la procédure n’était plus valide:

 SQL> alter table salarie modify
  2  (nom varchar2(8))
  3  /

Table modifiee.

SQL> select status from user_objects
  2  where object_name = 'AUGMENTER'
  3  /

STATUS
-------
INVALID

SQL>

J’ai lancé la procédure sans la compiler. Oracle l’a compilée automatiquement car elle était valide après:


SQL> exec augmenter('Andrew',100);

Procedure PL/SQL terminee avec succes.

SQL> select status from user_objects
  2  where object_name = 'AUGMENTER'
  3  /

STATUS
-------
VALID

SQL>

J’ai vérifié la nouvelle valeur du salaire:

SQL> select * from salarie
  2  /

NOM         SALAIRE
-------- ----------
Andrew         1100

SQL>

samedi 25 mai 2013

ORA-02382

J'ai testé cet exemple sur Oracle 11.2. Je voulais savoir si on pourrait supprimer un profil si un utilisateur s’en servait toujours. D’abord j’ai créé un profil:

SQL> alter session set nls_language = 'FRENCH'
  2  /
 
Session altered.
 
SQL> create profile andrews_profile
  2  limit failed_login_attempts 3
  3  /

Profile created.

SQL>


Ensuite je l’ai assigné à un utilisateur:

SQL> create user andrew identified by reid
  2  profile andrews_profile
  3  /

User created.

SQL> select profile from dba_users
  2  where username = 'ANDREW'
  3  /

PROFILE
------------------------------
ANDREWS_PROFILE

SQL>

J’ai essayé de supprimer le profil mais je n’ai pas réussi car quelqu’un s’en servait toujours:

SQL> drop profile andrews_profile
  2  /
drop profile andrews_profile
*
ERROR at line 1:
ORA-02382: Le profil ANDREWS_PROFILE a des
utilisateurs, impossible d'effectuer la suppression
sans CASCADE

SQL>

J’ai relancé la commande en ajoutant CASCADE à la fin:

SQL> drop profile andrews_profile cascade
  2  /

Profile dropped.

SQL>

Le profil a été supprimé. Oracle a assigné le profil DEFAULT à l’utilisateur ANDREW:


SQL> select profile from dba_users
  2  where username = 'ANDREW'
  3  /

PROFILE
------------------------------
DEFAULT

SQL>

vendredi 24 mai 2013

Nan

J'ai testé cet exemple sur Oracle 10.

SQL> alter session set nls_language = 'FRENCH'
  2  /

Session modifiee.

SQL>


Voici un numéro en virgule flottante:

SQL> select -1d from dual
  2  /

       -1D
----------
 -1.0E+000

SQL>

La racine carrée de -1 n’est pas un vrai numéro, c’est un numéro complexe. Qu’est-ce qui se passe si on essaie de la calculer en Oracle? 

SQL> select sqrt(-1d) from dual
  2  /

 SQRT(-1D)
----------
       Nan

SQL>

La réponse était Nan. C’est un acronyme pour Not a number. C’est à dire Pas un numéro. Si on veut, on peut remplacer un Nan par un autre numéro de la manière suivante:

SQL> select nanvl(sqrt(-1d),0) from dual
  2  /

NANVL(SQRT(-1D),0)
------------------
                 0

SQL>

On peut aussi remplacer un Nan par un nul:

SQL> select nanvl(sqrt(-1d),null) from dual
  2  /

NANVL(SQRT(-1D),NULL)
---------------------


SQL>

Finalement, on peut tester une valeur pour verifier si elle soit un Nan:


SQL> select 'sqrt(-1) est un numéro complexe' from dual
  2  where sqrt(-1d) is nan
  3  /

'SQRT(-1)ESTUNNOMBRECOMPLEXE'
-------------------------------
sqrt(-1) est un numéro complexe

SQL> select 'sqrt(1) est un vrai numéro' from dual
  2  where sqrt(1d) is not nan
  3  /

'SQRT(1)ESTUNVRAINOMBRE'
--------------------------
sqrt(1) est un vrai numéro

SQL>