我有一张这样的表:
CREATE TABLE T_C_EVO_GAME_CONFIG_CHANGE_LOG(
F_TABLE_MODIFIED VARCHAR2(40),
F_OPERATION_PERFORMED VARCHAR2(30),
F_ROWS_ALTERED INTEGER,
F_LAST_UPDATED_BY VARCHAR2(200),
F_LAST_UPDATED_DATE TIMESTAMP);
我正在尝试构建一个具有相同结构的类型:
create or replace type TYPE_EVOL_CONFIG_CHANGE_LOG as object
(
F_TABLE_MODIFIED T_C_EVO_GAME_CONFIG_CHANGE_LOG.TABLE_MODIFIED%TYPE ,
F_OPERATION_PERFORMED T_C_EVO_GAME_CONFIG_CHANGE_LOG.OPERATION_PERFORMED%TYPE,
F_ROWS_ALTERED T_C_EVO_GAME_CONFIG_CHANGE_LOG.ROWS_ALTERED%TYPE ,
F_LAST_UPDATED_BY T_C_EVO_GAME_CONFIG_CHANGE_LOG.LAST_UPDATED_BY%TYPE ,
F_LAST_UPDATED_DATE T_C_EVO_GAME_CONFIG_CHANGE_LOG.LAST_UPDATED_DATE%TYPE
);
在创建类型时收到以下错误消息:
错误(3,25):PLS-00201:必须声明标识符'T_C_EVO_GAME_CONFIG_CHANGE_LOG.TABLE_MODIFIED'。
以前我尝试在不使用%TYPE
的情况下创建Type,只是简单地复制参数定义就可以了。
但是当我在Table中进行任何更改时,我不想对Type进行任何更改。
答案 0 :(得分:2)
%TYPE
语法用于PL / SQL声明。不幸的是,我们在创建SQL对象时无法使用它。同样适用于%rowtype
。
如果可以的话,它会非常整洁,因为create or replace type
的一个常见用途是构建表API,就像你想要的那样。但是,管理数据字典中的引用构造会太复杂;请记住,类型可用于定义其他对象,包括表格列。
唉,你需要声明Type的显式数据类型为其属性:
create or replace type TYPE_EVOL_CONFIG_CHANGE_LOG as object
(
F_TABLE_MODIFIED VARCHAR2(40) ,
F_OPERATION_PERFORMED VARCHAR2(30),
F_ROWS_ALTERED INTEGER ,
F_LAST_UPDATED_BY VARCHAR2(20) ,
F_LAST_UPDATED_DATE DATE
);
显然,只要T_C_EVO_GAME_CONFIG_CHANGE_LOG列的结构发生变化,您也需要手动同步它。但是如果你添加或删除了一列,你无论如何都必须这样做。
或者,您可以将类型定义为包中的PL / SQL记录。这将允许您使用引用语法。
create or replace package game_config as
TYPE_EVOL_CONFIG_CHANGE_LOG is record
(
F_TABLE_MODIFIED T_C_EVO_GAME_CONFIG_CHANGE_LOG.F_TABLE_MODIFIED%TYPE ,
F_OPERATION_PERFORMED T_C_EVO_GAME_CONFIG_CHANGE_LOG.F_OPERATION_PERFORMED%TYPE,
F_ROWS_ALTERED T_C_EVO_GAME_CONFIG_CHANGE_LOG.F_ROWS_ALTERED%TYPE ,
F_LAST_UPDATED_BY T_C_EVO_GAME_CONFIG_CHANGE_LOG.F_LAST_UPDATED_BY%TYPE ,
F_LAST_UPDATED_DATE T_C_EVO_GAME_CONFIG_CHANGE_LOG.F_LAST_UPDATED_DATE%TYPE
);
-- or even
TYPE TAB_EVOL_CONFIG_CHANGE_LOG is table of T_C_EVO_GAME_CONFIG_CHANGE_LOG%rowtype;
end;
这取决于您希望如何在更广泛的应用程序中使用Type。