【问题标题】:translate from SQL Server to Oracle从 SQL Server 转换为 Oracle
【发布时间】:2011-04-03 21:30:26
【问题描述】:

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

【问题讨论】:

  • 请重新格式化。这伤害了我的眼睛。注意“代码”按钮。
  • @Bill:TSQL 对此有好处,即使它已格式化 =)

标签: sql sql-server oracle plsql triggers


【解决方案1】:

不用担心 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 触发器

【讨论】:

  • 一位 Oracle 新手的跟进。为什么这应该是 BEFORE INSERT 而不是 AFTER INSERT 触发器?
  • 比尔:没有特殊原因,可能没关系
  • 我是否总是必须在 END 后加分号?
  • 后触发器更快。手册是这样说的: 注意:AFTER 行触发器比 BEFORE 行触发器更有效。使用 BEFORE 行触发器,必须为触发器读取一次受影响的数据块(逻辑读取,而不是物理读取),然后再为触发语句读取一次。或者,对于 AFTER 行触发器,数据块必须对触发语句和触发器都只读取一次。
  • 所以我把它设为后触发器,然后
猜你喜欢
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多