2017-04-18 81 views
0

我在測試上下文中使用帶HSQLDB 2.4.0的postgresql方言。 我還使用一個trigger procedureHSQLDB支持觸發器過程2.4.0

當我我的第一個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 

這個錯誤,我想知道如果我」 m缺少一些關於配置的信息,或者HSQLDB不支持觸發器過程。

+0

觸發器在HSQLDB中有完全不同的語法(並且它不支持PL/pgSQL)。有關詳細信息,請參閱手冊:http://hsqldb.org/doc/2.0/guide/triggers-chapt.html對於少數語法元素,「SYNTAX PGS」只是一個非常「非常薄」的兼容層。它並不會讓HSQLDB像Postgre一樣神奇地工作 –

回答

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操作。

您應該牢記這一點。

無論您需要執行任何數據庫特定功能,您都不應該依賴任何數據庫方言,而應該使用本機查詢。

還爲要在應用程序中使用的每個數據庫維護不同的本機查詢。