如何在oracle中增加列长度而不使依赖类型无效
我需要增加oracle表中的列长度。但在包规范中的同一个表上定义了类型。该软件包被用于1000多个软件包中 所以,当我更改列时,所有包都将无效 有没有办法,这样我就可以在不使依赖类型无效的情况下增加列长度如何在oracle中增加列长度而不使依赖类型无效,oracle,plsql,types,alter,Oracle,Plsql,Types,Alter,我需要增加oracle表中的列长度。但在包规范中的同一个表上定义了类型。该软件包被用于1000多个软件包中 所以,当我更改列时,所有包都将无效 有没有办法,这样我就可以在不使依赖类型无效的情况下增加列长度 谢谢。你不需要做任何事情;Oracle将重新编译(或至少尝试重新编译)这些包,并使其有效(除非有其他原因阻止) 这里有一个简单的演示 首先测试用例: SQL> create table test (name varchar2(5)); Table created. SQL> i
谢谢。你不需要做任何事情;Oracle将重新编译(或至少尝试重新编译)这些包,并使其
有效
(除非有其他原因阻止)
这里有一个简单的演示
首先测试用例:
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>
看到了吗?它只是工作。软件包最初是无效的
,在后台重新编译后变为有效的
所以,不用担心。我只想祝贺您决定声明所有内容,以便它继承列的数据类型。如果您硬编码了它,那么手动修改所有这些变量(诸如此类)以使一切正常运行将是一个大问题。您不需要做任何事情;Oracle将重新编译(或至少尝试重新编译)这些包,并使其
有效
(除非有其他原因阻止)
这里有一个简单的演示
首先测试用例:
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>
看到了吗?它只是工作。软件包最初是无效的
,在后台重新编译后变为有效的
所以,不用担心。我只想祝贺您决定声明所有内容,以便它继承列的数据类型。如果您硬编码了它,那么手动修改所有这些变量(诸如此类)以使一切正常工作将是一个大问题。您可以检查在这种情况下,只有受影响的列的依赖对象才会变为无效。例如,如果要更改的列不依赖于包中声明的同一表中的类型,则这些包将保持有效。即使对于正常的alter命令,此条件也适用,但联机重新定义允许在更改期间使用临时表支持dml操作 无论如何,由于它是一个生产系统,我建议在UAT中测试此功能,然后在生产中解决它,您可以检查在这种情况下,只有受影响的列的依赖对象才会变得无效。例如,如果要更改的列不依赖于包中声明的同一表中的类型,则这些包将保持有效。即使对于正常的alter命令,此条件也适用,但联机重新定义允许在更改期间使用临时表支持dml操作
无论如何,由于它是一个生产系统,我建议在UAT中测试此功能,然后在生产中解决它感谢您的详细回答。。。我仍然有无效对象的问题,即使只是一段时间。。。因为这是为了生产和非常关键的一个“一段时间”,直到有人调用无效对象。然后重新编译并生效。我只想补充一点,我不建议你在工作时间“强制”这样做,因为你将无法重新编译用户持有的任何对象。谢谢你的详细回答。。。我仍然有无效对象的问题,即使只是一段时间。。。因为这是为了生产和非常关键的一个“一段时间”,直到有人调用无效对象。然后重新编译并生效。我只想补充一点,我不建议您在工作时间“强制”执行这些操作,因为您将无法重新编译用户持有的任何对象。