sql >> Base de Datos >  >> RDS >> Oracle

Error (ORA-21700) con Table Operator después de actualizar a Oracle 12.2 desde 12.1

Encontré el mismo problema o uno similar después de actualizar de Oracle 12c a 19c. No estoy seguro de por qué la actualización de Oracle causó un problema, ¡y tampoco entiendo por qué funciona mi solución!

En mis procedimientos almacenados, donde la función TABLE de Oracle se aplica a alguna entrada de procedimiento almacenado, aparece el error:"ORA-21700:el objeto no existe o está marcado para eliminar".

Sin embargo, cuando la función TABLE de Oracle se aplicó a una variable local dentro del procedimiento almacenado, no hubo ningún error. Entonces, mi solución fue simplemente asignar entradas de procedimientos almacenados a variables locales, antes de usar la función TABLE, ¡y de alguna manera esto resolvió el problema!

CREATE OR REPLACE PACKAGE my_types IS
  TYPE integers IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  TYPE reals    IS TABLE OF FLOAT INDEX BY BINARY_INTEGER;
END my_types;
/

CREATE OR REPLACE PROCEDURE order_list
(
  i_order_numbers  IN  my_types.integers,
  o_order_numbers  OUT my_types.integers,
  o_order_values   OUT my_types.reals
)
IS

  r_order_numbers  my_types.integers;

  CURSOR order_list_cur (p_order_numbers my_types.integers)
      IS
  SELECT order_number, order_value
    FROM orders
   WHERE order_number IN (SELECT * FROM TABLE(p_order_numbers))
  ;
  order_list_rec  order_list_cur%ROWTYPE;

  rec_no BINARY_INTEGER;

BEGIN

  r_order_numbers := i_order_numbers;

  rec_no := 0;

  OPEN order_list_cur(r_order_numbers);
  LOOP
    FETCH order_list_cur INTO order_list_rec;
    EXIT WHEN order_list_cur%NOTFOUND;
      rec_no := rec_no + 1;
       o_order_numbers(rec_no) := order_list_rec.order_number;
       o_order_values(rec_no) := order_list_rec.order_value;
  END LOOP;
  CLOSE order_list_cur;

END order_list;