如何在不使依赖类型在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 中测试这个特性,然后在生产中解决它