Ошибка (ORA-21700) с табличным оператором после обновления до Oracle 12.2 с 12.1 - PullRequest
0 голосов
/ 12 июня 2018

Наша база данных Oracle была недавно обновлена ​​с 12.1.0.2 до 12.2.0.1 + обновление набора обновлений 20180417.

С момента обновления мы получаем следующую ошибку при вызове процедуры plsql: ORA-21700: объект не существует или помечен для удаления

Мы сузили проблему, и она, кажется, вызвана использованием табличного оператора в ассоциативном массиве, определенном в пределахпакет.Все мои исследования показывают, что то, что мы делаем, было введено в 12.1 и должно работать в 12.2.

Ниже приведена упрощенная версия процедуры, которая терпит неудачу вместе с определением связанного типа.Он вызывается из кода c # с использованием управляемого доступа к данным.

Вот определение типа ассоциативного массива в пакете:

TYPE NUMBER_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

Вот процедура, которая завершается ошибкой:

PROCEDURE GetReadingStatus(
  STATUSID_ARR IN NUMBER_ARRAY,
  P_RETURNS OUT SYS_REFCURSOR    
)
BEGIN
  OPEN P_RETURNS FOR
    SELECT * FROM READINGSTATUS rs
    WHERE rs.statusID IN (select * from table(STATUSID_ARR));
END;

Он запускается, если удаляется часть select * from table(STATUSID_ARR).

Есть ли проблема с использованием оператора таблицы в ассоциативных массивах в 12.2?Может ли проблема быть вызвана чем-то другим?

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

этот вопрос очень похож на мою ситуацию, когда я получил ту же ошибку с 12.2, но не с 12.1.Я разместил свой ответ здесь , так как тот использует пакет вместо определенного типа схемы.Может быть, эту проблему можно решить так же.Просто попробуйте добавить временную переменную того же типа и присвоить ей параметр.

0 голосов
/ 14 июня 2018

Все мои исследования показывают, что то, что мы делаем, было введено в 12.1 и должно работать в 12.2.

Да это правда.До Oracle 12c нельзя использовать ассоциированные массивы в области действия операторов SQL в блоке PLSQL.Однако Oracle следит за тем, чтобы при появлении новой версии старая версия не затрагивалась.Я попытался проверить ваш код и он нормально работает на моем конце.Проблема выглядит где-то еще, может быть проблема при использовании C #.См. Ниже демонстрационный пример:

Моя версия Oracle:

SQL> select * from v$version;

BANNER
------     
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Табличные данные:

SQL>SELECT * from TEST;
  col
  ---
   1
   2
   3

Пакет:

--Package Specification
CREATE OR REPLACE PACKAGE TESTTT
AS
TYPE NUMBER_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

Procedure GetReadingStatus (
                          STATUSID_ARR IN NUMBER_ARRAY,
                          P_RETURNS OUT SYS_REFCURSOR    
                        );
END;
/
--Package Body
CREATE OR REPLACE PACKAGE BODY TESTTT
AS
PROCEDURE GetReadingStatus(
                          STATUSID_ARR IN NUMBER_ARRAY,
                          P_RETURNS OUT SYS_REFCURSOR    
                        )
Is                        
BEGIN
  OPEN P_RETURNS FOR
    SELECT * 
    FROM TEST 
    where col IN (SELECT * FROM TABLE(STATUSID_ARR));
END;
END TESTTT;

Вызов:

DECLARE
var  TESTTT.NUMBER_ARRAY;
v_out sys_refcursor;
num  NUMBER;

BEGIN

var(1):= '1';
var(2):= '2';

 TESTTT.GetReadingStatus(STATUSID_ARR=>var,
                         P_RETURNS =>v_out);

 Loop
 fetch v_out INTO num;
 exit WHEN v_out%notfound;
 dbms_output.put_line('Return From Procdure--'||num);
 end loop;

end;

Выход:

Return From Procdure--1
Return From Procdure--2
...