最近写了特别多的数据库同步接口,需要在java程序中拼接大段的sql,然后再提交执行,出现了很多次ORA-00923错误,都有点见怪不怪了。

比如下面这段代码,在执行 db.execute(insertSql) 时肯定会报这个错误的。

@Override
public int doInsert(DB db,InterfaceLogBean logBean) {StringBuilder insertBuilder = new StringBuilder();insertBuilder.append("INSERT INTO ");insertBuilder.append("MTL_ONHAND_QUANTITIES_DETAIL ");insertBuilder.append("(INVENTORY_ITEM_ID,ITEM_CODE,ORGANIZATION_ID,DATE_RECEIVED,LAST_UPDATE_DATE,LAST_UPDATED_BY,CREATION_DATE,CREATED_BY,");insertBuilder.append("PRIMARY_TRANSACTION_QUANTITY,SUBINVENTORY_CODE,LOT_NUMBER,ONHAND_QUANTITIES_ID,ORGANIZATION_TYPE,");insertBuilder.append(" OWNING_ORGANIZATION_ID,TRANSACTION_UOM_CODE,TRANSACTION_QUANTITY,IS_CONSIGNED)");insertBuilder.append("SELECT INVENTORY_ITEM_ID,ITEM_CODE,84,DATE_RECEIVED,LAST_UPDATE_DATE,LAST_UPDATED_BY,CREATION_DATE,CREATED_BY, "); insertBuilder.append("PRIMARY_TRANSACTION_QUANTITY,SUBINVENTORY_CODE,LOT_NUMBER,ONHAND_QUANTITIES_ID,ORGANIZATION_TYPE,");insertBuilder.append("OWNING_ORGANIZATION_ID,TRANSACTION_UOM_CODE,TRANSACTION_QUANTITY,IS_CONSIGNED");insertBuilder.append("FROM MTL_ONHAND_QUANTITIES_TEMP MOQT ");insertBuilder.append("WHERE 1=1 AND NOT EXISTS(SELECT 1 FROM MTL_ONHAND_QUANTITIES_DETAIL MOQD WHERE 1=1 AND MOQD.ONHAND_QUANTITIES_ID = MOQT.ONHAND_QUANTITIES_ID)");String insertSql = insertBuilder.toString();insertBuilder.delete(0, insertBuilder.length());try {return db.execute(insertSql);} catch (JDBCException e) {e.printStackTrace();logBean.setExceptContent(e.getMessage());return -1;} catch (Exception e) {e.printStackTrace();logBean.setExceptContent(e.getMessage());return -1;}}

你如果有时间的话,可以DEBUG一下,在insertSql执行前这段sql是啥,再复制到plsql中执行一下你就知道问题出在哪儿了。
原因很简单,就是sql在拼接的时候,该有空格或者换行的地方没有,倒数第是哪个append后面需要留一个空格出来,这样后面的IS_CONSIGNED就不会和后面的FROM拼在一起,如果没有这个空格,insertSql中就会出现IS_CONSIGNEDFROM,自然而然找不到FROM关键字了。
还有另一个方法就是在每段待拼接的字符串后面加上"\n"这样拼接的字符串格式就会每段换行。

  • 示例一
 public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("SELECT ID,NAME,AGE");stringBuilder.append("FROM STUDENT");System.out.println(stringBuilder.toString());//输出内容为:SELECT ID,NAME,AGEFROM STUDENT//会报错ORA-00923}
  • 示例二
 public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("SELECT ID,NAME,AGE\n");stringBuilder.append("FROM STUDENT\n");System.out.println(stringBuilder.toString());/**符合要求输出内容为:SELECT ID,NAME,AGEFROM STUDENT      */}
  • 实例三
 public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("SELECT ID,NAME,AGE ");stringBuilder.append("FROM STUDENT");System.out.println(stringBuilder.toString());/**符合要求输出内容为:SELECT ID,NAME,AGE FROM STUDENT*/}

java代码中执行sql报错:java.sql.SQLException: ORA-00923: 未找到要求的 FROM 关键字相关推荐

  1. flink SQL报错java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLj

    问题 flink SQL连接hive以及hudi 报错java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkAr ...

  2. java代码块执行顺序_Java笔记 | Java代码块执行顺序测试

    最近笔试常常遇到考察Java代码块执行顺序的题目,网上查看博客错漏百出,特地自己测试了一下. 如有错漏,希望路过的大佬指出来,以便我进行更改. 先上代码吧! public class ClassA { ...

  3. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  4. 我的Android进阶之旅------gt;Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed....

    今天在调用MediaRecorder.stop(),报错了,java.lang.RuntimeException: stop failed. E/AndroidRuntime(7698): Cause ...

  5. java远程执行命令报错java.io.IOException: Cannot run program “ifconfig“: error=2, No such file or directory

    直接执行ifconfig没问题,但是在java代码里远程执行ifconfig就找不到命令. session = conn.openSession(); session.execCommand(cmd) ...

  6. Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed.

    E/AndroidRuntime(7698): Cause by: java.lang.RuntimeException: stop failed. if (mediarecorder != null ...

  7. (007) java后台开发之Scanner报错java.util.NoSuchElementException

    在测试Scanner 时写了两次 .close(); 结果运行报错. 原因参考:http://www.cnblogs.com/qingyibusi/p/5812725.html 一个方法A使用了Sca ...

  8. java代码中添加事务_C#和JAVA中编写事务代码

    C#  DAL层代码,执行多条增删改,使用事务操作: /// /// 执行 多条增删改 (非查询语句) /// /// /// /// public static int ExcuteNonQuery ...

  9. java f3查看源码报错,Java学习笔记4

    Eclipse中快捷键的使用 A:新建 ctrl + n B:格式化 ctrl+shift+f C:导入包 ctrl+shift+o D:注释 ctrl+/,ctrl+shift+/,ctrl+shi ...

最新文章

  1. 启程 - 《每日五分钟搞定大数据》
  2. mysql和mongodb对比互补
  3. Keras入门(一)搭建深度神经网络(DNN)解决多分类问题
  4. shaderlab学习一
  5. leetcode C++ 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,
  6. 科技部成立新一代人工智能发展研究中心
  7. php组成,php接口有几部分组成?
  8. 信息学奥赛C++语言:火柴盒
  9. mysql用的sql标准_标准SQL语言的用法_MySQL
  10. OpenExplorer For Eclipse
  11. Python实现分解质因数
  12. 互联网思维——极致思维
  13. 基于阿里云和Arduino的化学环境系统检测,支持钉钉机器人告警(MQ2、MQ3、MQ7、DHT11 完整源码以及实现步骤)
  14. Go语言圣经 - 第3章 基础数据类型
  15. [BX]、loop、inc、dec指令
  16. JAVA中webSockt一对一聊天
  17. 世界淡水资源占水资源的多少_世界上可用淡水资源到底是多少
  18. 移动渠道巨变:应用商店式微,超级 App 内分发崛起
  19. 为何某些文章的阅读量这么高?
  20. awk分析话单列子 tcp连接失败率,及失败连接的topN

热门文章

  1. Android网络库的比较:OkHTTP,Retrofit和Volley [关闭]
  2. 如何生成随机的字母数字字符串?
  3. linux内核zfs,Linus Torvalds 不建议使用 ZFS On Linux
  4. win11设置打开闪退怎么办,解决win11系统闪退的问题
  5. moveit环境引入代码
  6. 更改项目project名称,与项目名称;
  7. Outlook 邮箱备份操作手册
  8. python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
  9. 套用带标题行的表格样式_比格式刷好用10倍,原来Excel表格还有这么神奇的功能!...
  10. linux内核主频,Linux 内核时钟频率对系统性能影响