如何在oracle中增加列长度而不使依赖类型无效

如何在oracle中增加列长度而不使依赖类型无效,oracle,plsql,types,alter,Oracle,Plsql,Types,Alter,我需要增加oracle表中的列长度。但在包规范中的同一个表上定义了类型。该软件包被用于1000多个软件包中 所以,当我更改列时,所有包都将无效 有没有办法,这样我就可以在不使依赖类型无效的情况下增加列长度 谢谢。你不需要做任何事情;Oracle将重新编译(或至少尝试重新编译)这些包,并使其有效(除非有其他原因阻止) 这里有一个简单的演示 首先测试用例: SQL> create table test (name varchar2(5)); Table created. SQL> i

我需要增加oracle表中的列长度。但在包规范中的同一个表上定义了类型。该软件包被用于1000多个软件包中

所以,当我更改列时,所有包都将无效

有没有办法,这样我就可以在不使依赖类型无效的情况下增加列长度


谢谢。

你不需要做任何事情;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中测试此功能,然后在生产中解决它

感谢您的详细回答。。。我仍然有无效对象的问题,即使只是一段时间。。。因为这是为了生产和非常关键的一个“一段时间”,直到有人调用无效对象。然后重新编译并生效。我只想补充一点,我不建议你在工作时间“强制”这样做,因为你将无法重新编译用户持有的任何对象。谢谢你的详细回答。。。我仍然有无效对象的问题,即使只是一段时间。。。因为这是为了生产和非常关键的一个“一段时间”,直到有人调用无效对象。然后重新编译并生效。我只想补充一点,我不建议您在工作时间“强制”执行这些操作,因为您将无法重新编译用户持有的任何对象。