1

我正在编写使用 HSQLDB 的集成测试,而在生产中应用程序使用 Oracle DB。在 Oracle 上,我有一个触发器,如果​​特定表的主键为空,则使用序列中的下一个值填充它。我需要这个触发器才能在 HSQLDB 中工作,但我似乎可以找到一种方法让脚本对两个数据库都有效;下面是 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;

任何想法如何修改触发器以在两个数据库上工作?

4

2 回答 2

0

我在HSQL 触发器语法上注意到的一件事是,它们的行引用(旧的和新的)不像 Oracle 那样以冒号为前缀。我无权访问 HSQL DB 来测试项目,例如它是否会接受“REFERENCING NEW AS :new”,但这无论如何都与 Oracle 不兼容,所以没有任何帮助。

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

INSERT INTO childtable VALUES 4, CURRENT VALUE FOR mysequence

所以问题是Oracle兼容模式的兼容性如何。这是否意味着存储代码语法的兼容性?或者只是声明的兼容性?该指南并没有给我乐观:

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

不是“可能需要”。“是必须的”。坦率地说,我认为您可能正在尝试一些不太可能以成功告终的事情。

于 2016-02-17T15:28:50.017 回答
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

于 2016-02-17T19:12:04.660 回答