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>