HSQLDB 2.4.0 是否支持触发器过程

Is trigger procedure supported in HSQLDB 2.4.0

我在测试上下文中使用带有 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 是否不支持触发程序。

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 触发器语法非常相似。

数据库方言通常无助于执行跨数据库 PL/SQL 操作。

这一点你要牢记在心。

无论何时需要执行任何特定于数据库的功能,都不​​应依赖任何数据库方言,而应使用本机查询。

同时为您要在应用程序中使用的每个数据库维护不同的本机查询。