我想将Oracle表中的列类型从varchar2(50)更新为varchar2(200)。
我已经开始做一些影响分析,这个变化可能会在搜索使用这个字段的软件包时看到,但是看了一下之后,似乎没有在任何地方指定字段长度。唯一指定的是列类型,在这种情况下是 varchar2 。
我的问题是:
如果您想要更改的唯一内容是一个特定列的varchar2类型的字段长度,这是否会影响可能引用此字段的任何底层包?
由于
答案 0 :(得分:1)
如果您想要更改的唯一内容是一个特定列的varchar2类型的字段长度,这是否会影响可能引用此字段的任何底层包
这正是%Type
type尝试解决的情况,即如果更改引用列上的基础类型,引用该列的相关工件(如包)将保持同步。
不幸的是,如果您已将包中的参数和变量定义为varchar2(50)
,则需要手动将这些参数和变量更新为新宽度,在这种情况下,您可以将其更改为MYTABLE.MYCOLUMN%TYPE
以保护反对未来的变化。
答案 1 :(得分:1)
究竟是什么意思是“唯一指定的是列类型”?
如果您的代码始终使用锚定类型,即
l_variable_name table_name.column_name%type;
然后,每当您更改基础代码中的数据类型时,更改将自动通过您的代码传播。这是使用锚定类型的主要好处之一 - 它可以防止代码中的类型声明与表中列的声明不同步。
答案 2 :(得分:1)
您只需要确保在column
声明中引用TYPE
的任何地方,您都提到column%type
而不是硬编码为VARCHAR(50)
。
查看是否有type
显式创建为database object
引用此列,如果它是大小硬编码,那么它也会失败。
首先进行此影响分析,尤其是当您的application/system
过时或遗留下来时。当时的开发人员可能没有考虑过未来,并且可能已经如上所述硬编码了大小。我已经看到它发生在我工作的一个应用程序中,幸运的是在system integration testing
期间发现了它。因此,请彻底执行impact analysis
并尽可能好地完成integration testing
。