2011-02-17 62 views
4

我有我寫了一個觸發器的表:Oracle觸發器:聲明全局變量

CREATE OR REPLACE TRIGGER EMPLOYEE_TRG 
AFTER INSERT OR DELETE OR UPDATE ON EMPLOYEE 

FOR EACH ROW 

DECLARE 
    TYPE arr IS TABLE OF VARCHAR2(32) INDEX BY PLS_INTEGER; 
    v_array arr; 

BEGIN 
    IF UPDATING THEN 
    DBMS_OUTPUT.PUT_LINE('NEW DATA: ' || :new.NAME || ', OLD DATA: ' || :old.NAME); 
    DBMS_OUTPUT.PUT_LINE('ID: ' || :new.P_ID); 
    v_array(:new.P_ID) := :new.NAME; 
    DBMS_OUTPUT.PUT_LINE('COUNTER: ' || v_array.COUNT); -- DISPLAY COUNTER: 1 
    END IF; 
END; 

當我更新EMPLOYEE表觸發的正常工作。但v_array數組不存儲數據?有人可以幫忙嗎?

+1

`v_date_array`或`v_array`? – 2011-02-17 06:24:40

回答

7

聲明v_array如果你想使它成爲全局的(對於一個會話 - 每個會話將有它自己的變量副本)。

CREATE OR REPLACE PACKAGE my_global_pkg IS 

    TYPE arr IS TABLE OF VARCHAR2(32) INDEX BY PLS_INTEGER; 
    g_array arr; 

END my_global_pkg; 

CREATE OR REPLACE TRIGGER EMPLOYEE_TRG 
    AFTER INSERT OR DELETE OR UPDATE ON EMPLOYEE 
    FOR EACH ROW 
BEGIN 
    IF UPDATING THEN 
     DBMS_OUTPUT.PUT_LINE('NEW DATA: ' ||:new.NAME ||', OLD DATA: '||:old.NAME); 
     DBMS_OUTPUT.PUT_LINE('ID: ' || :new.P_ID); 
     my_global_pkg.g_array(:new.P_ID) := :new.NAME; 
     DBMS_OUTPUT.PUT_LINE('COUNTER: ' || my_global_pkg.g_array.COUNT); 
    END IF; 
END; 

對於多會話全局變量,使用關係表(具有適當的多用戶鎖定)。

0

你怎麼知道它不保存數據?你在觸發器中聲明數組。所以它不是全球性的,而是本地的。每次你的觸發器運行,你會得到一個新的數組。您添加一個項目,顯示其數量,然後再次釋放它。計數顯示1,這樣的作品。

您的代碼工作正常,雖然它沒用。 :)你是什麼意思呢? 不用等待,計數屬於不同的數組。您將項目放入本地數組中,並顯示另一個(全局?)數組的計數。難怪它不起作用。我想你正在修改錯誤的數組。