2010-08-25 111 views
1

我希望你們中的一位Oracle專家能夠爲我提供幫助。我有以下SQL Server腳本,但我需要把它改寫爲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

請您重新格式化。這傷害了我的眼睛。注意「代碼」按鈕。 – Bill 2010-08-25 18:19:30

+2

@ Bill:TSQL很好,即使格式化=) – 2010-08-25 18:22:13

回答

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觸發器

+0

來自Oracle新手的跟進。爲什麼這應該是BEFORE INSERT而不是AFTER INSERT觸發器? – Bill 2010-08-25 19:08:25

+0

比爾:沒有特別的理由,可能無所謂 – 2010-08-25 19:22:29

+0

我是否總是要在分號後加分號? – annaken 2010-08-25 21:12:38