2017-05-31 18 views
0

创造型我有这样的一个表:获取PLS-00201错误,而在Oracle

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,只是简单地复制参数定义,它的工作原理。 但是我不想在Table中进行任何更改时对Type进行任何更改。

+0

您的列名以'F_'前缀开头,对于'%TYPE',您必须完全像在create-table-statement中那样编写它们。 –

+0

喔即使具有相同的名称,如: 创建或替换类型TYPE_EVOL_CONFIG_CHANGE_LOG作为对象 ( 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 ); 它给出了相同的错误。 –

+0

抱歉,它不能这样工作,请参阅APC的出色答案 –

回答

2

%TYPE语法用于PL/SQL声明。不幸的是,我们不能在创建SQL对象时使用它。 %rowtype也是如此。

如果可以的话,它会非常整洁,因为create or replace type的一个常见用途就是按照您的意愿构建表API。但是,管理数据字典中的引用构造会太复杂;请记住,类型可用于定义其他对象,包括表格列。

所以唉,你需要声明有明确的数据类型的类型其属性:

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。