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>

Aucun commentaire:

Enregistrer un commentaire