代码之家  ›  专栏  ›  技术社区  ›  George

T-SQL到PL/SQL(标识)

  •  0
  • George  · 技术社区  · 15 年前

    我有一个 T-SQL 脚本,将字段转换为标识(以一种奇怪的方式)。

    我怎么把它转换成 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 回复  |  直到 9 年前
        1
  •  4
  •   Tony Andrews    9 年前

    从12C版开始,Oracle支持标识数据类型,例如:

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

    在12C版本之前,Oracle没有标识数据类型,因此没有对应的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;