Oracle
 sql >> Database >  >> RDS >> Oracle

Ottenere l'errore PLS-00201 durante la creazione di un tipo in Oracle

Il %TYPE la sintassi è per l'uso nelle dichiarazioni PL/SQL. Sfortunatamente non possiamo usarlo durante la creazione di oggetti SQL. Lo stesso vale per %rowtype .

Sarebbe molto carino se potessimo, perché un uso comune di create or replace type sarebbe creare API di tabelle come vuoi fare. Tuttavia, sarebbe troppo complicato gestire i costrutti di riferimento nel dizionario dei dati; tieni presente che i tipi possono essere utilizzati per definire altri oggetti comprese le colonne della tabella.

Quindi, ahimè, devi dichiarare il tipo con tipi di dati espliciti per i suoi attributi:

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

Ovviamente devi anche sincronizzarlo manualmente ogni volta che cambia la struttura di una qualsiasi colonna T_C_EVO_GAME_CONFIG_CHANGE_LOG. Ma dovresti farlo comunque se hai aggiunto o eliminato una colonna.

In alternativa è possibile definire il tipo come record PL/SQL in un pacchetto. Ciò ti consentirebbe di utilizzare la sintassi di riferimento.

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;

Dipende da come vuoi utilizzare il tipo nella tua applicazione più ampia.