Java Spring Boot schema.sql,使用PL/sql初始化数据库

Java Spring Boot schema.sql,使用PL/sql初始化数据库,java,oracle,spring-boot,plsql,oracle12c,Java,Oracle,Spring Boot,Plsql,Oracle12c,我正在从事一个项目,我必须使用Oracle Database 12c,并且必须手动编写所有查询(因此我不能使用Spring数据)。 对于创建所有表和关系,我使用schema.sql,对于模板数据,我使用data.sql 我在检查表或数据是否已经存在时遇到问题。 在MySQL中,创建表类似于“如果不存在,则创建表”。 不幸的是,在PL/SQL中,“if not exists”没有等价物。我将此功能替换为: begin execute immediate 'CREATE TABLE user_dat

我正在从事一个项目,我必须使用Oracle Database 12c,并且必须手动编写所有查询(因此我不能使用Spring数据)。 对于创建所有表和关系,我使用schema.sql,对于模板数据,我使用data.sql

我在检查表或数据是否已经存在时遇到问题。 在MySQL中,创建表类似于“如果不存在,则创建表”。 不幸的是,在PL/SQL中,“if not exists”没有等价物。我将此功能替换为:

begin
execute immediate
'CREATE TABLE user_data (
  some data
)';
exception when others then if SQLCODE = -955 then null; else raise; end if;
end;
当我在SQL Developer或Intellij的SQL控制台中运行此脚本时,它会工作,但当我想运行应用程序,而Spring Boot试图从schema.SQL执行脚本时,就会出现问题

终端中的输出表明:

nested exception is java.sql.SQLException: ORA-06550: line 8, column 4:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

* & = - + ; < / > at in is mod remainder not rem return
returning <an exponent (**)> <> or != or ~= >= <= <> and or
like like2 like4 likec between into using || multiset bulk
member submultiset
嵌套异常是java.sql.SQLException:ORA-06550:第8行第4列:
PLS-00103:在预期以下情况时遇到符号“文件结束”:
* & = - + ; < / > at in是mod余数而非rem返回

返回或返回!=或者~=>=首先,我想分享两个似乎与此问题相关的主题:

在那里,您将找到一个可行的解决方案:创建一个存储过程,并在
模式中使用

call recreate_table('USER_DATA','CREATE TABLE USER_DATA (SOME DATA)');  
CALL
语句在不同的数据库中被广泛使用,被缩短为只有一个分号的语句,因此工作良好

其次,我只能假设,主要问题是PL/SQL中的匿名块(以及其他可能包含多个分号的足够复杂的语句)应该由
/
字符完成。我建议您尝试将此字符附加到脚本的末尾,查看并回答,如果不起作用,请创建一个存储过程

还请注意,还有另一种方法可以检查表的存在性(通过此等待异常模式):

选择计数(*)
从用户表t
其中t.table_name='USER_DATA'
和rownum<2

查看Liquidbase或Flyway。有专门用于创建表用户数据的库(一些数据
它应该有一些列,而不是一些data@pvpkiran,不幸的是,我不能使用像Liquidbase或Flyway这样的库…@XING这只是一个例子。在我的应用程序中,我有一些列,但没有必要在这里显示它们,因为问题与它们无关。谢谢,创建过程帮助了我。但我必须创建一个SQL Developer中的过程,因为当我在schema.SQL中运行“创建或替换过程”时,会出现完全相同的问题。Spring不知道应该在“创建或替换”和“/”之间运行脚本。它在第一个分号后停止。因此,在运行应用程序之前,我必须在每个环境中的DB中创建一个过程,我想我必须创建其他过程来创建表之间的关系。不过,感谢您的帮助。我想将您的答案标记为有用,但我没有信誉点。您是否尝试过使用
spring.datasource.separator
参数是否为y?似乎它在某些情况下有效:是的,我尝试使用不同的分隔符,但出现了一些错误。我将使用存储过程。
select count(*)
  from user_tables t
 where t.table_name = 'USER_DATA'
   and rownum < 2