Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-22161: код типа [0] неверен / 25 сообщений из 37, страница 1 из 2
25.11.2019, 10:53
    #39893800
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Здравствуйте!
При запуске блока:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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 - нет.
В чем тут дело?
...
Рейтинг: 0 / 0
25.11.2019, 11:07
    #39893805
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
user1048576,

Даренному ПО в ошибки не смотрят, а недаренному - смотрят в саппорт.
...
Рейтинг: 0 / 0
25.11.2019, 11:18
    #39893809
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
user1048576,

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

.....
stax
...
Рейтинг: 0 / 0
25.11.2019, 11:22
    #39893813
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax,
Тут дело (ошибка) не в данных, возвращаемых выборкой, а в удалении ненужных элементов из массива. Ведь при изменении количества строк в запросе ошибка пропадает.
...
Рейтинг: 0 / 0
25.11.2019, 11:40
    #39893830
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
user1048576,

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

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

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

....
stax
...
Рейтинг: 0 / 0
25.11.2019, 12:04
    #39893850
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax,
Запилил иной цикл, результат такой же - ошибка возникает при одном наборе строк, и отсутствует при другом:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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;

...
Рейтинг: 0 / 0
25.11.2019, 12:08
    #39893853
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Количество записей при котором выходит ошибка меняется, если массив объявить индексированным, т.е. вместо:
Код: plsql
1.
type TTabData is table of TRecData;


Написать
Код: plsql
1.
type TTabData is table of TRecData index by pls_integer;
...
Рейтинг: 0 / 0
25.11.2019, 12:10
    #39893854
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
user1048576,

Что ты ожидаешь от форума? С багами нужно обращаться в поддержку, хотя 12.1 уж больше года как с premier снята.
...
Рейтинг: 0 / 0
25.11.2019, 12:32
    #39893870
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
user1048576
Stax,
Запилил иной цикл, результат такой же - ошибка возникает при одном наборе строк, и отсутствует при другом:

не повезло

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


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

.....
stax
...
Рейтинг: 0 / 0
25.11.2019, 12:45
    #39893879
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
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" нет ошибки.
...
Рейтинг: 0 / 0
25.11.2019, 12:53
    #39893883
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax,
Админы БД сообщили, что удаление элементов массива вызывает ошибку ядра (...Address not mapped to object...)
На сайте поддержки нет никаких статей по данной ошибке ядра. Если подкрутите цифры в запросе, то скорее всего вы получите ошибку.
Решено переписать код, отказавшись от удаления элементов массива.
...
Рейтинг: 0 / 0
25.11.2019, 12:56
    #39893888
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Oleg M.Ivanov,

спасибо

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

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

....
stax
...
Рейтинг: 0 / 0
25.11.2019, 12:59
    #39893890
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax,
Ошибка выходит на второй "неполной" пачке. Причем можно вытащить много строк, но ошибка будет возникать только в последней неполной (до limit) пачке. Причем эта неполная пачка должна содержать определенное количество строк для разных БД.
И еще кое-что: если выборку ограничить так, чтобы сразу первая же пачка была бы неполной, то ошибка не выходит.
Уот так уот!
...
Рейтинг: 0 / 0
25.11.2019, 13:00
    #39893893
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
user1048576

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

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

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

....
stax
...
Рейтинг: 0 / 0
25.11.2019, 13:06
    #39893899
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax,
Админы молодцы без сарказма. Был вариант завести "Service Request", но на это уйдет время (возможно много времени). Поэтому я сам решил переложить данные из одного массива в другой по тому же условию, по которому я удалял данные.
Ошибка выходит именно при удалении элемента в цикле, а не в выборке и считывании данных в массив.
Не совсем понял про переприсвоение rc_data:=rc_data2: rc_data2 - это аналогичный rc_data курсор?
...
Рейтинг: 0 / 0
25.11.2019, 13:36
    #39893924
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
user1048576
Stax,
Ошибка выходит именно при удалении элемента в цикле

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

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

....
stax
...
Рейтинг: 0 / 0
25.11.2019, 14:17
    #39893948
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax,
может выстрелить в любом месте, надо патчится - патчей нет))

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

Спасибо за неравнодушие и помощь. Все переписал, работает акейна)
...
Рейтинг: 0 / 0
25.11.2019, 15:21
    #39894007
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Попробуйте:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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;



а вообще проще фильтровать ненужные значения еще в запросе
...
Рейтинг: 0 / 0
25.11.2019, 15:37
    #39894025
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
andrey_anonymous,

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

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

.....
stax
...
Рейтинг: 0 / 0
25.11.2019, 15:45
    #39894035
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax
andrey_anonymous,

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

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

Главное - оно не наступает на багу 12.1, с остальным можно работать :)
...
Рейтинг: 0 / 0
25.11.2019, 15:57
    #39894051
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
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
...
Рейтинг: 0 / 0
25.11.2019, 16:40
    #39894079
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax

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

Был невнимателен, сорри.
Проблема решается зачисткой "дырявого" массива
перед выходом в новую итерацию bulk collect:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  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;
...
Рейтинг: 0 / 0
25.11.2019, 16:50
    #39894088
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
andrey_anonymous,

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

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

.....
stax
...
Рейтинг: 0 / 0
25.11.2019, 16:55
    #39894091
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
Stax
ощущение
...
я так понял что слетает va_data.delete(j); и до va_data.delete; не дойдет


Проверено на 12.1 :)
...
Рейтинг: 0 / 0
26.11.2019, 06:08
    #39894239
user1048576
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-22161: код типа [0] неверен
andrey_anonymous,
перед fetch во второй итерации массив очищается автоматически. дополнительно очищать массив не требуется. Прикрутил очистку массива после обработки каждой пачки - все-равно выходит ошибка.
Еще раз это ошибка ядра, а не кривой код. В зависимости от конфы сервера на котором крутится ваш БД, ошибка конкретно у Вас может вылететь при другом количестве записей.
Про фильтровку данных на этапе запроса - не подходит именно в этом случае, т.к. данные сначала используются, и только в конце алгоритма эти данные выборочно удаляются и используются далее.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-22161: код типа [0] неверен / 25 сообщений из 37, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]