%TYPE
syntaks er til brug i PL/SQL-deklarationer. Desværre kan vi ikke bruge det, når vi opretter SQL-objekter. Det samme gælder for %rowtype
.
Det ville være meget pænt, hvis vi kunne, fordi en almindelig brug af create or replace type
ville være at bygge tabel API'er, som du vil gøre. Det ville dog være for kompliceret at administrere referencekonstruktioner i dataordbogen; husk på, at typer kan bruges til at definere andre objekter inklusive tabelkolonner.
Så desværre er du nødt til at erklære typen med eksplicitte datatyper for dens attributter:
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
);
Det er klart, at du også skal synkronisere det manuelt, hver gang strukturen af en T_C_EVO_GAME_CONFIG_CHANGE_LOG kolonne ændres. Men du ville være nødt til at gøre dette alligevel, hvis du tilføjede eller droppede en kolonne.
Alternativt kan du definere typen som en PL/SQL-post i en pakke. Det ville tillade dig at bruge referencesyntaksen.
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 afhænger af, hvordan du vil bruge typen i dit bredere program.