1) DB2触发器有三种
NO CASCADE BEFORE;AFTER;INSTEAD OF
我想实现对一个表插入前先插入另一个表的记录
CREATE TRIGGER default_time
NO CASCADE BEFORE INSERT ON inventory
REFERENCING NEW AS n
FOR EACH ROW
MODE DB2SQL
INSERT INTO sold
VALUES (n.product_ID, n.daysold, o.quantity - n.quantity)
结果居然显示:
SQL0797N用不受支持的触发SQL语句定义了触发器,SQLSTATE=42987
BEFORE 触发器还可以包括下列已触发的 SQL 语句:
- 调用不修改 SQL 数据的 CALL 语句
- 全查询
- 赋值语句
但是,BEFORE 触发器中触发的 SQL 语句不能包括:
- 修改 SQL 数据的表函数
- 嵌套的 DELETE、INSERT、MERGE 或 UPDATE 语句
2) 在CLP中创建存储过程时,若使用
db2 create procedure p_salary (in pid int, out pname varchar(30) )
language sql
p1: begin
declare tempname varchar(10);
select empname into tempname
from salarytable
where empid=pid;
set pname=tempname||'a'||tempname;
end p1
总是返回:
SQLSTATE 42601 ''a''不是内部命令,也不是可运行的程序或批处理文件。''tempname''不是内部命令,也不是可运行的程序或批处理文件。
好像是连接符||出了问题
如果把最后一句改为:
set pname=tempname就胜利通过
||不行的话,用concat试试
3) DB2的触发器和ORACLE有什么不一样的地方
Oracle 的限制
db2 可以2M大
db2 没有mutating tables的限制,比如,你完全可以有下面这样的trigger
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13165828/viewspace-607158/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13165828/viewspace-607158/