我们将Oracle 11G数据库用于我们的应用程序,并且在各处使用的一个关键字段是零件号字段。通常称为:
PNID (Part Number ID)
或
PNSNID (Part Number Stock Number ID)
以任何一种方式命名,都指同一件事。当前,零件号是5位数字长(varchar2(5)字段),但是我们即将要允许8位数字(这意味着我们将其更改为varchar2(8))。由于manny表,过程和函数使用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\)');
regex字符串应找到以下任何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)?
任何人和所有见识将不胜感激。