Oracle
 sql >> Base de données >  >> RDS >> Oracle

Obtenir l'erreur PLS-00201 lors de la création d'un type dans Oracle

Le %TYPE La syntaxe est destinée à être utilisée dans les déclarations PL/SQL. Malheureusement, nous ne pouvons pas l'utiliser lors de la création d'objets SQL. Idem pour %rowtype .

Ce serait très bien si nous pouvions, car une utilisation courante de create or replace type serait de construire des API de table comme vous le souhaitez. Cependant, il serait trop compliqué de gérer les constructions de référencement dans le dictionnaire de données; gardez à l'esprit que les types peuvent être utilisés pour définir d'autres objets, y compris les colonnes de table.

Alors hélas, vous devez déclarer le Type avec des types de données explicites pour ses attributs :

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

Évidemment, vous devez également le synchroniser manuellement chaque fois que la structure d'une colonne T_C_EVO_GAME_CONFIG_CHANGE_LOG change. Mais vous devrez le faire de toute façon si vous avez ajouté ou supprimé une colonne.

Vous pouvez également définir le type en tant qu'enregistrement PL/SQL dans un package. Cela vous permettrait d'utiliser la syntaxe de référencement.

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;

Cela dépend de la manière dont vous souhaitez utiliser le type dans votre application plus large.