在内存数据库中的 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
我似乎无法找到使它起作用的正确组合。我已经使用 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