Мар 122012
 

При миграции БД с версии 10.2.0.4 на 11.2.0.3 вылез неприятнейший Bug 11074304, связанный с несовместимостью с пакетами, обработанными утилитой WRAP версии 9 с БД релиза 11.2.0.3. Патча для этого бага нет, а ставить старый релиз (в 11.2.0.1 этой проблемы почему-то нет) не хочется.
Решение вроде простое - обработать все пакеты WRAP'ом заново, но есть загвоздка: нет тривиального способа определить, какой версией WRAP'а пакет обработан.
Проведём небольшой эксперимент: обработаем какой-нибудь пакет 9 и 10 WRAP'ом и посмотрим его код, чтобы найти различия.
Итак, результат 9 WRAP:

PACKAGE  "MY_TEST_PKG" wrapped 
0
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
3
9
9200000
1
4
0 
c
..............

Обратим внимание на строку 20: значение 9200000 - весьма похоже на искомую версию WRAP.
При попытке скомпилировать такой пакет на базе версии 11.2.0.3 получим ошибку:

[0:0] PLS-00801: internal error [Unexpected fragile external reference.]

Теперь попробуем 10-ю версию. Картина совсем другая:

PACKAGE MY_TEST_PKG wrapped 
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
9
339a b94
..............

Структура заголовка неплохо описана тут. Нам она ни к чему.

Итак, нам нужно выделить объекты, подлежащие переврапливанию. Искать будем в представлении dba_source по сигнатуре "wrapped \n0\nabcd", где '\n' - это перевод строки (ASCII 10). Версию получим регулярным выражением (первое же вхождение из семи цифр - это и есть версия).
Сконструируем запрос:

SELECT 
	d.owner, 
	d.name, 
	d.TYPE,
	REGEXP_SUBSTR(d.text, '[0-9]{7}', 1, 1, 'm') version
FROM dba_source d
WHERE
	d.line = 1 AND 
	LOWER(SUBSTR(d.text, 1, 128)) 
		LIKE '%wrapped ' ||
			  CHR(10)||
			  '0'    ||
			  CHR(10)||
			    'abcd%'
ORDER BY 1, 2, 3;

Теперь надо переврапить эти пакеты (или попросить вашего разработчика приложений сделать это). Если этого не сделать, по после апгрейда базы на 11.2.0.3 можно получить пару неприятнейших WTF-часов.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)