как увеличить длину столбца, не делая зависимые типы недействительными в oracle - PullRequest
0 голосов
/ 08 мая 2020

Мне нужно увеличить длину столбца в таблице oracle. Но есть тип, определенный в той же таблице внутри спецификации пакета. Этот пакет используется более чем в 1000 пакетах.

Поэтому, когда я изменяю столбец, все пакеты становятся недействительными.

Есть ли способ увеличить длину столбца, не делая зависимый тип недействительным .

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вы можете проверить переопределение онлайн-таблицы , и в этом случае только зависимые объекты затронутого столбца станут недействительными. Например, если изменяемый столбец не зависит от типа в той же таблице, объявленной в пакетах, эти пакеты останутся действительными. Даже для обычной команды alter это условие применяется, но онлайн-переопределение позволяет использовать промежуточную таблицу для поддержки операций dml во время изменения

В любом случае, поскольку это производственная система, я предлагаю протестировать эту функцию в UAT, а затем отработать ее в производственной среде

1 голос
/ 08 мая 2020

Вам ничего не нужно делать; Oracle перекомпилирует (или, по крайней мере, попытается сделать это) эти пакеты и сделает их VALID (если что-то другое не предотвратит этого).

Вот простая демонстрация.

Тестовый пример сначала:

SQL> create table test (name varchar2(5));

Table created.

SQL> insert into test
  2    select 'Littl'  from dual union all
  3    select 'Foot'   from dual;

2 rows created.

SQL> create or replace package pkg_test as
  2    function f_test return test.name%type;
  3  end;
  4  /

Package created.

SQL> create or replace package body pkg_test as
  2    function f_test return test.name%type is
  3      retval test.name%type;
  4    begin
  5      select max(name) into retval from test;
  6      return retval;
  7    end;
  8  end;
  9  /

Package body created.

SQL>

Давайте проверим статус пакета и посмотрим результат функции:

SQL> select object_name, status From user_objects where object_name = 'PKG_TEST';

OBJECT_NAM STATUS
---------- -------
PKG_TEST   VALID
PKG_TEST   VALID

SQL> select pkg_test.f_test from dual;

F_TEST
--------------------------------------------------------------------------------
Littl

SQL>

Все в порядке.

Теперь увеличьте столбец и посмотрите, что произойдет:

SQL> alter table test modify name varchar2(10);

Table altered.

SQL> select object_name, status From user_objects where object_name = 'PKG_TEST';

OBJECT_NAM STATUS
---------- -------
PKG_TEST   INVALID
PKG_TEST   INVALID

SQL> select pkg_test.f_test from dual;

F_TEST
--------------------------------------------------------------------------------
Littl

SQL> select object_name, status From user_objects where object_name = 'PKG_TEST';

OBJECT_NAM STATUS
---------- -------
PKG_TEST   VALID
PKG_TEST   VALID

SQL>

Видите? Просто работает . Пакет изначально был INVALID, был перекомпилирован в фоновом режиме и стал VALID.


Итак, не беспокойтесь. Я бы просто сказал поздравляю вы решили объявить все , чтобы оно унаследовало тип данных столбца. Если вы его жестко запрограммировали, то у вас была бы БОЛЬШАЯ проблема с ручным изменением всех этих переменных, и еще много чего, чтобы все работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...