我正在编写使用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上工作?
答案 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语法,例如NEXTVAL
和DUAL