2011-02-17 61 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,这样的作品。

您的代码工作正常,虽然它没用。 :)你是什么意思呢? 不用等待,计数属于不同的数组。您将项目放入本地数组中,并显示另一个(全局?)数组的计数。难怪它不起作用。我想你正在修改错误的数组。