2013-11-09 55 views
0

我有oracle數據庫11gR2,我想用塊自動創建一些觸發器。 當我想在下面運行查詢時,我有一個錯誤。如何在oracle中創建觸發器?

我的塊是:

declare 
    tablesid number ; 
    tablenames varchar2(4000); 
    cursor c1 is 
    select id , title from hr.tables; 

begin 
    open c1; 
    loop 
     fetch c1 into tablesid , tablenames; 
    CREATE OR REPLACE TRIGGER tablenames||'_before_insert' 
     before insert 
     on hr.tablenames 
     DECLARE 

    columnid number ; 
     columnval number ; 
     columntitle varchar(4000); 

     cursor c2 is 
     select id from hr.columns where tableid = tablesid ; 
     BEGIN 

     -- open c2 ; 
     for rec in c2 loop 
     select title into columntitle from hr.columns where id = rec.id 
     insert into hr.rowaction(columnid,newvalue,oldvalue,actiondate) 
     (
     select id ,:new.columntitle,:old.columntitle,sysdate 
     from hr.tabletiltes 
     where id = rec.id 
    ) 
     select title into columntitle from hr.columns where id = rec.id; 
     dbms_output.put_line(columntitle); 
    end loop; 
    end; 
    end loop ;close c1; end; 

ORA-06550:線11,第6欄: PLS-00103:出現符號 「CREATE」 在需要下列之一時: (開始的情況下聲明最終退出了轉到如果環模空 編譯提高收益選擇更新而與 < < 繼續關閉當前刪除獲取鎖芯打開回滾 保存點設置SQL執行提交FORALL合流管清洗 06550. 00000 - 「行%s,列%s:\ n%s」 *原因:通常是PL/SQL編譯錯誤。 *操作: 綁定變量「新」未聲明 匿名塊完成 綁定變量「新」未聲明 匿名塊完成

由於

+0

從評論中,saeed.sh詢問了一個構建觸發器的過程,該過程將在數據庫的每個表發生更改時保存數據。這是一個大問題。 –

回答

4

觸發器是代碼的獨立分離件通常被認爲是定義對象元數據的語言DDL

您不能在PL/SQL塊中嵌入觸發器聲明。如果您需要快速創建一些PL/SQL代碼 - 這不是一個好主意 - 請考慮使用DMBS_DDL.CREATE_WRAPPED過程。你好像也有EXECUTE IMMEDIATE。如果是這樣,請閱讀以下內容:(http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_ddl.htm

換句話說,您應該在運行PL/SQL之前定義觸發器。製作兩個腳本。

+0

我想保存數據庫中的所有更改。我有3個表格:表,列,rowaction。在表格中保存所有表格的名稱,以列的形式保存所有具有tableid的列的名稱。我想在rowaction的表中插入前後保存舊值和新值。所以我應該使用過程自動爲數據庫中的所有表創建觸發器。我有一個想法,我解釋它的問題,你有嗎? –

+0

這是一個完整的項目!我們在這裏完成了參數化表格,它是一段精彩的代碼。但因爲我自己沒做成,我不會放棄它。 –

+0

就我的經驗,我沒有在循環中做觸發器,但是當我以編程方式創建一個與此類似的(不使用包裝器)時,我必須運行'CREATE OR REPLACE TRIGGER x'到END ;'line,然後運行'ALTER TRIGGER x ENABLE;'在一個單獨的命令中以編程方式應用觸發器,並且仍然在這個「Enter Binds」窗口之間點擊(這也許是爲什麼你不能直接進入下一個命令?)。當我嘗試這種方式時,不必使用'EXECUTE IMMEDIATE'並出錯。 – vapcguy