我希望你们中的一位Oracle专家能够帮我解决这个问题。我有以下SQL Server脚本,但我需要为Oracle重写它:
USE mydb
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE trigger mydb . [CONNECTERTRIGGER] on mydb . [DtreeNotify]
FOR INSERT AS
BEGIN
IF @@ROWCOUNT=0
RETURN
SET IDENTITY_INSERT mydb.DTreeNotify2 ON
INSERT INTO mydb.DTreeNotify2
(NID,NType,DataID,VersionNum,OwnerID,SubType)
SELECT inserted.NID,
inserted.NType,
inserted.DataID,
inserted.VersionNum,
mydb.Dtree.OwnerID,
livelink.DTree.SubType
FROM inserted, livelink.DTree
WHERE inserted.DataID = livelink.DTree.DataID;
END
我认为@@ rowcount变为sql%rowcount,但我正在努力使用identity_insert位。 我认为其他任何事情都不应该改变。意见?
答案 0 :(得分:2)
不要担心IDENTITY_INSERT位,它在Oracle中完成的方式有很大不同,无论如何都不需要这样的选项。寻找“SEQUENCE”以了解更多相关信息。
我们走了:
CREATE trigger "CONNECTERTRIGGER"
AFTER INSERT on "DtreeNotify"
FOR EACH ROW
begin
insert into DTreeNotify2 (NID,NType,DataID,VersionNum,OwnerID,SubType)
select :new.NID, :new.NType, :new.DataID, :new.VersionNum,
Dtree.OwnerID, livelink.DTree.SubType
from livelink.DTree
where :new.DataID=livelink.DTree.DataID;
end;
评论:我认为Dtree.OwnerID是一个可以直接读取的包变量。
如您所见,有一个:new
记录,其中包含一个插入的记录(为每个插入的记录调用此触发器)。
编辑:将BEFORE触发器更改为AFTER触发器