在内存DB中为H2创建表的问题

时间:2016-04-21 16:55:22

标签: oracle plsql oracle-sqldeveloper h2 oracle12c

我似乎无法找到合适的组合来实现这一目标。我已经使用Quick DDL和get_ddl函数以及编写自己的SQL从Oracle QL开发人员生成了DDL。所有在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:

1 个答案:

答案 0 :(得分:4)

从研究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数据库。

对于VARCHAR2(50 BYTE)长度,H2也没有 您只需使用VARCHAR( 50 )或超过50,请参阅此链接:
http://www.h2database.com/html/datatypes.html#varchar_type