SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】
今天运行壹個小程序,功能是读取指定目录下的 SQL 脚本,并加载到内存中批量执行,之前的程序运行良好。但是今天相关开发人员更新了其中壹個 SQL 脚本,于是程序运行的时候就出错了,错误提示信息如下:批处理中出现错误: ORA-01756: 引号内的字符串没有正确结束。用 Notepad++ 打开看了下 SQL 脚本,没有发现明显的语法错误,再仔细找了找包含单引号和双引号的语句,也没有看到语句未正确结束的地方。于是有点困惑,开始启动 Eclipse 的 Debug 模式仔细分析,并调低了日志级别到 DEBUG,将所有解析出来的 SQL 语句打印至控制台。
结果在日志中发现有的 SQL 语句解析之后居然是乱码,截取部分内容如下所示:
4,2,'?占淇迹罩湛贾? from TRUSTDB.TRUST_PRDT_MEM_SET t
很明显的,数字2后面的部分只有壹個开始的单引号,而没有关闭的单引号,看来极有可能是这段乱码引起的,上述内容在原始的 SQL 文件(GBK 编码)中实际是这样的:
4,2,'日间开始,日终开始之前' from TRUSTDB.TRUST_PRDT_MEM_SET t
不知道为什么经过 Java 解析之后会变成壹串乱码。找到问题的所在,修改的时候直接把“日间开始,日终开始之前”中间的全角逗号改成了半角逗号,问题就宣告解决,同时我还注意到在这個 SQL 脚本中,还有其它地方也使用到了全角的逗号,但是那些地方没有出问题,独独此处报错了,真是奇怪。在我看来,这個修复方法实在不太理想,不知道是否还有更好的方法。另外,附上我的 SQL 文件解析代码如下。
List<String> loadSql(String filepath) throws Exception {
List<String> sqls = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
byte[] buff = new byte[1024];
int byteRead = 0;
LOGGER.debug("Start parse sql file [" + filepath + "].");
InputStream sqlFileIn = ClasspathResourceLoader.getResourceAsStream(filepath);
//开始读取文件内容
while ((byteRead = sqlFileIn.read(buff)) != -1) {
sb.append(new String(buff, 0, byteRead));
}
//将读取到的字符串以换行符分割
String[] sqlArr = sb.toString().split("(;\\s*\\r\\n)|(;\\s*\\n)");
for (int i = 0; i < sqlArr.length-1; i++) {
//将每個独立语句中的注释和末尾的分号去掉,只保留语句内容
String sql = sqlArr[i].replaceAll("--.*", "").replaceAll(";", " ").trim();
if (!sql.equals("")) {
sqls.add(sql);
}
}
LOGGER.debug("sql list=" + sqls);
return sqls;
}
目前这個问题暂存,待日后有更好的方法时我会回过头来继续补充完善。其实有個更简单的办法找到 SQL 语句中出错的地方,就是把日志中解析之后输出的 SQL 语句复制粘贴到 PL/SQL Developer 的编辑器中,观察这些语句的语法染色,通常来讲,如果因为单引号或者双引号不匹配引发了语句错误,在编辑器里显示出来的效果就会有点不大壹样。我们只需要从代码尾部开始往上找到那個不壹样的地方,然后修改掉它,就很容易解决问题了。
SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】的更多相关文章
- 【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题
记录通过执行Oracle的执行计划查询SQL脚本中的效率问题 问题现象: STARiBOSS5.8.1R2版本中,河北对帐JOB执行时,无法生成发票对帐文件. 首先,Quartz表达式培植的启 ...
- 找出sql脚本中需要创建的表空间名称和数据库用户名
测试的工作中,经常会遇到项目交接或者搭建一个新的测试环境,而创建oracle数据库用户及表空间时,需要提前找出脚本中的 数据库用户名和表空间名,所以自己写了一个python脚本,自动找出sql脚本中的 ...
- PowerDesign16.6支持Mysql的生成sql脚本中包含Collate信息
当前powerDesign版本:16.6 列上指定:Collation = utf8_general_ci 但是SQL脚本中,列字段没有显示Collect ---------------------- ...
- 经历:sybase的sql查询,当传递的参数中包含全角空格(\u00a0),查询慢
今天,我遇到了一个sybase数据库查询的问题.一句简单的sql,但是不知道为什么查询不出来,导致生产生产服务器频频挂掉.吓得我的小心脏砰砰啊. select DISTINCT A.FCIL_CDE ...
- sql语句,一个全角空格的考验
早晨在群里灌水.突然有人发了这个,问哪里错了,下图是sql语句和报错信息... 一群人猜了半天,呵呵,最后发现是 ”全角空格“ 引起的...真是醉了..记录下,引以为戒.
- mssql sqlserver避免sql脚本中出现除零错误的方法分享
摘自:http://www.maomao365.com/?p=6612 摘要:下文介绍sql server中,sql脚本避免出现除零错误的方法分享 在各种业务系统开发中,通常会遇到除零的错误,下文分享 ...
- 去掉PowerDesigner生成SQL脚本中字段名带的引号
使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照“”中的名称建表,如果没有“”,会按照ORACL ...
- $.ajax里一个中文全角逗号引发的惨案
昨天,在制作一个页面时,突然发生一件不可思议的事情--JS失效了! 确实让人匪夷所思,我记得饭前还是正常运作的. 于是慢慢的缩小范围,把下午刚加的语句删掉,删完了页面就正常了. 于是被删除的这部分代码 ...
- 在SQL脚本中的注释引起的奇怪问题
在数据库安装包中,我们通过osql.exe这个工具来对相关的数据库脚本进行更新,昨天突然发现安装包报错了,说脚本错误,但我们将脚本拿到数据库查询分析器中执行,一切OK. 问题出在哪里呢? 通过使用os ...
随机推荐
- Extjs6设置Store、Ajax、form的请求方式(GET、POST)
Extjs6 设置Store.Ajax.form的请求方式(GET.POST) Ajax请求和Form的submit方法设置请求方式和原来一样,使用method : 'POST'设置 // 表单提交 ...
- 如何用python解析mysqldump文件
一.前言 最近在做离线数据导入HBase项目,涉及将存储在Mysql中的历史数据通过bulkload的方式导入HBase.由于源数据已经不在DB中,而是以文件形式存储在机器磁盘,此文件是mysqldu ...
- 20165333实验一 JAVA开发环境的熟悉
JAVA开发环境的熟悉-1 1建立"自己学号exp1"的目录 2 在"自己学号exp1"目录下建立src,bin等目录 3 javac,java的执行在&quo ...
- JS格式化时间并比较
JS格式化时间,然后进行比较.工作遇到的情况,然后网上找到的,记下来,下次用! </head> <body> <button onclick="myFuncti ...
- Maven使用—拷贝Maven依赖jar包到指定目录
https://blog.csdn.net/u013514928/article/details/77930183
- IP、TCP和DNS与HTTP的密切关系
看了上一篇博文的发表时间,是7月22日,现在是10月22日,已经有三个月没写博客了.这三个月里各种忙各种瞎折腾,发生了很多事情,也思考了很多问题.现在这段时间开始闲下来了,同时该思考的事情也思考清楚了 ...
- [CodeForces]CodeForces 13D 几何 思维
大致题意: 给出N个红点和M个蓝点,问可以有多少个红点构成的三角形,其内部不含有蓝点 假设我们现在枚举了一条线段(p[i],p[j]),我们可以记录线段下方满足(min(p[i].x,p[j].x)& ...
- 洛谷P2597 [ZJOI2012] 灾难 [拓扑排序,LCA]
题目传送门 灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. ...
- HP电脑的增霸卡功能操作详解
机房管理中HP电脑的增霸卡功能操作详解 一.软件去除保护 1).电脑开机后等待进入增霸卡选择系统界面: 2).按F1帮助,F10进入增霸卡BIOS界面: 3).光标切换到>>>系统还 ...
- 【mysql】当where后接字符串,查询时会发生什么?
好久没有研究一个“深层次”的问题了. 首先来看我们为什么要讨论这个问题~ 首先这是一个正常的数据库查询,我们可以看到在ruizhi数据库里的chouka表内,所有数据如图. 现在,我们运行查询: se ...