2016-02-17 59 views
1

我正在編寫使用HSQLDB的集成測試,而在生產中應用程序使用Oracle數據庫。在Oracle上,我有一個觸發器,如果​​某個特定表的主鍵爲空,則使用序列中的下一個值填充它。我需要這個觸發器在HSQLDB中工作,但我似乎可以找到一種方法來使腳本適用於兩個DB;下面是由Oracle SQL開發Studio生成的觸發:與Oracle和HSQLDB兼容的數據庫觸發器

CREATE OR REPLACE TRIGGER "WFMEXTENSIONS"."WORK_TRG" 
BEFORE INSERT ON WORK 
FOR EACH ROW 
BEGIN 
    <<COLUMN_SEQUENCES>> 
    BEGIN 
    IF INSERTING AND :NEW.WORK_ID IS NULL THEN 
     SELECT WORK_SEQ.NEXTVAL INTO :NEW.WORK_ID FROM SYS.DUAL; 
    END IF; 
    END COLUMN_SEQUENCES; 
END; 
/

HSQL DB在「Oracle兼容性模式」下使用

SET DATABASE SQL SYNTAX ORA TRUE; 

任何想法觸發如何進行修改,以在兩個工作正在運行DB的?

+0

爲什麼不你在兩個數據庫管理系統中使用一個標識列,並完全擺脫觸發器? –

+0

在oracle中,標識列是在v12中添加的,而我正在使用v11(並且它不在我的控制範圍內進行升級) –

+1

然後使用HSQLDB中的標識列並忘記觸發器。 「行爲」將是相同的 –

回答

0

我在HSQL trigger syntax上注意到的一件事是,它們的行引用(舊的和新的)不像Oracle那樣以冒號作爲前綴。我無法訪問HSQL DB來測試項目是否能接受「REFERENCING NEW AS:new」,但這與Oracle無法兼容,因此沒有任何幫助。

同樣,默認順序訪問也似乎有所不同:

INSERT INTO childtable VALUES 4, CURRENT VALUE FOR mysequence 

所以現在的問題是Oracle兼容模式是如何兼容的。這是否意味着存儲代碼語法的兼容性?或者只是語句的兼容性? The guide does not give me optimism:

SQL例程通常是可移植的,但需要進行一些更改。

不是「可能需要」。 「是必要的」。坦率地說,我認爲你可能在嘗試一些不太可能成功的事情。

0

它看起來像這樣HSQLDB

CREATE TRIGGER "WFMEXTENSIONS"."WORK_TRG" 
BEFORE INSERT ON WORK REFERENCING NEW ROW AS NEW 
FOR EACH ROW 
BEGIN ATOMIC 
    BEGIN ATOMIC 
    IF NEW.WORK_ID IS NULL THEN 
     SELECT WORK_SEQ.NEXTVAL INTO NEW.WORK_ID FROM DUAL; 
    END IF; 
    END; 
END 

存儲過程語法是有點不同的Oracle但單個SQL語句可以使用支持的Oracle語法如NEXTVALDUAL

+0

我試着運行此代碼,並且它返回以下錯誤:CREATE TRIGGER WORK_TRG插入工作之前參考新行如同開始每行開始原子開始原子如果NEW.WORK_ID爲NULL,則選擇WORK_SEQ.NEXTVAL INTO NEW.WORK_ID FROM DUAL;意外結束的聲明:要求:;'請任何想法? –

+0

這是您用來輸入腳本的程序。它需要接受分號,而不是在有閱讀時終止閱讀。 – fredt