2017-05-31 47 views
0

創造型我有這樣的一個表:獲取PLS-00201錯誤,而在Oracle

CREATE TABLE T_C_EVO_GAME_CONFIG_CHANGE_LOG(
F_TABLE_MODIFIED  VARCHAR2(40), 
F_OPERATION_PERFORMED VARCHAR2(30), 
F_ROWS_ALTERED   INTEGER, 
F_LAST_UPDATED_BY  VARCHAR2(200), 
F_LAST_UPDATED_DATE  TIMESTAMP); 

我試圖建立具有相同結構的類型:

create or replace type TYPE_EVOL_CONFIG_CHANGE_LOG as object 
(
F_TABLE_MODIFIED  T_C_EVO_GAME_CONFIG_CHANGE_LOG.TABLE_MODIFIED%TYPE , 
F_OPERATION_PERFORMED T_C_EVO_GAME_CONFIG_CHANGE_LOG.OPERATION_PERFORMED%TYPE, 
F_ROWS_ALTERED   T_C_EVO_GAME_CONFIG_CHANGE_LOG.ROWS_ALTERED%TYPE , 
F_LAST_UPDATED_BY  T_C_EVO_GAME_CONFIG_CHANGE_LOG.LAST_UPDATED_BY%TYPE , 
F_LAST_UPDATED_DATE  T_C_EVO_GAME_CONFIG_CHANGE_LOG.LAST_UPDATED_DATE%TYPE 
); 

獲取以下在創建類型錯誤消息:

錯誤(3,25):PLS-00201:標識符 'T_C_EVO_GAME_CONFIG_CHANGE_LOG.TABLE_MODIFIED' 必須被聲明。

此前我試圖創建類型而不使用%TYPE,只是簡單地複製參數定義,它的工作原理。 但是我不想在Table中進行任何更改時對Type進行任何更改。

+0

您的列名以'F_'前綴開頭,對於'%TYPE',您必須完全像在create-table-statement中那樣編寫它們。 –

+0

喔即使具有相同的名稱,如: 創建或替換類型TYPE_EVOL_CONFIG_CHANGE_LOG作爲對象 ( 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 ); 它給出了相同的錯誤。 –

+0

抱歉,它不能這樣工作,請參閱APC的出色答案 –

回答

2

%TYPE語法用於PL/SQL聲明。不幸的是,我們不能在創建SQL對象時使用它。 %rowtype也是如此。

如果可以的話,它會非常整潔,因爲create or replace type的一個常見用途就是按照您的意願構建表API。但是,管理數據字典中的引用構造會太複雜;請記住,類型可用於定義其他對象,包括表格列。

所以唉,你需要聲明有明確的數據類型的類型其屬性:

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

很明顯,你還需要手動同步它時,任何T_C_EVO_GAME_CONFIG_CHANGE_LOG柱結構發生變化。但是如果你添加或刪除了一列,你將不得不這樣做。

或者,您可以將類型定義爲包中的PL/SQL記錄。這將允許您使用引用語法。

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; 

這取決於您希望在更廣泛的應用程序中使用Type。