简体   繁体   English

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

[英]Getting PLS-00201 error while creating a type in oracle

I have a table like this: 我有一张这样的桌子:

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);

I am trying to build a type with the same structure: 我试图建立具有相同结构的类型:

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
);

Getting the below error message in creating the Type : 在创建Type时获得以下错误消息:

Error(3,25): PLS-00201: identifier 'T_C_EVO_GAME_CONFIG_CHANGE_LOG.TABLE_MODIFIED' must be declared. 错误(3,25):PLS-00201:必须声明标识符“ T_C_EVO_GAME_CONFIG_CHANGE_LOG.TABLE_MODIFIED”。

Previously I tried to create the Type without using %TYPE and just simply copying the parameter definition and it worked. 以前,我尝试在不使用%TYPE情况下创建Type,而只是简单地复制参数定义即可。 But I don't want to make any changes in Type when I make any changes in Table. 但是当我在Table中进行任何更改时,我都不想在Type中进行任何更改。

The %TYPE syntax is for use in PL/SQL declarations. %TYPE语法用于PL / SQL声明中。 Unfortunately we cannot use it when creating SQL objects. 不幸的是,在创建SQL对象时我们无法使用它。 Same goes for %rowtype . %rowtype

It would be highly neat if we could, because one common use of create or replace type would be to build table APIs as you want to do. 如果可以的话,这将是非常整洁的,因为create or replace type一种常见用法是create or replace type构建表API。 However, it would be too complicated to manage referencing constructs in the data dictionary; 但是,在数据字典中管理引用构造会太复杂。 bear in mind that Types can be used to define other objects including Table columns. 请记住,类型可用于定义其他对象,包括表格列。

So alas, you need to declare the Type with explicit datatypes for its attributes: 因此,您需要使用其属性的显式数据类型声明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
);

Obviously you also need to sync it manually whenever the structure of any T_C_EVO_GAME_CONFIG_CHANGE_LOG column changes. 显然,每当T_C_EVO_GAME_CONFIG_CHANGE_LOG列的结构更改时,您还需要手动同步它。 But you would have to do this anyway if you added or dropped a column. 但是,如果您添加或删除了列,则还是必须这样做。

Alternatively you can define the type as a PL/SQL record in a package. 或者,您可以将类型定义为包中的PL / SQL记录。 That would allow you to use the referencing syntax. 那将允许您使用引用语法。

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;

It depends how you want to use the Type in your broader application. 这取决于您要如何在更广泛的应用程序中使用Type。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM