在oracle中创建类型时出现PLS-00201错误

时间:2017-05-31 05:04:21

标签: oracle plsql user-defined-types

我有一张这样的表:

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进行任何更改。

1 个答案:

答案 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。