From 85bd60c92dc3e44dfbb4832ce12d36ba3398ae30 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Wed, 8 Aug 2012 12:29:45 -0500 Subject: [PATCH] Oracle: new trigger resets the sequence so the next value will be the one given in the data, thanks dhx --- VERSION | 2 +- gluon/dal.py | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 320186f1..0d50f8ec 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.00.0 (2012-08-08 12:17:50) dev +Version 2.00.0 (2012-08-08 12:29:42) dev diff --git a/gluon/dal.py b/gluon/dal.py index 63e611e5..b8d265f3 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -2691,8 +2691,26 @@ class OracleAdapter(BaseAdapter): sequence_name = table._sequence_name trigger_name = table._trigger_name self.execute(query) - self.execute('CREATE SEQUENCE %s START WITH 1 INCREMENT BY 1 NOMAXVALUE;' % sequence_name) - self.execute('CREATE OR REPLACE TRIGGER %s BEFORE INSERT ON %s FOR EACH ROW BEGIN SELECT %s.nextval INTO :NEW.id FROM DUAL; END;\n' % (trigger_name, tablename, sequence_name)) + self.execute('CREATE SEQUENCE %s START WITH 1 INCREMENT BY 1 NOMAXVALUE MINVALUE -1;' % sequence_name) + self.execute(""" + CREATE OR REPLACE TRIGGER %(trigger_name)s BEFORE INSERT ON %(tablename)s FOR EACH ROW + DECLARE + curr_val NUMBER; + diff_val NUMBER; + PRAGMA autonomous_transaction; + BEGIN + IF :NEW.id IS NOT NULL THEN + EXECUTE IMMEDIATE 'SELECT %(sequence_name)s.nextval FROM dual' INTO curr_val; + diff_val := :NEW.id - curr_val - 1; + IF diff_val != 0 THEN + EXECUTE IMMEDIATE 'alter sequence %(sequence_name)s increment by '|| diff_val; + EXECUTE IMMEDIATE 'SELECT %(sequence_name)s.nextval FROM dual' INTO curr_val; + EXECUTE IMMEDIATE 'alter sequence %(sequence_name)s increment by 1'; + END IF; + END IF; + SELECT %(sequence_name)s.nextval INTO :NEW.id FROM DUAL; + END; + """ % dict(trigger_name=trigger_name, tablename=tablename, sequence_name=sequence_name)) def lastrowid(self,table): sequence_name = table._sequence_name