Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Obtendo o erro PLS-00201 ao criar um tipo no oracle


O %TYPE sintaxe é para uso em declarações PL/SQL. Infelizmente não podemos usá-lo ao criar objetos SQL. O mesmo vale para %rowtype .

Seria muito legal se pudéssemos, porque um uso comum de create or replace type seria construir APIs de tabela como você deseja fazer. No entanto, seria muito complicado gerenciar construções de referência no dicionário de dados; tenha em mente que Tipos podem ser usados ​​para definir outros objetos, incluindo colunas de Tabela.

Então, infelizmente, você precisa declarar o Tipo com tipos de dados explícitos para seus atributos:
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
);

Obviamente, você também precisa sincronizá-lo manualmente sempre que a estrutura de qualquer coluna T_C_EVO_GAME_CONFIG_CHANGE_LOG for alterada. Mas você teria que fazer isso de qualquer maneira se adicionasse ou eliminasse uma coluna.

Alternativamente, você pode definir o tipo como um registro PL/SQL em um pacote. Isso permitiria que você usasse a sintaxe de referência.
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;

Depende de como você deseja usar o Tipo em seu aplicativo mais amplo.