2010-01-12 29 views
0

我有一個T-SQL腳本,它將字段轉換爲IDENTITY(以奇怪的方式)。T-SQL到PL/SQL(IDENTITY)

如何將其轉換爲PL/SQL? (並且可能會弄清楚,如果有更簡單的方法來做到這一點 - 不需要創建臨時表)。

的T-SQL腳本:

-- alter table ts_changes add TS_THREADID VARCHAR(100) NULL; 

-- Change Field TS_ID TS_NOTIFICATIONEVENTS to IDENTITY 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_TS_NOTIFICATIONEVENTS 
    (
    TS_ID int NOT NULL IDENTITY (1, 1), 
    TS_TABLEID int NOT NULL, 
    TS_CASEID int NULL, 
    TS_WORKFLOWID int NULL, 
    TS_NOTIFICATIONID int NULL, 
    TS_PRIORITY int NULL, 
    TS_STARTDATE int NULL, 
    TS_TIME int NULL, 
    TS_WAITSTATUS int NULL, 
    TS_RECIPIENTID int NULL, 
    TS_LASTCHANGEDATE int NULL, 
    TS_ELAPSEDCYCLES int NULL 
    ) ON [PRIMARY] 

SET IDENTITY_INSERT dbo.Tmp_TS_NOTIFICATIONEVENTS ON 
GO 
IF EXISTS(SELECT * FROM dbo.TS_NOTIFICATIONEVENTS) 
    EXEC('INSERT INTO dbo.Tmp_TS_NOTIFICATIONEVENTS (TS_ID, TS_TABLEID, TS_CASEID, TS_WORKFLOWID, TS_NOTIFICATIONID, TS_PRIORITY, TS_STARTDATE, TS_TIME, TS_WAITSTATUS, TS_RECIPIENTID, TS_LASTCHANGEDATE, TS_ELAPSEDCYCLES) 
    SELECT TS_ID, TS_TABLEID, TS_CASEID, TS_WORKFLOWID, TS_NOTIFICATIONID, TS_PRIORITY, TS_STARTDATE, TS_TIME, TS_WAITSTATUS, TS_RECIPIENTID, TS_LASTCHANGEDATE, TS_ELAPSEDCYCLES FROM dbo.TS_NOTIFICATIONEVENTS WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_TS_NOTIFICATIONEVENTS OFF 
GO 
DROP TABLE dbo.TS_NOTIFICATIONEVENTS 
GO 
EXECUTE sp_rename N'dbo.Tmp_TS_NOTIFICATIONEVENTS', N'TS_NOTIFICATIONEVENTS', 'OBJECT' 
GO 
ALTER TABLE dbo.TS_NOTIFICATIONEVENTS ADD CONSTRAINT 
aaaaaTS_NOTIFICATIONEVENTS_PK PRIMARY KEY NONCLUSTERED 
(
TS_ID 
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

GO 
COMMIT 

回答

4

從版本12C,Oracle支持的IDENTITY數據類型例如:

CREATE TABLE Tmp_TS_NOTIFICATIONEVENTS 
    (TS_ID int NOT NULL GENERATED ALWAYS AS IDENTITY. 
    ... 

之前版本12C,Oracle沒有一個IDENTITY數據類型,所以沒有相應的PL/SQL代碼。如果要確保未來所有刀片自動獲得分配一個唯一的值TS_ID你可以這樣做:

1)找出當前使用的最高值:

select max(ts_id) from TS_NOTIFICATIONEVENTS; 

2)創建啓動序列具有比大的值,例如:

create sequence ts_id_seq start with 100000; 

3)創建的觸發來填充從序列列上插入件:

create or replace trigger ts_id_trig 
before insert on TS_NOTIFICATIONEVENTS 
for each row 
begin 
    :new.ts_id := ts_id_seq.nextval; 
    -- or if pre 11G: 
    -- select ts_id_seq.nextval into :new.ts_id from dual; 
end; 
+0

正是我在找的,謝謝。 – folone 2010-01-12 11:58:54