Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler (ORA-21700) mit Tabellenoperator nach Aktualisierung auf Oracle 12.2 von 12.1

Ich bin nach dem Upgrade von Oracle 12c auf 19c auf dasselbe oder ein ähnliches Problem gestoßen. Ich bin mir nicht sicher, warum das Oracle-Upgrade ein Problem verursacht hat, und ich verstehe auch nicht wirklich, warum mein Fix funktioniert!

In meinen gespeicherten Prozeduren, in denen die TABLE-Funktion von Oracle auf einige Eingaben für gespeicherte Prozeduren angewendet wird, erhalte ich den Fehler:"ORA-21700:Objekt existiert nicht oder ist zum Löschen markiert".

Wenn jedoch die TABLE-Funktion von Oracle auf eine lokale Variable innerhalb der gespeicherten Prozedur angewendet wurde, trat kein Fehler auf. Meine Problemumgehung bestand also einfach darin, Eingaben für gespeicherte Prozeduren lokalen Variablen zuzuweisen, bevor die TABLE-Funktion verwendet wurde, und irgendwie löste dies das Problem!

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;