DB Trigger兼容Oracle和HSQLDB

时间:2016-02-17 15:04:59

标签: oracle syntax compatibility hsqldb database-trigger

我正在编写使用HSQLDB的集成测试,而在生产中,应用程序使用Oracle DB。在Oracle上,我有一个触发器,如果​​特定表的主键为空,则使用序列中的下一个值填充它。我需要这个触发器在HSQLDB中工作,但我似乎找到了一种方法来使脚本适用于两个DB;以下是Oracle SQL Dev Studio生成的触发器:

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上工作?

2 个答案:

答案 0 :(得分:0)

我在HSQL trigger syntax注意到的一件事是他们的行引用(旧的和新的)不像Oracle那样以冒号为前缀。我无法访问HSQL数据库以测试项目,例如它是否接受&#34;引用新的AS:new&#34;,但无论如何都不能与Oracle兼容,所以没有任何帮助。

同样,默认序列访问也似乎不同:

INSERT INTO childtable VALUES 4, CURRENT VALUE FOR mysequence

所以问题是Oracle兼容模式的兼容性如何。这是否意味着存储代码语法的兼容性?或只是语句的兼容性? The guide does not give me optimism:

  

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

不是&#34;可能需要&#34;。 &#34;是必需的&#34;。坦率地说,我认为你可能正在尝试一些不可能成功结束的事情。

答案 1 :(得分: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