%TYPE
syntax är för användning i PL/SQL-deklarationer. Tyvärr kan vi inte använda det när vi skapar SQL-objekt. Detsamma gäller för %rowtype
.
Det skulle vara mycket snyggt om vi kunde, eftersom en vanlig användning av create or replace type
skulle vara att bygga tabell-API:er som du vill göra. Det skulle dock vara för komplicerat att hantera referenskonstruktioner i dataordboken; kom ihåg att typer kan användas för att definiera andra objekt inklusive tabellkolumner.
Så tyvärr, du måste deklarera typen med explicita datatyper för dess attribut:
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
);
Uppenbarligen måste du också synkronisera det manuellt närhelst strukturen för någon T_C_EVO_GAME_CONFIG_CHANGE_LOG-kolumn ändras. Men du skulle behöva göra detta ändå om du lade till eller släppte en kolumn.
Alternativt kan du definiera typen som en PL/SQL-post i ett paket. Det skulle tillåta dig att använda referenssyntaxen.
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;
Det beror på hur du vill använda typen i din bredare applikation.