powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-22161: код типа [0] неверен
37 сообщений из 37, показаны все 2 страниц
ORA-22161: код типа [0] неверен
    #39893800
user1048576
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
При запуске блока:

Код: 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
ORA-22161: код типа [0] неверен
    #39893805
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user1048576,

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

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

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

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

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

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

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


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

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

не повезло

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


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

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

спасибо

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

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

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

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

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

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

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

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

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

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

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

Спасибо за неравнодушие и помощь. Все переписал, работает акейна)
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894007
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте:
Код: 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
ORA-22161: код типа [0] неверен
    #39894025
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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

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

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

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

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

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

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

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

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


Проверено на 12.1 :)
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894239
user1048576
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
перед fetch во второй итерации массив очищается автоматически. дополнительно очищать массив не требуется. Прикрутил очистку массива после обработки каждой пачки - все-равно выходит ошибка.
Еще раз это ошибка ядра, а не кривой код. В зависимости от конфы сервера на котором крутится ваш БД, ошибка конкретно у Вас может вылететь при другом количестве записей.
Про фильтровку данных на этапе запроса - не подходит именно в этом случае, т.к. данные сначала используются, и только в конце алгоритма эти данные выборочно удаляются и используются далее.
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894324
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user1048576,
may be
Код: plsql
1.
for ...in ... REVERSE 



?
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894414
user1048576
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
я уж думал, что произошло чудо и обратный цикл заставляет всю конструкцию работать. Но удалось воспроизвести ошибку при увеличении числа записей в выборке до 5291598.
Ошибка ядра - есть ошибка ядра))
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894429
Taureg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user1048576
Здравствуйте!
При запуске блока:

Код: 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 - нет.
В чем тут дело?


а мне одному кажется, что использование
Код: plsql
1.
 va_data.count

перед проверкой состояния rc_data, как минимум, вызывает вопросы?
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894440
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taureg

перед проверкой состояния rc_data, как минимум, вызывает вопросы?


22024745

.....
stax
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894442
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taureg
а мне одному кажется, что использование
Код: plsql
1.
 va_data.count

перед проверкой состояния rc_data, как минимум, вызывает вопросы?
Может и не одному, но вряд ли тех, кто внимательно читает форум и при этом невнимательно читает документацию, значительное количество.
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894444
Taureg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
Taureg

перед проверкой состояния rc_data, как минимум, вызывает вопросы?


22024745

.....
stax


и что? Вот у меня лично железной уверенности, что коллекция заполняется верно, когда ветч не вернул данные нет.

Впрочем, не навязываю. Просто учили с детства мыть руки перед едой и не полагаться на не вполне документированные умолчания
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894450
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taureg

и что? Вот у меня лично железной уверенности, что коллекция заполняется верно, когда ветч не вернул данные нет.

ничего не понял

говорим о if va_data.count > 0 then?

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

.....
stax
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894453
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taureg
учили с детства мыть руки перед едой
Между первым и вторым тоже моешь руки? Или, все-таки, обедаешь в bulk-режиме?
Taureg
не полагаться на не вполне документированные умолчания
Что даст проверка курсора для bulk fetch?
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894458
Taureg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
Taureg

и что? Вот у меня лично железной уверенности, что коллекция заполняется верно, когда ветч не вернул данные нет.

ничего не понял

говорим о if va_data.count > 0 then?


ну если вы уверены, что во всех случаях коллекция заполнится корректно, то ок.
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894484
user1048576
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Taureg,
это все оффтоп
22025532 какие вопросы?
22025552 когда fetch не заносит данные в массив мы просто проходим мимо условия va_data.count > 0
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894514
Taureg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user1048576
Taureg,
это все оффтоп
22025552 когда fetch не заносит данные в массив мы просто проходим мимо условия va_data.count > 0

[/quot]
это если фечт корректно заполнит va_data, а у меня нет 100% уверенности, что сие так всегда и везде.

user1048576
Taureg,
это все оффтоп


таки да
...
Рейтинг: 0 / 0
ORA-22161: код типа [0] неверен
    #39894543
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Taureg
это если фечт корректно заполнит va_data, а у меня нет 100% уверенности, что сие так всегда и везде.
Как убедиться в корректности?
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-22161: код типа [0] неверен
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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