【问题标题】:Getting PLS-00201 error while creating a type in oracle在 oracle 中创建类型时出现 PLS-00201 错误
【发布时间】:2017-10-31 17:53:10
【问题描述】:

我有一张这样的桌子:

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

【问题讨论】:

  • 您的列名以F_ 前缀开头,对于%TYPE,您必须像在create-table-statement 中一样编写它们。
  • 喔甚至具有相同的名称,如:创建或替换类型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%类型,F_LAST_UPDATED_DATE T_C_EVO_GAME_CONFIG_CHANGE_LOG.F_LAST_UPDATED_DATE%TYPE);它给出了同样的错误。
  • 抱歉,这样不行,看APC的优秀回答

标签: oracle plsql user-defined-types


【解决方案1】:

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

如果可以的话,那就太好了,因为create or replace type 的一种常见用法是按照您的意愿构建表 API。但是,管理数据字典中的引用结构太复杂了;请记住,Types 可用于定义其他对象,包括 Table 列。

唉,你需要用明确的数据类型为其属性声明类型:

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;

这取决于您希望如何在更广泛的应用程序中使用该类型。

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多