Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
H2和Oracle兼容性问题_Oracle_Maven 3_H2_Flyway - Fatal编程技术网

H2和Oracle兼容性问题

H2和Oracle兼容性问题,oracle,maven-3,h2,flyway,Oracle,Maven 3,H2,Flyway,我在使用Flyway和H2数据库执行以下脚本时遇到问题。我假设这是一个Oracle兼容性问题,但我使用的H2模式是正确的。此脚本用于在生产环境中构造表,但我想使用内存中的数据库进行测试。设置和错误如下。如果可能的话,我不想重写内存中数据库的脚本 Jdbc.properties jdbc.driver=org.h2.Driver jdbc.url=jdbc:h2:file:target/firmsoftDB;MODE=Oracle jdbc.username=sa jdbc.password=

我在使用Flyway和H2数据库执行以下脚本时遇到问题。我假设这是一个Oracle兼容性问题,但我使用的H2模式是正确的。此脚本用于在生产环境中构造表,但我想使用内存中的数据库进行测试。设置和错误如下。如果可能的话,我不想重写内存中数据库的脚本

Jdbc.properties

jdbc.driver=org.h2.Driver
jdbc.url=jdbc:h2:file:target/firmsoftDB;MODE=Oracle
jdbc.username=sa
jdbc.password=
Sql脚本

CREATE TABLE USER_INFO
(
  USER_INFO_ID      NUMBER                      NOT NULL,
  USER_NAME         VARCHAR2(32 BYTE)           NOT NULL,
  EMAIL             VARCHAR2(320 BYTE)              NULL,
  LAST_NAME         VARCHAR2(32 BYTE)           NOT NULL,
  FIRST_NAME        VARCHAR2(32 BYTE)           NOT NULL,
  LAST_LOGIN        TIMESTAMP(6)                    NULL,
  USER_TYPE         VARCHAR2(32 BYTE)               NULL,
  USER_CN           VARCHAR2(32 BYTE)               NULL,
  SOURCE_DIRECTORY  VARCHAR2(15 BYTE)               NULL,
  PRIMARY_PHONE     VARCHAR2(32 BYTE)               NULL,
  ALT_PHONE         VARCHAR2(32 BYTE)               NULL,
  CREATED_BY        NUMBER                      NOT NULL,
  CREATED_DATE      TIMESTAMP(6)                NOT NULL,
  UPDATED_BY        NUMBER                      NOT NULL,
  UPDATED_DATE      TIMESTAMP(6)                NOT NULL
)
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;
pom.xml

<profiles>
    <profile>
        <id>h2-test</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <systemPropertyVariables>
                            <flyway.locations>db/migration</flyway.locations>
                        </systemPropertyVariables>
                        <threadCount>1</threadCount>
                    </configuration>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <executions>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>com.googlecode.flyway</groupId>
                    <artifactId>flyway-maven-plugin</artifactId>
                    <version>2.2.1</version>
                    <configuration>
                        <!-- <url>jdbc:hsqldb:file:target/firmsoftDB;sql.syntax_ora=true</url> -->
                        <!-- <url>jdbc:hsqldb:mem:firmsoftDB;sql.syntax_ora=true</url> -->
                        <url>jdbc:h2:file:target/firmsoftDB;MODE=Oracle</url>
                        <!-- <url>jdbc:derby:\temp\db\FAQ\db</url> -->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
简短回答 Oracle是一个庞大的软件,你不能期望一个小型嵌入式数据库100%兼容

长话短说 兼容模式

如文件所述。然而,只有一小部分数据库之间的差异是以这种方式实现的。此列表已记录在案

兼容性

如文档所示,如HSQLDB、MySQL和PostgreSQL。存在H2不兼容的某些区域


所有数据库引擎的行为都略有不同。在可能的情况下,H2支持ANSI SQL标准,并尝试与其他数据库兼容。但是仍然存在差异。

H2无法识别语法

VARCHAR2(32 BYTE)  
将此更改为

VARCHAR2(32)

。。。它仍然可以在oracle中工作,并且至少可以删除H2中的第一个错误。

您真的需要将varchar2作为字节吗?您可以这样指定大小:
USER\u NAME VARCHAR2(32)
试试看。对于其他列也是如此。此模式的当前形式是当前正在使用的模式,我不想更改此模式。我想让我在测试中使用的模式反映生产中的模式。你能把所有的stacktrace都放进去吗?另外,根据oracle docs.added stacktrace,监视是不推荐的。我想我刚刚在H2和HSQLDB中遇到了一个限制,如果我用VARCHAR2替换VARCHAR并删除以下关键字LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING Small catch,它确实有效:如果您没有明确指定字节或字符,Oracles解释将取决于NLS_LENGTH_语义的设置,默认情况下,NLS_LENGTH_语义是字节,以便向后兼容,但DBA也可以将其设置为CHAR,因为在处理字符串时,后一种设置更有意义。
VARCHAR2(32 BYTE)  
VARCHAR2(32)