這個觸發器如果在SQLSERVER中執行一點問題沒有,但是在ORACLE中是允許這樣做,因為Oracle的觸發器中(確切地是說行級觸發器)不允許訪問變異表。
你要解決這個問題的唯一辦法就是將你的觸發器拆成兩個觸發器:
一個是Before型的行級觸發器,在這個觸發器中將你要修改的第一行的主鍵值保存一個事先定義好的包的一個數組型的變量中;
另一個是After型的語句級觸發器,在這個觸發器中再取出你在前一個觸發器中保存的值再循環做你要做的處理。
就你的例子而言你應該這樣做:
第一步:建立一個包
CREATE OR REPLACE PACKAGE MyPag AS
TYPE t_col1 is table of myTable.col1%type
index by binary_integer;
v_co1 t_col1;
v_row binary_integer := 0;
end MyPag;
第二步:建立一BEFORR的行級觸發器
CREATE OR REPLACE TRIGGER TR_MYTABLE_UPDATE_ROW
BEFORE UPDATE ON TABLE MYTABLE FOR EACH ROW
BEGIN
MyPag.v_row := MyPag.v_row + 1;
MyPag.v_col(MyPag.v_row) := :new.col1;
END TR_MYTABLE_UPDATE_ROW ;
第三步:建立一個AFTER的語句級觸發器
CREATE OR REPLACE TRIGGER TR_MYTABLE_UPDATE
AFTER UPDATE ON TABLE MYTABLE
v_col MYTABLE.COL1%TYPE;
v_rows NUMBER;
BEGIN
FOR V_LOOP IN 1..MyPag.v_row LOOP
v_col := MyPag.v_col(V_LOOP);
SELECT COUNT(1) INTO v_rows FROM MYTABLE WHERE COL1 = v_col;
END LOOP;
END TR_MYTABLE_UPDATE;
你要解決這個問題的唯一辦法就是將你的觸發器拆成兩個觸發器:
一個是Before型的行級觸發器,在這個觸發器中將你要修改的第一行的主鍵值保存一個事先定義好的包的一個數組型的變量中;
另一個是After型的語句級觸發器,在這個觸發器中再取出你在前一個觸發器中保存的值再循環做你要做的處理。
就你的例子而言你應該這樣做:
第一步:建立一個包
CREATE OR REPLACE PACKAGE MyPag AS
TYPE t_col1 is table of myTable.col1%type
index by binary_integer;
v_co1 t_col1;
v_row binary_integer := 0;
end MyPag;
第二步:建立一BEFORR的行級觸發器
CREATE OR REPLACE TRIGGER TR_MYTABLE_UPDATE_ROW
BEFORE UPDATE ON TABLE MYTABLE FOR EACH ROW
BEGIN
MyPag.v_row := MyPag.v_row + 1;
MyPag.v_col(MyPag.v_row) := :new.col1;
END TR_MYTABLE_UPDATE_ROW ;
第三步:建立一個AFTER的語句級觸發器
CREATE OR REPLACE TRIGGER TR_MYTABLE_UPDATE
AFTER UPDATE ON TABLE MYTABLE
v_col MYTABLE.COL1%TYPE;
v_rows NUMBER;
BEGIN
FOR V_LOOP IN 1..MyPag.v_row LOOP
v_col := MyPag.v_col(V_LOOP);
SELECT COUNT(1) INTO v_rows FROM MYTABLE WHERE COL1 = v_col;
END LOOP;
END TR_MYTABLE_UPDATE;
解决方案 »
- 请教这样的函数应该怎么写,求计算公式数值在51-100范围内返回1 ,101-150返回1.5,151-200返回2。。。依次类推
- 关于sql_trace的疑问
- PL SQL 中怎么查看储存过程中查询的结果?
- ~~~~~~~急急急急急 高手赐教 CODE 万分感谢 在线等 ~~~~~~~~
- Oracle和IIS抢用端口问题
- 如何删除一张表中的重复纪录
- 有关自动撤销管理相关的问题
- 如何判断时间是否有错误?
- ***如何实现一个字段在添加时自动加1呢???***
- 一个关于存储过程的问题
- oracle9i安装报错,areasqueries加载出错。
- 关于恢复,用热备份恢复,temp01.dbf如何恢复
CREATE OR REPLACE TRIGGER TRIGGER_NAME
[BEFORE|AFTER] ACTION
ON TABLE_NAME
FOR EACH ROW
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; --就加这一句话就可以了 BEGIN
...... END;