2010-01-12 2 views
0

T-SQL 스크립트가있어 필드를 IDENTITY (이상한 방식으로)로 변환합니다.T-SQL to PL/SQL (IDENTITY)

어떻게 변환합니까 PL/SQL? (임시 테이블을 만들지 않고도이를 수행 할 수있는 간단한 방법이 있다면 아마도 알 수있을 것입니다.

T-SQL 스크립트 : 오라클은 IDENTITY 데이터 형식이없는

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

이전 버전 12C에 :

버전 12C에서
-- 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

는, 오라클은 IDENTITY 데이터 형식 등을 지원 , 이에 상응하는 PL/SQL 코드는 없습니다. 시작 시퀀스를 생성)

select max(ts_id) from TS_NOTIFICATIONEVENTS; 

2)

1 현재 사용되는 가장 높은 값을 찾기 : 모든 미래의 삽입이 자동으로이 작업을 수행 할 수 TS_ID에 대한 고유 한 값을 할당받을 수 있도록하려면 보다 높은 값으로 예 :

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; 
,174,515 :

create sequence ts_id_seq start with 100000; 

3)에 삽입 서열로부터 열을 채우는 트리거 만들기

+0

정확히 내가 뭘 찾고 있었는지, 고마워. – folone