En 12c, on peut mettre une fonction PL/SQL dans la clause WITH d’une requête SQL.
Par exemple:
function to_number_or_null(n varchar2)
return number deterministic
is
begin
return to_number(n);
exception
when others then return null;
end;
select * from v$parameter where name='db_block_size' and to_number_or_null(value)=8192;
/
Ici j’ai déclaré une fonction vite fait qui m’évite de récupérer un ‘ORA-01722: invalid number’ lorsque la valeur n’est pas un nombre.
On s’aperçoit que l’exécution est beaucoup plus rapide lorsqu’il y a beaucoup d’appels. (cf. demo). C’est plus rapide que d’appeler une fonction stockée – sauf pour une fonction deterministic qui bénéficie du cache.
A noter: le temps d’exécution n’est pas comptabilisé dans ‘PL/SQL execution elapsed time’ du Time Model
Attention: certains clients (comme sqlplus 11g) posent des problèmes à cause des points-virgules dans la requête.
A noter que l’on peut avoir la même performance d’exécution tout en gardant le code pl/sql dans une fonction stockée, en utilisant le pragma UDF