Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle 12 rencontre-t-il des problèmes avec les types de collections locales dans SQL ?

Dans d'autres expériences, nous avons découvert que les problèmes sont encore plus profonds qu'on ne le pensait.

Par exemple, différents éléments utilisés dans le package buggy_report on peut obtenir un ORA-03113: end-of-file on communication channel lors de l'exécution du script (dans la question). Cela peut être fait en changeant le type de t_id_table à VARRAY ou TABLE .. INDEX BY .. . Il existe de nombreuses manières et variations qui nous conduisent à différentes exceptions, qui sont hors sujet pour cet article.

La chose la plus intéressante est que le temps de compilation de buggy_report La spécification de l'emballage peut prendre jusqu'à 25 secondes, alors qu'elle prend normalement environ 0,05 seconde. Je peux certainement dire que cela dépend de la présence de TYPE t_id_table paramètre dans le pipe_table la déclaration de fonction et la "compilation longue durée" se produisent dans 40 % des cas d'installation. Il semble donc que le problème avec les local collection types in SQL apparaissent de manière latente lors de la compilation.

Nous voyons donc qu'Oracle 12.1.0.2 a évidemment un bogue dans la réalisation de l'utilisation des types de collections locales en SQL.

Les exemples minimaux pour obtenir ORA-22163 et ORA-03113 sont les suivantes. Là, nous supposons le même buggy_report paquet comme dans la question.

-- produces 'ORA-03113: end-of-file on communication channel'
DECLARE   
  l_cur buggy_report.t_info_cur;

  FUNCTION get_it RETURN buggy_report.t_info_cur IS BEGIN RETURN buggy_report.get_cursor(); END;    
BEGIN
   l_cur := get_it();

   dbms_output.put_line('');
END;
/

-- produces 'ORA-22163: left hand and right hand side collections are not of same type'
DECLARE  
  l_cur buggy_report.t_info_cur;

  PROCEDURE hello IS BEGIN NULL; END;
BEGIN
  l_cur := buggy_report.get_cursor;

  -- comment `hello` and exception disappears
  hello;

  CLOSE l_cur;
END;
/