Bug de la documentation 11gR2 "DBMS_XPLAN.DISPLAY_CURSOR"

Contrairement à ce qui est annoncé dans la documentation, DBMS_XPLAN.DISPLAY_CURSOR n’affiche pas l’ensemble des curseurs dans la shared pool lorsque vous ne précisez que le paramètre sql_id. La section ci-dessous extraite de la documentation est juste fausse:

child_number
Child number of the cursor to display. If not supplied, the execution plan of all cursors matching the supplied sql_id parameter are displayed. The child_number can be specified only if sql_id is specified.

En fait, elle est fausse à 2 titres :

  • d’abord le nom du paramètre n’est pas child_number mais cursor_child_no
  • ensuite la valeur par défaut n’est pas null mais 0

Pour vérifier ces 2 points, exécutez la requête ci-dessous et faite l’extraction de la section qui vous intéresse :

select text
from dba_source
where type='PACKAGE'
and name='DBMS_XPLAN'
order by line;

[...]

-- display from V$SQL_PLAN (or V$SQL_PLAN_STATISTICS_ALL)
function display_cursor(sql_id varchar2 default null,
cursor_child_no integer default 0,
format varchar2 default 'TYPICAL')
return dbms_xplan_type_table
pipelined;

[...]

Pour afficher l’ensemble des curseurs pour une requête en 11.2, tapez donc

select *
from table(dbms_xplan.display_cursor('&sql_id',null));

et non pas

select *
from table(dbms_xplan.display_cursor('&sql_id'));

Remarquez que ça fait plusieurs fois que je rencontre un problème où tous les curseurs ne sont pas affichés avec cette fonction, y compris dans Oracle Enterprise Manager GridControl. En 10.2.0.4, le problème était bien pire… On imagine qu’ils ont corrigé le code mais pas la documentation.