在内存数据库中的 H2 上为 Oracle 创建表时出现问题

Problems creating tables for Oracle on H2 in memory DB

我似乎无法找到使它起作用的正确组合。我已经使用 Quick DDL 和 get_ddl 函数从 Oracle QL 开发人员生成了 DDL,并编写了我自己的 SQL。在 SQL Plus 和 SQL Developer 中一切正常,但我不知道如何让 H2 接受 SQL.

我尝试了不同的变体,省略了架构名称等。似乎没有任何效果。

SQL:

CREATE TABLE TEST_SCHEMA.SAVED_SEARCHES(
    SEARCHID INT GENERATED ALWAYS AS IDENTITY AUTO_INCREMENT BY 1 START WITH 1 NOT NULL, 
    NAME VARCHAR2(30) NOT NULL,
    USERID VARCHAR2(32 BYTE), 
    WORKGROUPID VARCHAR2(50 BYTE), 
    ONECLICK VARCHAR2(1 BYTE) NOT NULL
)

连接属性:

<Context reloadable="true" crossContext="true">
    <Resource 
        name="jdbc/cts" 
        auth="Container" 
        type="javax.sql.DataSource" 
        removeAbandoned="true" 
        removeAbandonedTimeout="30" 
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000" 
        username="test_schema"  
        password="oracle" 
        driverClassName="com.test.h2.H2Driver" 
        url="jdbc:testh2:mem:testdb;MODE=Oracle;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS TEST_SCHEMA\;SET SCHEMA TEST_SCHEMA" 
        validationQuery="SELECT 1 FROM DUAL" 
    />
</Context>

错误:

Syntax error in SQL statement: expected "(, NOT, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, ,, )"; SQL statement:

从研究H2数据库中CREATE TABLE语句的一个语法开始:
http://www.h2database.com/html/grammar.html#create_table
简化的语法是:

CREATE TABLE name (
  columnDefinition,
  columnDefinition,
  ....
);

其中 columnDefinition 是:
http://www.h2database.com/html/grammar.html#column_definition

columnName dataType [ AUTO_INCREMENT | IDENTITY [ (startInt [,incrementInt ] ) ]]

其中 [] 括号内的元素是可选的

如您所见 Oracle 的语法:

columnName dataType GENERATED ALWAYS AS IDENTITY AUTO_INCREMENT BY 1 START WITH 1

与H2的语法完全不同:

columnName dataType IDENTITY  (1,1)

您需要手动重写CREATE TABLE语句以适应H2数据库。


此外,H2 不允许 VARCHAR2(50 BYTE) 长度
您只需要使用 VARCHAR( 50 ) 或超过 50 个,请参阅此 link:
http://www.h2database.com/html/datatypes.html#varchar_type