Перекомпиляция пакета после изменения nls_length_semantics - PullRequest
2 голосов
/ 03 августа 2010

У меня есть база данных, в которой значение nls_length_semantics было изменено с байта на символ. Необходимо ли перекомпилировать все пакеты, которые имеют внешние доступные типы данных на основе varchar2 (например, dbms_sql)?

Ответы [ 2 ]

1 голос
/ 14 октября 2014

@ GWu неправильно по моему мнению. По крайней мере, он не прав по духу. Это не вопрос ХОЧУ, это вопрос НЕОБХОДИМОСТИ. Однако он также прав в том смысле, что говорит: это зависит .

Вам НЕОБХОДИМО перекомпилировать ваши пакеты, если базовые данные в базе данных являются многобайтовыми.

У меня были проблемы сегодня, когда пакеты были скомпилированы в формате BYTE, хотя основные данные в моих таблицах находятся в Unicode. Таблицы были явно определены как (например) VARCHAR2 (20 CHAR), в то время как код в моих пакетах PL / SQL был определен только как VARCHAR2 (20).

Это означает, что столбец в базе данных, определенной с длиной 50, не всегда вписывается в переменную PL / SQL, определенную как длина 50. Мои пользователи сообщают о множестве ошибок типа «символьный буфер слишком мал», так как результат.

Перекомпиляция пакетов требуется, если у вас тот же случай, что и у меня.

Однако, что я действительно хотел бы знать, так это как узнать, был ли пакет скомпилирован в формате BYTE. Таким образом, я бы точно знал, какой из моих пакетов нужно перекомпилировать. Не зная об этом, у меня нет способа проактивно пойти туда, чтобы перекомпилировать их. Мне просто нужно подождать, пока пользователь сообщит о проблеме.

Полагаю, я, конечно, мог бы перекомпилировать их все, но это заблокировало бы мою базу данных, пока пользователи все еще в ней. Поэтому я должен снова запланировать некоторое время простоя, чтобы решить всю проблему: - (

- EDIT -

Должен прочитать комментарий от @AlexPoole перед публикацией. Представление dba_plsql_object_settings дает необходимую информацию!

0 голосов
/ 06 июля 2012

Краткий ответ: зависит: -)

Если вы хотите, чтобы ваши существующие пакеты использовали семантику char, вам нужно перекомпилировать. В противном случае они останутся с настройками, которые они имели во время компиляции. С технической точки зрения нет необходимости перекомпилировать.

И определенно нет необходимости перекомпилировать пакеты, принадлежащие SYS (например, dbms_sql).

...