ORA-00922:通过liquibase读取sql文件时缺少或无效的选项

时间:2018-08-21 21:03:56

标签: sql oracle liquibase ddl

我遇到了liquibase解析sql文件的问题。看起来它无法识别';'作为分隔符。如果我只保留一个陈述而没有';'最后,它运行良好,但是显然我需要执行完整的命令集。 我的sql看起来像这样:

CREATE TABLE network_area (
     network_area_id   NUMBER(18) NOT NULL,
     name              VARCHAR2(30 CHAR) NOT NULL );

ALTER TABLE network_area ADD CONSTRAINT network_area_pk PRIMARY KEY (network_area_id );

ALTER TABLE network_area ADD CONSTRAINT network_area__un UNIQUE ( name );

我的liquibase插件看起来像这样:

        <plugin>
           <groupId>org.liquibase</groupId>
           <artifactId>liquibase-maven-plugin</artifactId>
           <version>3.6.2</version>
           <configuration>                  
              <propertyFile>src/test/resources/liquibase/liquibase.properties</propertyFile>
              <changeLogFile>src/test/resources/liquibase/ddl/my-ddl.sql</changeLogFile>
              <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>              
           </configuration>                
           <executions>
             <execution>
               <phase>test</phase>                                                                  
               <goals>
                 <goal>update</goal>
               </goals>
             </execution>
           </executions>
        </plugin> 

我得到的错误是:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00922: missing or invalid option
Caused by: Error : 922, Position : 121, Sql = CREATE TABLE network_area (
network_area_id   NUMBER(18) NOT NULL,
name              VARCHAR2(30 CHAR) NOT NULL
);

2 个答案:

答案 0 :(得分:0)

尝试像这样在splitStatements标签中添加<sql>

<sql 
endDelimiter=";"
splitStatements="true"
stripComments="true">

CREATE TABLE network_area (
 network_area_id   NUMBER(18) NOT NULL,
 name              VARCHAR2(30 CHAR) NOT NULL );

</sql>
<sql 
endDelimiter=";"
splitStatements="true"
stripComments="true">

ALTER TABLE network_area ADD CONSTRAINT network_area_pk PRIMARY KEY (network_area_id );

</sql>
<sql 
endDelimiter=";"
splitStatements="true"
stripComments="true">

ALTER TABLE network_area ADD CONSTRAINT network_area__un UNIQUE ( name );
</sql>

答案 1 :(得分:0)

我最终选择了替代方法,设置了flywaydb。这是我的配置示例,适用于任何认为有用的人:

            <plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <configuration>
                <configFile>src/test/resources/flyway/flyway.properties</configFile>
                <locations>
                    <location>filesystem:src/test/resources/flyway/migration</location>
                    <location>filesystem:src/test/resources/flyway/dataload</location>
                </locations>                
            </configuration>
            <dependencies>
                <dependency>
                  <groupId>com.oracle.ojdbc</groupId>
                  <artifactId>ojdbc8</artifactId>
                  <version>12.2.0.1.p27350958</version>
                </dependency>
            </dependencies>
           <executions>
             <execution>
                <goals>
                    <goal>clean</goal>
                    <goal>migrate</goal>
                </goals>
               <phase>test</phase>                                                                
             </execution>
           </executions>                
        </plugin>