sql >> Base de Datos >  >> RDS >> Oracle

Obteniendo el error PLS-00201 al crear un tipo en Oracle

El %TYPE la sintaxis es para uso en declaraciones PL/SQL. Desafortunadamente, no podemos usarlo al crear objetos SQL. Lo mismo ocurre con %rowtype .

Sería muy bueno si pudiéramos, porque un uso común de create or replace type sería construir API de tabla como quieras hacer. Sin embargo, sería demasiado complicado administrar construcciones de referencia en el diccionario de datos; tenga en cuenta que los tipos se pueden utilizar para definir otros objetos, incluidas las columnas de la tabla.

Por desgracia, debe declarar el Tipo con tipos de datos explícitos para sus 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, también debe sincronizarlo manualmente cada vez que cambie la estructura de cualquier columna T_C_EVO_GAME_CONFIG_CHANGE_LOG. Pero tendría que hacer esto de todos modos si agregó o eliminó una columna.

Alternativamente, puede definir el tipo como un registro PL/SQL en un paquete. Eso le permitiría usar la sintaxis de referencia.

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 cómo quiera usar el Tipo en su aplicación más amplia.