从SQL Server转换为Oracle

时间:2010-08-25 18:17:25

标签: sql sql-server oracle plsql triggers

我希望你们中的一位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位。 我认为其他任何事情都不应该改变。意见?

1 个答案:

答案 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触发器