PL/SQL : ALL_TAB_COLUMNS.table_name%TYPE value



我有以下PL/SQL代码:

PROCEDURE alterTab(
nbChar IN NUMBER)
IS
CURSOR SQL_TABLE     IS
SELECT TABLE_OWNER,TABLE_NAME,COLUMN_NAME,TYPE_METHODE,SEPARATEUR,PATTERN,ID FROM TAB_PARAM ;
sTable                                  sys.ALL_TAB_COLUMNS.table_name%TYPE;
sOwner                                  sys.ALL_TAB_COLUMNS.owner%TYPE;
sColumn                                 sys.ALL_TAB_COLUMNS.COLUMN_NAME%TYPE;
sType                                 sys.ALL_TAB_COLUMNS.COLUMN_NAME%TYPE;
sPattern                                 TAB_PARAM.PATTERN%TYPE;
sSeparateur                                 TAB_PARAM.SEPARATEUR%TYPE;
sId                                 sys.ALL_TAB_COLUMNS.COLUMN_NAME%TYPE;
nNbTable number;

我不明白是什么系统。ALL_TAB_COLUMNS.table_name%TYPE 是。 例如,如果TAB_PARAM的第一行如下所示:

('USER','EMPLOYEE','NAME','rien','REP','','ID_USER');

stable是否采用员工值?

这是说您的sTable变量与all_tab_columns中的table_name列具有相同的数据类型。高达 11gR2 相当于执行以下操作:

sTable varchar2(30);

从 12cR1 开始,对象名称限制有所增加,因此在该版本中,它相当于:

sTable varchar2(128);

通过使用声明的%TYPE语法,变量将获得过程所在环境的适当大小。如果您以 11gR2 或更早版本编译它,它将是 30 字节,在 12cR1 或更高版本中它将是 128 字节 - 无论哪种方式,它都可以保存来自该系统视图的值,或者在这种情况下可能来自您的光标,但仅当您fetch它时。

当然,您也可以使用它来引用自己的表,就像使用tab_param一样。优点是,如果列类型发生更改,您不必手动浏览所有PL/SQL代码并将任何变量更改为新的类型/大小。它是自动的 - 更改表定义将使过程无效,它将在下次引用时重新编译,并将自动选取新的类型/大小。

在文档中阅读有关%TYPE属性的更多信息。


尚未显示过程的其余部分,但可能是您正在将游标中的行提取到这些变量中。有一个假设,即tab_param表中的table_ownertable_namecolumn_name列与all_tab_columns中的列数据类型和大小相同 - 这可能不正确。不知道为什么您不会为这些使用等效tab_param.column%TYPEsType的声明看起来也很奇怪;也许这应该是tab_param.type_methode%TYPE?(如果是这样,您也可以将记录类型声明为sql_table%rowtype,而不是每列有一个标量变量,但这相当偏离主题......

ALL_TAB_COLUMNS.table_name%TYPE

的数据类型与ALL_TAB_COLUMNS表中TABLE_NAME列的数据类型相同。

所以:

sTable sys.ALL_TAB_COLUMNS.table_name%TYPE;

将声明一个变量sTable该变量的数据类型与ALL_TAB_COLUMNS表中的TABLE_NAME列相同。该变量尚未被赋予值,因此它最初的值为NULL

如果您稍后将游标行放入相应的变量中,那么给定您的示例,是的,它可能具有EMPLOYEE的值 - 但是,该代码未显示在您的示例中。

最新更新