Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle 12 ha problemi con i tipi di raccolta locali in SQL?

In ulteriori esperimenti abbiamo scoperto che i problemi sono ancora più profondi di quanto si pensasse.

Ad esempio, elementi variabili utilizzati nel pacchetto buggy_report possiamo ottenere un ORA-03113: end-of-file on communication channel durante l'esecuzione dello script (nella domanda). Può essere fatto cambiando il tipo di t_id_table a VARRAY o TABLE .. INDEX BY .. . Ci sono molti modi e varianti che ci portano a diverse eccezioni, che sono fuori tema per questo post.

L'unica cosa interessante è il tempo di compilazione di buggy_report le specifiche del pacchetto possono richiedere fino a 25 secondi, quando normalmente ci vogliono circa 0,05 secondi. Posso sicuramente dire che dipende dalla presenza di TYPE t_id_table parametro nella pipe_table dichiarazione di funzione e "compilazione a lungo termine" si verificano nel 40% dei casi di installazione. Quindi sembra che il problema con local collection types in SQL appaiono latenti durante la compilazione.

Quindi vediamo che Oracle 12.1.0.2 ha ovviamente un bug nella realizzazione dell'utilizzo di tipi di raccolta locali in SQL.

Gli esempi minimi per ottenere ORA-22163 e ORA-03113 stanno seguendo. Lì assumiamo lo stesso buggy_report pacchetto come nella domanda.

-- 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;
/