我在测试环境中使用带有HSQLDB 2.4.0的postgresql方言。 我也在使用trigger procedure
当我将第一个SQL脚本加载到HSQLDB时:
SET DATABASE SQL SYNTAX PGS TRUE;
CREATE FUNCTION trigg_proc() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO test(desc)
VALUES('hello world');
RETURN NEW;
END;
$$;
CREATE TABLE test(
desc CHARACTER VARYING(60) NOT NULL
);
我从HSQLDB
中收到此错误...
Caused by: java.sql.SQLSyntaxErrorException: unexpected token: TRIGGER
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:473)
... 58 more
Caused by: org.hsqldb.HsqlException: unexpected token: TRIGGER
at org.hsqldb.error.Error.parseError(Unknown Source)
at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
at org.hsqldb.ParserBase.checkIsNonCoreReservedIdentifier(Unknown Source)
at org.hsqldb.ParserDQL.checkIsSchemaObjectName(Unknown Source)
at org.hsqldb.ParserDQL.readTypeDefinition(Unknown Source)
at org.hsqldb.ParserRoutine.readProcedureOrFunctionDeclaration(Unknown Source)
at org.hsqldb.ParserRoutine.readCreateProcedureOrFunction(Unknown Source)
at org.hsqldb.ParserRoutine.compileCreateProcedureOrFunction(Unknown Source)
at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
at org.hsqldb.Session.executeDirectStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 61 more
我想知道我是否遗漏了有关配置或HSQLDB不支持触发程序的内容。
答案 0 :(得分:0)
postgres和HSQLDB中的触发器语法不兼容。
例如,如果您需要在HSQLDB中创建触发器,则将其编写为如下所示
CREATE TRIGGER my_table_trigger
BEFORE INSERT ON my_table REFERENCING NEW ROW AS NEW
FOR EACH ROW
BEGIN ATOMIC
BEGIN ATOMIC
IF NEW.id IS NULL THEN
SELECT my_table_seq.NEXTVAL INTO NEW.id FROM DUAL;
END IF;
END;
END
这与Oracle触发器语法非常相似。
数据库方言通常无助于执行跨DB PL / SQL操作。
你应该牢记这一点。
只要您需要执行任何数据库特定功能,您就不应该依赖任何数据库方言,而是使用本机查询。
还要为要在应用程序中使用的每个数据库维护不同的本机查询。