我希望單個表中的不同值對應不同的列值(esercizio)。單個表上的oracle多重序列
我這樣做,但不是動態創建和使用序列。 如何抽象出問題?
CREATE TABLE Z_TEST ( ID NUMBER, ESERCIZIO NUMBER, DESCRIZIONE VARCHAR2 (200 BYTE) ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING; ALTER TABLE Z_TEST ADD ( CONSTRAINT Z_TEST_PK PRIMARY KEY (ID, ESERCIZIO)); CREATE SEQUENCE Z_TEST_SEQ_2010 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2011 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2012 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2013 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2014 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2015 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE OR REPLACE TRIGGER Z_TEST_TRG BEFORE INSERT ON Z_TEST REFERENCING new AS New old AS Old FOR EACH ROW DECLARE err_code NUMBER; err_msg VARCHAR2 (200); BEGIN if :new.esercizio = 2010 then select Z_TEST_SEQ_2010.nextval into :new.ID from dual; end if; if :new.esercizio = 2011 then select Z_TEST_SEQ_2011.nextval into :new.ID from dual; end if; if :new.esercizio = 2012 then select Z_TEST_SEQ_2012.nextval into :new.ID from dual; end if; if :new.esercizio = 2013 then select Z_TEST_SEQ_2013.nextval into :new.ID from dual; end if; if :new.esercizio = 2014 then select Z_TEST_SEQ_2014.nextval into :new.ID from dual; end if; if :new.esercizio = 2015 then select Z_TEST_SEQ_2015.nextval into :new.ID from dual; end if; EXCEPTION WHEN OTHERS THEN err_msg := SUBSTR (SQLERRM, 1, 200); err_code := SQLCODE; DBMS_OUTPUT.put_line ('errore: ' || err_code || ' ' || err_msg); END; /
你是什麼意思?你想避免在2016年獲得記錄之前手動創建新序列並更改觸發器,請說?爲什麼ID需要根據該值而不同 - 這意味着ID本身並不是唯一的,所以它不能作爲主鍵,所以它是什麼,以及爲什麼不能使用單個序列來填充柱? –
我有許多舊數據庫訪問誰擁有自己的自動編號,表引用其他,但我有1年的數據庫。 – Albo
我認爲你的兩部分主鍵應該是'ESERCIZIO,ID'而不是'ID,ESERCIZIO'。然後,如果您不關心序列中的空位,則可以爲'ID'的所有值使用相同的序列。你有什麼理由不能有差距嗎? – Glenn