一共是2张表,T_DEPARTMENT(id,name,sum).部门信息,其中sum项存部门内员工数量。
T_PERSON(id,name,department_id)员工信息,其中department_id为员工所在部门ID.
要对T_PERSON进行insert,update,delete的操作的时候,同时修改T_DEPARTMENT中的sum.
故我写了3个trigger
1)增加一个部门的员工:
CREATE TRIGGER DBTRIGGER.decrease_sum AFTER insert ON DBTRIGGER.t_person
referencing new as n FOR EACH ROW MODE DB2SQL
update DBTRIGGER.t_department as a set a.sum=a.sum + 1
where a.id=n.department_id ;
2)删除一个部门的员工:
CREATE TRIGGER DBTRIGGER.decrease_sum AFTER delete ON DBTRIGGER.t_person
referencing old as n FOR EACH ROW MODE DB2SQL
update DBTRIGGER.t_department as a set a.sum=a.sum - 1
where a.id=n.department_id ;
3)修改一个员工的部门:
CREATE TRIGGER DBTRIGGER.update_sum AFTER UPDATE OF DEPARTMENT_ID ON DBTRIGGER.t_person referencing old as oldrow new as newrow FOR EACH ROW MODE DB2SQL BEGIN ATOMIC update DBTRIGGER.t_department as a set a.sum=a.sum - 1 where a.id=oldrow.department_id ;update DBTRIGGER.t_department as a set a.sum=a.sum + 1 where a.id=newrow.department_id ;END
其中在写第3个关于update的操作时,出现了奇怪的问题:
我一开始的时候,写的trigger为:
CREATE TRIGGER DBTRIGGER.update_sum AFTER UPDATE OF DEPARTMENT_ID ON DBTRIGGER.t_person
referencing old as oldrow new as newrow FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
update DBTRIGGER.t_department as a set a.sum=a.sum - 1 where a.id=oldrow.department_id ;
update DBTRIGGER.t_department as a set a.sum=a.sum + 1 where a.id=newrow.department_id ;
END
但是出现错误:
/*************************************************************************************************************/
CREATE TRIGGER DBTRIGGER.update_sum AFTER UPDATE OF DEPARTMENT_ID ON DBTRIGGER.t_person referencing
old as oldrow new as newrow FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
update DBTRIGGER.t_department as a set a.sum=a.sum - 1 where a.id=oldrow.department_id
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "oldrow.department_id" 后面找到异常标记
"END-OF-STATEMENT"。预期标记可能包括:"<delim_semicolon>"。 LINE NUMBER=3.
SQLSTATE=42601
update DBTRIGGER.t_department as a set a.sum=a.sum + 1 where a.id=newrow.department_id
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0206N "NEWROW.DEPARTMENT_ID" 在使用它的上下文中无效。 SQLSTATE=42703
/**************************************************************************************************************/
我用了很多方法测试,只要是在begin end 之间只加一个sql语句的也不成功.从网上看了些出错的雷同情况,初步断定是分隔符的问题,但是我在
我的语句的后面加上@符号也是相同的结果.
最后的解决办法就是,把3这个trigger写到一行里去,去掉所有的回车换行符.OK!成功!
这个问题让我困饶了3个多小时!郁闷!不知道是我对DB2不熟悉还是DB2确实不如ORACLE灵活,反正用着真别扭.
网上有人说的用DB2命令控制台来执行,db2 -td@ -vf <文件名>.
我也试验过了,但是不知道把我的文件拷到哪里去执行 .我输入命令 db2=> -td@ -vf C:/db2.txt时,只报错,"/"符号错误,不知道原因,如果有
哪位达人看到了,希望能帮我解释一下.Thanks.
T_PERSON(id,name,department_id)员工信息,其中department_id为员工所在部门ID.
要对T_PERSON进行insert,update,delete的操作的时候,同时修改T_DEPARTMENT中的sum.
故我写了3个trigger
1)增加一个部门的员工:
CREATE TRIGGER DBTRIGGER.decrease_sum AFTER insert ON DBTRIGGER.t_person
referencing new as n FOR EACH ROW MODE DB2SQL
update DBTRIGGER.t_department as a set a.sum=a.sum + 1
where a.id=n.department_id ;
2)删除一个部门的员工:
CREATE TRIGGER DBTRIGGER.decrease_sum AFTER delete ON DBTRIGGER.t_person
referencing old as n FOR EACH ROW MODE DB2SQL
update DBTRIGGER.t_department as a set a.sum=a.sum - 1
where a.id=n.department_id ;
3)修改一个员工的部门:
CREATE TRIGGER DBTRIGGER.update_sum AFTER UPDATE OF DEPARTMENT_ID ON DBTRIGGER.t_person referencing old as oldrow new as newrow FOR EACH ROW MODE DB2SQL BEGIN ATOMIC update DBTRIGGER.t_department as a set a.sum=a.sum - 1 where a.id=oldrow.department_id ;update DBTRIGGER.t_department as a set a.sum=a.sum + 1 where a.id=newrow.department_id ;END
其中在写第3个关于update的操作时,出现了奇怪的问题:
我一开始的时候,写的trigger为:
CREATE TRIGGER DBTRIGGER.update_sum AFTER UPDATE OF DEPARTMENT_ID ON DBTRIGGER.t_person
referencing old as oldrow new as newrow FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
update DBTRIGGER.t_department as a set a.sum=a.sum - 1 where a.id=oldrow.department_id ;
update DBTRIGGER.t_department as a set a.sum=a.sum + 1 where a.id=newrow.department_id ;
END
但是出现错误:
/*************************************************************************************************************/
CREATE TRIGGER DBTRIGGER.update_sum AFTER UPDATE OF DEPARTMENT_ID ON DBTRIGGER.t_person referencing
old as oldrow new as newrow FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
update DBTRIGGER.t_department as a set a.sum=a.sum - 1 where a.id=oldrow.department_id
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "oldrow.department_id" 后面找到异常标记
"END-OF-STATEMENT"。预期标记可能包括:"<delim_semicolon>"。 LINE NUMBER=3.
SQLSTATE=42601
update DBTRIGGER.t_department as a set a.sum=a.sum + 1 where a.id=newrow.department_id
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0206N "NEWROW.DEPARTMENT_ID" 在使用它的上下文中无效。 SQLSTATE=42703
/**************************************************************************************************************/
我用了很多方法测试,只要是在begin end 之间只加一个sql语句的也不成功.从网上看了些出错的雷同情况,初步断定是分隔符的问题,但是我在
我的语句的后面加上@符号也是相同的结果.
最后的解决办法就是,把3这个trigger写到一行里去,去掉所有的回车换行符.OK!成功!
这个问题让我困饶了3个多小时!郁闷!不知道是我对DB2不熟悉还是DB2确实不如ORACLE灵活,反正用着真别扭.
网上有人说的用DB2命令控制台来执行,db2 -td@ -vf <文件名>.
我也试验过了,但是不知道把我的文件拷到哪里去执行 .我输入命令 db2=> -td@ -vf C:/db2.txt时,只报错,"/"符号错误,不知道原因,如果有
哪位达人看到了,希望能帮我解释一下.Thanks.