Oracle+mybatis 分号问题 Cause: java.sql.SQLException: ORA-00911: 无效字符

吸尘器 2018-09-19 06:08:22
mybatis 执行一个oracle建表操作

<select id="createTable" parameterType="java.util.Map">
<foreach collection="tableMap" index="key" item="value">
create table "${key}"(
<foreach collection="value" item="fields" separator=",">
<include refid="commonSql"></include>
</foreach>
)
<foreach collection="value" item="fields" separator=",">
<if test="fields.fieldIsAutoIncrement">
;CREATE SEQUENCE "${key}_${fields.fieldName}_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE
</if>
<if test="fields.fieldIsKey">
;ALTER TABLE ${key} ADD CONSTRAINT PK_${key}_${fields.fieldName} PRIMARY KEY ("${fields.fieldName}")
</if>
<if test="fields.fieldIsUnique">
;CREATE UNIQUE INDEX IX_${key}_${fields.fieldName} ON ${key}("${fields.fieldName}")
</if>
</foreach>
</foreach>
</select>


建表的时候要同时建序列,主键,唯一键。
多个操作用分号分隔执行,会报错
nested exception is java.sql.SQLException: ORA-00911: 无效字符

去掉分号的话,又报错
Caused by: java.sql.SQLException: ORA-00922: 选项缺失或无效

请问各位大侠有没有办法解决,用什么可以替代分号,或者一句sql可以完成表,主键,序列,唯一键创建
...全文
1088 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
吸尘器 2018-09-20
  • 打赏
  • 举报
回复
问题解决了,可以改个写法

<select id="createTable" parameterType="java.util.Map">
<foreach collection="tableMap" index="key" item="value">
begin
execute immediate
'create table "${key}"(
<foreach collection="value" item="fields" separator=",">
<include refid="commonSql"></include>
</foreach>
)';
<foreach collection="value" item="fields" separator=",">
<if test="fields.fieldIsAutoIncrement">
execute immediate
'CREATE SEQUENCE "${key}_${fields.fieldName}_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE';
</if>
<if test="fields.fieldIsKey">
execute immediate
'ALTER TABLE ${key} ADD CONSTRAINT PK_${key}_${fields.fieldName} PRIMARY KEY ("${fields.fieldName}")';
</if>
<if test="fields.fieldIsUnique">
execute immediate
'CREATE UNIQUE INDEX IX_${key}_${fields.fieldName} ON ${key}("${fields.fieldName}")';
</if>
</foreach>
end;
</foreach>
</select>
吸尘器 2018-09-20
  • 打赏
  • 举报
回复
引用 1 楼 nayi_224 的回复:
记得就是不能写分号。可以试试begin或者直接写存储过程。
试过,begin不行,会报错

PLS-00103: 出现符号 "CREATE"在需要下列之一时:
( begin case declare
   exit for goto if loop mod null pragma raise return select
   update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   continue close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe purge

; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-0655
而且就oracle不能用分号,MySQL和sqlserver都可以用
nayi_224 2018-09-20
  • 打赏
  • 举报
回复
记得就是不能写分号。可以试试begin或者直接写存储过程。
Java分布式中间件大汇聚系列一(SpringBoot+Redis+RabbitMQ+ZooKeeper+Redisson....)” 包含了几大重磅性课程,学员 可以根据自己的喜好 进行学习,一步一个脚印深入巩固SpringBoot知识体系栈、消息中间件RabbitMQ、缓存中间件Redis 综合中间件Redisson 以及 分布式锁(ZooKeeper+Redisson+数据库级别锁...)的实现方式 1、SpringBoot实战知识体系~从菜鸟到小牛 本课程可以让学员一步一个脚印学习当前微服务SpringBoot项目开发涉及的相关技术要点,包括项目多模块搭建,通用上传文件服务,通用发送邮件服务,Redis,RabbitMQ等的学习掌握 2、SpringBoot2.0缓存中间件Redis技术入门与典型应用场景 这是一门关于目前相当流行的分布式缓存中间件Redis相关技术栈的介绍与实战,目的在于带领各位小伙伴一起学习、攻克Redis,更好地巩固自己的核心竞争力;值得介绍的是,本课程在技术层面涵盖了中间件Redis的相关技术栈,比如数据结构String、List、Set、SortedSet以及Hash等等,除此之外,在设计并实战“抢红包系统”以及实战各种数据结构对应的应用场景期间,也使用了微服务、分布式相关的技术。包括SpringBoot2.x、Mybatis、热部署工具、二倍均值法、多线程并发编程、发送邮件等等 3、RabbitMQ实战视频教程 本课程可以让学员零基础从官网的权威技术开发手册入手,学习掌握消息中间件RabbitMQ的各大专用词汇,之后会着重基于SpringBoot搭建的微服务项目实战RabbitMQ的各大知识要点,包括各大消息模型,异步解耦,异步通信发送邮件,业务服务模块解耦,死信队列实战以及死信队列实际业务场景实战等等 4、中间件Redisson实战视频教程,则是介绍redisson相关的核心技术栈及其典型的应用场景,其中的应用场景就包括布隆过滤器、限流器、短信发送、实时/定时邮件发送、数据字典、分布式服务调度等等,在业界号称是在java项目里正确使用redis的姿势! 5、分布式锁实战视频教程 本课程将更深入的实战当前分布式系统、微服务架构下“高并发多线程访问共享资源”时如何实现分布式锁,控制对于共享资源的访问,其中涉及到的相关技术主要是各种分布式中间件:Redis、Zookeeper、Redisson等,还有数据库级别的乐观悲观锁实战,最后还实战了两大常见的业务场景: (1)重复提交 (2)抢单系统如CRM系统销售人员抢单场景 (可以自行扩充到 “抢微信红包”、“商城系统抢单”、“美团骑手、滴滴司机、货拉拉司机抢单”等业务场景!!!) 相信学习了这套视频教程之后,将会更加深入的巩固各位学员的微服务以及分布式知识体系!!!

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧