sql >> Databáze >  >> RDS >> Oracle

Má Oracle 12 problémy s místními typy kolekcí v SQL?

V dalších experimentech jsme zjistili, že problémy jsou ještě hlubší, než se předpokládalo.

Například různé prvky použité v balíčku buggy_report můžeme získat ORA-03113: end-of-file on communication channel při spuštění skriptu (v otázce). To lze provést změnou typu t_id_table na VARRAY nebo TABLE .. INDEX BY .. . Existuje mnoho způsobů a variant, které nás vedou k různým výjimkám, které jsou mimo téma tohoto příspěvku.

Ještě zajímavá věc je doba kompilace buggy_report specifikace balíčku může trvat až 25 sekund, zatímco normálně to trvá asi 0,05 sekundy. Rozhodně mohu říci, že to závisí na přítomnosti TYPE t_id_table parametr v pipe_table deklarace funkce a „dlouhodobá kompilace“ se děje ve 40 % případů instalace. Zdá se tedy, že problém s local collection types in SQL se latentně objeví během kompilace.

Vidíme tedy, že Oracle 12.1.0.2 má zjevně chybu v realizaci používání lokálních typů kolekcí v SQL.

Minimální příklady k získání ORA-22163 a ORA-03113 sledují. Tam předpokládáme stejný buggy_report balíček jako v otázce.

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


  1. Kdy zavolám bind_param, když používám připravené příkazy MySQLi ve smyčce?

  2. Vzdálené připojení k databázi clearDB heroku

  3. Jak napsat skript pro vložení Oracle s jedním polem jako CLOB?

  4. Volání členské funkce na non-objekt - PHP