如何在不使依赖类型在oracle中无效的情况下增加列长度
how to increase column length without making dependent types invalid in oracle
我需要增加 oracle 中的列长度 table。但是在包规范中的相同 table 上定义了类型。此包正在 1000 多个包中使用。
所以当我更改列时,所有包都变得无效。
有什么办法可以增加列的长度而不会使依赖类型无效。
谢谢。
您什么都不用做; 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
。
所以,不用担心。我只想说 恭喜 你决定声明 everything 以便它继承列的数据类型。如果您对其进行硬编码,那么您将在手动修改所有这些变量等方面遇到大问题,以使一切正常。
您可以检查online table redefinition,在这种情况下,只有受影响的列的依赖对象才会失效。例如,如果您要更改的列不依赖于包中声明的相同 table 中的类型,那么对于正常的更改命令,这些包将保持 valid.Even 此条件适用,但在线重新定义允许使用临时 table 在修改期间支持 dml 操作
无论如何,因为它是一个生产系统,我建议在 UAT 中测试这个特性,然后在生产中解决它
我需要增加 oracle 中的列长度 table。但是在包规范中的相同 table 上定义了类型。此包正在 1000 多个包中使用。
所以当我更改列时,所有包都变得无效。
有什么办法可以增加列的长度而不会使依赖类型无效。
谢谢。
您什么都不用做; 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
。
所以,不用担心。我只想说 恭喜 你决定声明 everything 以便它继承列的数据类型。如果您对其进行硬编码,那么您将在手动修改所有这些变量等方面遇到大问题,以使一切正常。
您可以检查online table redefinition,在这种情况下,只有受影响的列的依赖对象才会失效。例如,如果您要更改的列不依赖于包中声明的相同 table 中的类型,那么对于正常的更改命令,这些包将保持 valid.Even 此条件适用,但在线重新定义允许使用临时 table 在修改期间支持 dml 操作
无论如何,因为它是一个生产系统,我建议在 UAT 中测试这个特性,然后在生产中解决它