我有以下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_owner
、table_name
和column_name
列与all_tab_columns
中的列数据类型和大小相同 - 这可能不正确。不知道为什么您不会为这些使用等效tab_param.column%TYPE
。sType
的声明看起来也很奇怪;也许这应该是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
的值 - 但是,该代码未显示在您的示例中。