Skip to content

Commit 57a67cd

Browse files
atiertantelhigu
authored andcommitted
Fix #906 Oracle auto increment manual insert id (#1526)
* Oracle sequence trigger handle manual id inserts * Update schema tests
1 parent dc37494 commit 57a67cd

3 files changed

Lines changed: 17 additions & 9 deletions

File tree

src/dialects/oracle/schema/columncompiler.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,17 @@ assign(ColumnCompiler_Oracle.prototype, {
3131
const createTriggerSQL =
3232
`create or replace trigger ${triggerName} before insert on ${tableName}` +
3333
` for each row` +
34-
` when (new.${columnName} is null) ` +
34+
` declare` +
35+
` checking number := 1;` +
3536
` begin` +
37+
` if (:new.${columnName} is null) then` +
38+
` while checking >= 1` +
39+
` loop` +
3640
` select ${sequenceName}.nextval into :new.${columnName} from dual;` +
41+
` select count(${columnName}) into checking from ${tableName}` +
42+
` where ${columnName} = :new.${columnName};` +
43+
` end loop;` +
44+
` end if;` +
3745
` end;`;
3846
this.pushQuery(utils.wrapSqlWithCatch(`create sequence ${sequenceName}`, -955));
3947
this.pushQuery(createTriggerSQL);

test/unit/schema/oracle.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe("Oracle SchemaBuilder", function() {
1919
equal(3, tableSql.toSQL().length);
2020
expect(tableSql.toSQL()[0].sql).to.equal('create table "users" ("id" integer not null primary key, "email" varchar2(255))');
2121
expect(tableSql.toSQL()[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
22-
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
22+
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
2323
});
2424

2525
it('test basic create table if not exists', function() {
@@ -31,7 +31,7 @@ describe("Oracle SchemaBuilder", function() {
3131
equal(3, tableSql.toSQL().length);
3232
expect(tableSql.toSQL()[0].sql).to.equal("begin execute immediate 'create table \"users\" (\"id\" integer not null primary key, \"email\" varchar2(255))'; exception when others then if sqlcode != -955 then raise; end if; end;");
3333
expect(tableSql.toSQL()[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
34-
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
34+
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
3535
});
3636

3737
it('test drop table', function() {
@@ -209,7 +209,7 @@ describe("Oracle SchemaBuilder", function() {
209209
equal(3, tableSql.length);
210210
expect(tableSql[0].sql).to.equal('alter table "users" add "id" integer not null primary key');
211211
expect(tableSql[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
212-
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
212+
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
213213
});
214214

215215
it('test adding big incrementing id', function() {
@@ -220,7 +220,7 @@ describe("Oracle SchemaBuilder", function() {
220220
equal(3, tableSql.length);
221221
expect(tableSql[0].sql).to.equal('alter table "users" add "id" number(20, 0) not null primary key');
222222
expect(tableSql[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
223-
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
223+
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
224224
});
225225

226226
it('test rename column', function() {

test/unit/schema/oracledb.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe("Oracle SchemaBuilder", function() {
1919
equal(3, tableSql.toSQL().length);
2020
expect(tableSql.toSQL()[0].sql).to.equal('create table "users" ("id" integer not null primary key, "email" varchar2(255))');
2121
expect(tableSql.toSQL()[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
22-
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
22+
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
2323
});
2424

2525
it('test basic create table if not exists', function() {
@@ -31,7 +31,7 @@ describe("Oracle SchemaBuilder", function() {
3131
equal(3, tableSql.toSQL().length);
3232
expect(tableSql.toSQL()[0].sql).to.equal("begin execute immediate 'create table \"users\" (\"id\" integer not null primary key, \"email\" varchar2(255))'; exception when others then if sqlcode != -955 then raise; end if; end;");
3333
expect(tableSql.toSQL()[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
34-
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
34+
expect(tableSql.toSQL()[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
3535
});
3636

3737
it('test drop table', function() {
@@ -209,7 +209,7 @@ describe("Oracle SchemaBuilder", function() {
209209
equal(3, tableSql.length);
210210
expect(tableSql[0].sql).to.equal('alter table "users" add "id" integer not null primary key');
211211
expect(tableSql[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
212-
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
212+
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
213213
});
214214

215215
it('test adding big incrementing id', function() {
@@ -220,7 +220,7 @@ describe("Oracle SchemaBuilder", function() {
220220
equal(3, tableSql.length);
221221
expect(tableSql[0].sql).to.equal('alter table "users" add "id" number(20, 0) not null primary key');
222222
expect(tableSql[1].sql).to.equal("begin execute immediate 'create sequence \"users_seq\"'; exception when others then if sqlcode != -955 then raise; end if; end;");
223-
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row when (new.\"id\" is null) begin select \"users_seq\".nextval into :new.\"id\" from dual; end;");
223+
expect(tableSql[2].sql).to.equal("create or replace trigger \"users_id_trg\" before insert on \"users\" for each row declare checking number := 1; begin if (:new.\"id\" is null) then while checking >= 1 loop select \"users_seq\".nextval into :new.\"id\" from dual; select count(\"id\") into checking from \"users\" where \"id\" = :new.\"id\"; end loop; end if; end;");
224224
});
225225

226226
it('test rename column', function() {

0 commit comments

Comments
 (0)