T-SQL 到 PL/SQL(身份)

发布于 2024-08-18 02:16:36 字数 1876 浏览 4 评论 0原文

我有一个 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

I've got a T-SQL script, that converts field to IDENTITY (in a weird way).

How do I convert it to PL/SQL? (and, probably, figure out, if there is a simpler way to do this - without creating a temporary table).

The T-SQL script:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凑诗 2024-08-25 02:16:36

从版本 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;

From version 12C, Oracle supports the IDENTITY data type e.g.:

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

Prior to version 12C, Oracle doesn't have an IDENTITY data type, so there is no equivalent PL/SQL code for this. If you want to ensure that all future inserts automatically get assigned a unique value for TS_ID you can do this:

1) Find out the highest value currently used:

select max(ts_id) from TS_NOTIFICATIONEVENTS;

2) Create a sequence that starts with a value higher than that, e.g.:

create sequence ts_id_seq start with 100000;

3) Create a trigger to populate the column from the sequence on 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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文