Compilation PL/SQL, paramètres OUT et affectations

Vous pouvez utiliser un paramêtre OUT comme source d’affectation, y compris si la valeur n’a pas été initialisée. Dans ce cas, sa valeur sera considérée comme NULL. Le tableau « PL/SQL Subprogram Parameter Modes » de la documentation explicite ce cas un peu particulier. On peut facilement l’illuster à l’aide du cas extrême de la procédure ci-dessous qui ne fait rien semble-t-il puisque sa seule ligne de code est null; mais qui,
en réalité, implicitement remet à NULL la variable passée en paramètre :

create or replace procedure TEST(x OUT varchar2) is

begin
null;
end;
/

set serveroutput on
declare
str varchar2(10);
begin
str:='HelloWorld';
test(str);
dbms_output.put_line('Affiche: '||str);
end;
/

Affiche:

Evidemment Oracle recommande d’affecter les valeurs de paramètres dès l’initialisation de votre procédure pour améliorer la lisibilité du code. Cela étant, rien ne vous y oblige et le compilateur n’est pas très collaboratif pour détecter que certaines variables ne sont jamais affectées comme vous pouvez le voir ci-dessous :

exec dbms_warning.set_warning_setting_string ('ENABLE:ALL', 'SESSION');


alter procedure test compile;
SP2-0805: Procedure altered with compilation warnings

show err
LINE/COL ERROR
-------- -------------------------------------------------------------------------------
1/1 PLW-05018: unit TEST omitted optional AUTHID clause; default value DEFINER used
1/16 PLW-07203: parameter 'X' may benefit from use of the NOCOPY compiler hint

De sorte que les variations sur ce thème pour rendre illisible le fonctionnement d’un code sont particulièrement nombreuses. J’aime beaucoup celle-ci en particulier ; cachez-la dans une forêt de lignes inutiles :

declare

str varchar2(10) not null:='Helloworld';
begin
test(str);
dbms_output.put_line('Affiche: '||str);
end;
/

declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 4

Facile à comprendre quand on sait pourquoi, qu’en pensez-vous ? Bref, pour éviter quelques déconvenues :

  • Ne passez pas de variables initialisées dans un paramètre OUT d’une fonction
  • Si la solution précédente n’est pas possible, c’est que votre paramètre est probablement « IN OUT »
  • Sinon, pensez plutôt à utiliser des variables tampons