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>