Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Здравствуйте!
При запуске блока:
+

declare
	type TRecData is record(
		n1	number,
		n2	number
	);
	type TTabData is table of TRecData;
	va_data	TTabData;
	rc_data	sys_refcursor;
begin
	open rc_data for
		select	level,
				case
					when mod(level, 20) = 0 then 20
				end
		from	dual c
		connect by level <= 1035
	;
	if rc_data%isopen then
		loop
			fetch rc_data bulk collect into va_data limit 1000;
			if va_data.count > 0 then
				for j in va_data.first .. va_data.last loop
					if va_data(j).n2 is null then
						va_data.delete(j);
					end if;
					--dbms_output.put_line(j);
				end loop;
			end if;
			exit when rc_data%notfound;
		end loop;
		close rc_data;
	end if;
end;


Возникает ошибка "ORA-22161: код типа [0] неверен" в одной БД, или ошибка "ORA-03113: end-of-file on communication channel" в другой. Обе базы версии 12.1
Ошибка возникает только при определенных количествах данных например если считать 1035 записей - ошибка есть, 1034 - нет.
В чем тут дело?
25 ноя 19, 10:53    [22024400]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
-2-
Member

Откуда:
Сообщений: 15330
user1048576,

Даренному ПО в ошибки не смотрят, а недаренному - смотрят в саппорт.
25 ноя 19, 11:07    [22024410]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
user1048576,

если case заменить decode тож слетает?
или явно добавить else?

.....
stax
25 ноя 19, 11:18    [22024421]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Stax,
Тут дело (ошибка) не в данных, возвращаемых выборкой, а в удалении ненужных элементов из массива. Ведь при изменении количества строк в запросе ошибка пропадает.
25 ноя 19, 11:22    [22024427]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
user1048576,

я как варианты предложил,
возможно есть какой-то бажок в сцепке for j in va_data.first .. va_data.last loop и va_data.delete(j);

нет 12-ки, нa других версиях отрабатывает без ора

ps
for заменить while + next

....
stax
25 ноя 19, 11:40    [22024458]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Stax,
Запилил иной цикл, результат такой же - ошибка возникает при одном наборе строк, и отсутствует при другом:
+
declare
	type TRecData is record(
		n1	number,
		n2	number
	);
	type TTabData is table of TRecData;
	va_data	TTabData;
	rc_data	sys_refcursor;
	j number;
begin
	open rc_data for
		select	level,
				case
					when mod(level, 20) = 0 then 20
				end
		from	dual c
		connect by level <= 1035
	;
	if rc_data%isopen then
		loop
			fetch rc_data bulk collect into va_data limit 1000;
			if va_data.count > 0 then
				j := va_data.first;
				while j is not null loop
					if va_data(j).n2 is null then
						va_data.delete(j);
					end if;
					j := va_data.next(j);
				end loop;
				/*
				for j in va_data.first .. va_data.last loop
					if va_data(j).n2 is null then
						va_data.delete(j);
					end if;
				end loop;
				*/
			end if;
			exit when rc_data%notfound;
		end loop;
		close rc_data;
	end if;
end;
25 ноя 19, 12:04    [22024492]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Количество записей при котором выходит ошибка меняется, если массив объявить индексированным, т.е. вместо:
type TTabData is table of TRecData;

Написать
type TTabData is table of TRecData index by pls_integer;
25 ноя 19, 12:08    [22024496]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
-2-
Member

Откуда:
Сообщений: 15330
user1048576,

Что ты ожидаешь от форума? С багами нужно обращаться в поддержку, хотя 12.1 уж больше года как с premier снята.
25 ноя 19, 12:10    [22024497]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
user1048576
Stax,
Запилил иной цикл, результат такой же - ошибка возникает при одном наборе строк, и отсутствует при другом:

не повезло

слетает на первой итерации (лимит), или второй?


зы
идей много, да и у Вас я думаю также
кто-то б подтвердил что 12.1 тож слетает

.....
stax
25 ноя 19, 12:32    [22024523]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Oleg M.Ivanov
Member

Откуда: Москва
Сообщений: 1164
Stax,

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

ORA-22161: type code [0] is not valid
ORA-06512: at line 26

А вот в в этой версии "Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production" нет ошибки.

Сообщение было отредактировано: 25 ноя 19, 12:50
25 ноя 19, 12:45    [22024536]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Stax,
Админы БД сообщили, что удаление элементов массива вызывает ошибку ядра (...Address not mapped to object...)
На сайте поддержки нет никаких статей по данной ошибке ядра. Если подкрутите цифры в запросе, то скорее всего вы получите ошибку.
Решено переписать код, отказавшись от удаления элементов массива.
25 ноя 19, 12:53    [22024542]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Oleg M.Ivanov,

спасибо

не ясно из-за чего слетает (лимит или фор)

зы
попробовать fetch rc_data into va_data2 ... rc_data:=rc_data2;

....
stax
25 ноя 19, 12:56    [22024547]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Stax,
Ошибка выходит на второй "неполной" пачке. Причем можно вытащить много строк, но ошибка будет возникать только в последней неполной (до limit) пачке. Причем эта неполная пачка должна содержать определенное количество строк для разных БД.
И еще кое-что: если выборку ограничить так, чтобы сразу первая же пачка была бы неполной, то ошибка не выходит.
Уот так уот!
25 ноя 19, 12:59    [22024551]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
user1048576

Решено переписать код, отказавшись от удаления элементов массива.

молодцы админы
удаление часть логики

переприсвоение rc_data:=rc_data2; не помогает? слетает в цикле удаления?

....
stax
25 ноя 19, 13:00    [22024554]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Stax,
Админы молодцы без сарказма. Был вариант завести "Service Request", но на это уйдет время (возможно много времени). Поэтому я сам решил переложить данные из одного массива в другой по тому же условию, по которому я удалял данные.
Ошибка выходит именно при удалении элемента в цикле, а не в выборке и считывании данных в массив.
Не совсем понял про переприсвоение rc_data:=rc_data2: rc_data2 - это аналогичный rc_data курсор?
25 ноя 19, 13:06    [22024560]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
user1048576
Stax,
Ошибка выходит именно при удалении элемента в цикле

может выстрелить в любом месте, надо патчится (SR тож не помешает)

зи
невнимательно набрал вместо rc надо va
но раз слетает в цикле (странно что и while) то нет смысла
зыы
даж интересно стало, как "переложить данные из одного массива в другой" имитируя дырку от delete (шоб в копии возникал no data found)

....
stax
25 ноя 19, 13:36    [22024612]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
Stax,
может выстрелить в любом месте, надо патчится - патчей нет))

зи
невнимательно набрал вместо rc надо va - это и есть "переложить данные из одного массива в другой" (дырки мне не нужны, нужны только данные, которые останутся после удаления ненужных)
но раз слетает в цикле (странно что и while) то нет смысла - слетает только при удалении.
зыы
даж интересно стало, как "переложить данные из одного массива в другой" имитируя дырку от delete (шоб в копии возникал no data found) - "дырки" в конкретно моем случае не нужны

Спасибо за неравнодушие и помощь. Все переписал, работает акейна)

Сообщение было отредактировано: 25 ноя 19, 14:22
25 ноя 19, 14:17    [22024657]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
Попробуйте:
declare
  type TRecData is record(
    n1  number,
    n2  number
  );
  type TTabData is table of TRecData;
  va_data TTabData;
  rc_data sys_refcursor;
  j number;
begin
  open rc_data for
    select  level,
        case
          when mod(level, 20) = 0 then 20
        end
    from  dual c
    connect by level <= 1035
  ;
  -- Курсор либо открыт, либо улетим в exception, проверять %isopen в данном случае необходимости нет
  loop 
    fetch rc_data bulk collect into va_data limit 1000;
      -- Данный цикл не будет выполнен на пустом массиве, доп. проверка не требуется
      for j in 1 .. va_data.count loop
        -- Делаем наши грязные делишки
        if va_data(j).n2 is null then
          va_data.delete(j);
        end if;
      end loop;
    -- Условие выхода из bulk-цикла я предпочитаю делать так:
    exit when va_data.count < 1000;
  end loop;
  close rc_data;
end;


а вообще проще фильтровать ненужные значения еще в запросе
25 ноя 19, 15:21    [22024745]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
andrey_anonymous,

он удаляет із массива

імхо
va_data.count станет меньше 1000 (50)

.....
stax

Сообщение было отредактировано: 25 ноя 19, 15:39
25 ноя 19, 15:37    [22024769]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
Stax
andrey_anonymous,

он удаляет із массива

імхо
va_data.count станет меньше 1000 (50)

Главное - оно не наступает на багу 12.1, с остальным можно работать :)
25 ноя 19, 15:45    [22024782]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
andrey_anonymous

Главное - оно не наступает на багу 12.1, с остальным можно работать :)

не понял совсем

1) бага ж не из-за exit when rc_data%notfound;
2) из-за exit when va_data.count < 1000; (va_data.count=50) не будет второй итерации (1001-1035)

зы
я так понял слетает va_data.delete(j);

.....
stax

Сообщение было отредактировано: 25 ноя 19, 15:58
25 ноя 19, 15:57    [22024800]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
Stax

я так понял слетает va_data.delete(j);

Был невнимателен, сорри.
Проблема решается зачисткой "дырявого" массива
перед выходом в новую итерацию bulk collect:
  loop 
    fetch rc_data bulk collect into va_data limit 1000;
      -- Данный цикл не будет выполнен на пустом массиве, доп. проверка не требуется
      l_size := va_data.count;
      for j in 1 .. va_data.count loop
        -- Делаем наши грязные делишки
        if va_data(j).n2 is null then
          va_data.delete(j);
        end if;
      end loop;
      va_data.delete;
    -- Условие выхода из bulk-цикла я предпочитаю делать так:
    exit when l_size < 1000;
  end loop;
25 ноя 19, 16:40    [22024845]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
andrey_anonymous,

сначала (22024523) было ощущение что слетает на втором fetch limit 1000; но вроде ето не так

я так понял что слетает va_data.delete(j); и до va_data.delete; не дойдет

.....
stax
25 ноя 19, 16:50    [22024856]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
Stax
ощущение
...
я так понял что слетает va_data.delete(j); и до va_data.delete; не дойдет


Проверено на 12.1 :)
25 ноя 19, 16:55    [22024860]     Ответить | Цитировать Сообщить модератору
 Re: ORA-22161: код типа [0] неверен  [new]
user1048576
Member

Откуда: Санкт-Петерсбург, Кордай
Сообщений: 12
andrey_anonymous,
перед fetch во второй итерации массив очищается автоматически. дополнительно очищать массив не требуется. Прикрутил очистку массива после обработки каждой пачки - все-равно выходит ошибка.
Еще раз это ошибка ядра, а не кривой код. В зависимости от конфы сервера на котором крутится ваш БД, ошибка конкретно у Вас может вылететь при другом количестве записей.
Про фильтровку данных на этапе запроса - не подходит именно в этом случае, т.к. данные сначала используются, и только в конце алгоритма эти данные выборочно удаляются и используются далее.
26 ноя 19, 06:08    [22025160]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить