Изменить длину данных всех вхождений определенного столбца - PullRequest
0 голосов
/ 04 сентября 2018

Мы используем базу данных Oracle 11G для наших приложений, и одно ключевое поле, которое используется везде, - это наше поле номера детали. Обычно это называется:

PNID    (Part Number ID)

или

PNSNID  (Part Number Stock Number ID)

В любом случае это имя, оно относится к одному и тому же. В настоящее время номер детали имеет длину 5 цифр (поле varchar2 (5)), но у нас есть предстоящее требование разрешить 8 цифр (то есть мы изменим его на varchar2 (8)). Поскольку таблицы, процедуры и функции Мэнни используют 5-байтовую длину, это может создать некоторые проблемы. Я аналитик, а не разработчик, но моя часть в том, чтобы определить влияние и усилия на внесение таких изменений, прежде чем что-либо будет назначено разработчику. По сути, мне нужно определить, сколько мест нужно обновить.

Найти таблицы, которые нужно обновить, было достаточно просто. Я запросил dba_tab_columns, чтобы найти все таблицы с полем с именем PNID или PNSNID, и я также смог получить текущую длину и тип данных поля:

SELECT DISTINCT
    owner,
    table_name,
    column_name,
    data_type,
    data_length
FROM
    dba_tab_columns
WHERE
    owner = 'APP_CORE'
    AND REGEXP_LIKE(COLUMN_NAME, 'PN[S]?[N]?ID');

Но я не могу найти объявления в теле, процедурах и функциях пакетов. Просматривая другие вопросы о переполнении стека, я обнаружил, что могу запросить DBA_SOURCE и DBA_ARGUMENTS, чтобы найти экземпляр строки в коде, но я не думаю, что подхожу к этому правильно.

Мой запрос DBA_SOURCE выглядит следующим образом:

SELECT DISTINCT
    owner,
    name,
    line,
    text
FROM
    dba_source
WHERE
    owner = 'APP_CORE'
    AND REGEXP_LIKE(UPPER(text), 'PN[S]?[N]?ID\s+\S+\s*\(\d\)');

Строка регулярного выражения должна найти любую строку PNID или PNSNID, за которой следует хотя бы один пробел, затем любой непробельный символ (для объявления типа данных), затем ноль или более необязательных пробелов, за которыми следует скобка с числом внутри (длина данных) , Это лучший способ, которым я мог бы придумать, только находя строки, которые фактически объявляют длину типа данных, но возвращаются более 1000 результатов, и при проверке каждой строки иногда они закомментированы или они декальцируют тип данных от использования% TYPE. %, ссылаясь на фактический тип данных таблицы (что означало бы, что мне нужно только изменить эту таблицу, и все, что использует этот тип, уже будет хорошо). Дело в том, что я не могу просмотреть все более 1000 экземпляров, чтобы выяснить, действительно ли это нужно изменить. Есть ли лучший способ сделать это?

Я сделал что-то похожее для поиска любых функций:

SELECT DISTINCT
    owner,
    package_name,
    object_name,
    arugument_name,
    data_type,
    default_length,
    in_out
FROM
    dba_arguments
WHERE
    owner = 'APP_CORE'
    AND (REGEXP_LIKE(OBJECT_NAME, 'PN[S]?[N]?ID')
    OR  REGEXP_LIKE(ARGUMENT_NAME, 'PN[S]?[N]?ID'))
ORDER BY
    1,2,3,4;

У меня вопрос, правильно ли я подхожу к этому? Нам нужно только изменить длину данных внутри таблиц, тогда любое место, где они объявлены в теле, процедурах и функциях пакета, верно? Есть ли что-то, чего мне не хватает? Кроме того, есть ли более точный способ найти все случаи, которые мне нужно изменить (используя только SQL Developer, у меня нет TOAD)?

Любая и всякая проницательность будет принята с благодарностью.

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