2010-01-12 6 views
0

J'ai un script T-SQL, qui convertit le champ en IDENTITY (d'une manière bizarre). Comment le convertir en PL/SQL? (et, probablement, comprendre, s'il y a une manière plus simple de faire ceci - sans créer une table temporaire).T-SQL à PL/SQL (IDENTITY)

Le script 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 

Répondre

4

partir de la version 12C, Oracle prend en charge l'IDENTITÉ type de données, par exemple:

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

Avant la version 12C, Oracle n'a pas d'identité type de données , donc il n'y a pas de code PL/SQL équivalent pour cela. Si vous voulez vous assurer que toutes les insertions futures s'affectés automatiquement une valeur unique pour TS_ID vous pouvez le faire:

1) Découvrez la valeur la plus élevée actuellement utilisée:

select max(ts_id) from TS_NOTIFICATIONEVENTS; 

2) Créer une séquence qui commence avec une valeur plus élevée que celle, par exemple:

create sequence ts_id_seq start with 100000; 

3) Créer un déclencheur pour remplir la colonne à partir de la séquence sur insert:

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

Exactement ce que je cherchais, merci. – folone