【发布时间】:2016-08-10 22:03:11
【问题描述】:
我需要有关 DROP/CREATE 在我的 schema.sql 中的表的帮助
设置:
- Oracle XE
- Spring Boot v1.4.0
- Java 1.8
当我在 schema.sql 中有以下条目时:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100));
我得到了异常
DROP TABLE table_a; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
当我查找有关如何在 Oracle 中执行 DROP TABLE IF EXISTS 的帮助时,我得到的最佳答案如下(在 SQLDeveloper 中工作):
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE table_a';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
EXECUTE IMMEDIATE 'CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
)';
END;
但是,上面的代码抛出了以下异常:
2016-08-10 14:55:36.232 INFO 9032 --- [main] o.s.jdbc.datasource.init.ScriptUtils:从 URL [file:/C:/projects/project_a/target/classes/ 执行 SQL 脚本架构.sql] 2016-08-10 14:55:36.286 WARN 9032 --- [main] o.s.w.c.s.GenericWebApplicationContext:上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework”的bean时出错.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration':自动装配依赖注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class] 中定义名称为“dataSource”的 bean 创建错误:bean 初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“dataSourceInitializer”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.springframework.jdbc.datasource.init.ScriptStatementFailedException: 未能执行 SQL 脚本语句 #1 of URL [file:/C:/projects/project_a/target/classes/schema.sql]: BEGIN EXECUTE IMMEDIATE 'DROP表表_a';嵌套异常是 java.sql.SQLException: ORA-06550: 第 1 行,第 44 列: PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:
- & = - + ; > at in 是 mod 余数不是 rem 返回 返回 或 != 或 ~= >= 和 or like like2 like4 likec 之间进入使用 ||多组批量 成员子集
有人有更优雅的方式来处理 Spring Boot 中 Oracle 表的 DROP/CREATE 吗?
【问题讨论】:
-
不确定这是否完全符合您的要求;表的创建在异常处理程序中 - 所以如果表确实存在,它将被删除而不是重新创建。无论如何,您的框架将前两行(直到第一个分号)视为独立语句 - 显然,它不知道整个事情是一个 PL/SQL 块。你能改变语句分隔符吗?
-
@mathguy - 问题不在于如何在 PL/SQL 中删除和创建表(这里似乎来自模式创建脚本,因此在运行时创建表警告并不真正适用),但是如何从 Spring Boot 调用 PL/SQL 块?
-
我用一个长句替换-> "BEGIN EXECUTE IMMEDIATE 'DROP TABLE table_a'; 其他情况下除外 SQLCODE != -942 THEN RAISE; END IF; EXECUTE IMMEDIATE 'CREATE TABLE table_a (id VARCHAR(5) 主键,名称 VARCHAR(100))'; END;"。但是,我仍然得到相同的异常。
-
在这种情况下不需要使用动态 SQL 运行 CREATE TABLE,因为它是静态的。只用异常处理程序包装 DROP TABLE。
标签: oracle spring-boot database-schema