T-SQL в PL / SQL (IDENTITY) - PullRequest
       42

T-SQL в PL / SQL (IDENTITY)

0 голосов
/ 12 января 2010

У меня есть T-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

1 Ответ

4 голосов
/ 12 января 2010

Начиная с версии 12C, Oracle поддерживает тип данных IDENTITY, например ::10000

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...