我的项目中有一个要求,我想将文件读取到表CLOB数据中。该数据库是oracle 12g。我们正在使用liquibase维护数据。 该项目在springboot中。 Liquibase使用.sql文件来加载更改。
我面临的障碍是sql需要文件的绝对路径,而不是相对于当前变更集文件的路径。
关于如何使用“。”的任何指针。或变更集的sql中的“ classpath:”?
我尝试过的尝试之一是通过属性标签以及databaseChangeLog标签在变更集中发送属性。这些属性的值在changeset文件中可用,但它们不解释占位符,例如“ classpath:”。因此,我被困住了。
的
dbms_lob.fileopen
仅接受具有绝对路径的目录对象。不“。”等被理解。的。在文件路径中,从数据库安装根目录开始,这对我没有用。我想要存储所有变更集文件的路径。
如果您以任何方式解决了此问题,请提供帮助。
如果需要,我将发布更多详细信息。 感谢帮助。
答案 0 :(得分:1)
例如,对我有用的示例:我将此参数放在命令行上作为主变更日志的参考
--changeLogFile=src/main/resources/changelog/db.changelog-master.xml
和主文件中
<include file="./changes/db.changelog-ddl-.....xml" relativeToChangelogFile="true"/>
changeset中的sql文件将是相同的-它们将相对于.xml进行引用
答案 1 :(得分:1)
如何预先在oracle中设置目录对象,然后在操作系统级别使用符号链接。根据您的确切要求,您可以在目录级别使用符号链接,或者甚至可以将文件直接链接到oracle目录,以便Oracle可以一次在目录对象中查看来自许多不同目录的文件。然后,它们需要具有不同的文件名。我没有尝试过这个想法,但是我想这种方法是我首先会尝试的方法。 HTH KR
答案 2 :(得分:1)
Liquibase支持更改日志中的属性,该属性可以通过多种方式设置-更多信息: http://www.liquibase.org/documentation/changelog_parameters.html
以下是该文档的摘要:
Liquibase允许在变更日志中动态替换参数。 使用$ {}语法描述要替换的参数。
按以下顺序查找参数值:
- 作为参数传递给您的Liquibase运行程序(有关如何传递它们的信息,请参阅Ant,command_line等文档)
- 作为JVM系统属性 在DatabaseChangeLog文件本身的参数块(标记)中。
如何使用示例:
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<property name="clob.type" value="clob" dbms="oracle"/>
<property name="clob.type" value="longtext" dbms="mysql"/>
<changeSet id="1" author="joe">
<createTable tableName="table1">
<column name="id" type="int"/>
<column name="${columnname}" type="varchar(20)"/>
</createTable>
</changeSet>
您可以轻松地通过一个属性在SQL更改集中设置文件路径,同时通过JVM或构建工具传递属性值。
@echo off
call Liquibase --changeLogFile=myChangeLogFile.xml update -Dcolumnname=myclm
但是我认为您可以使用${java.class.path}
而无需从外部设置它的值。