SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】

SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】

今天运行壹個小程序,功能是读取指定目录下的 SQL 脚本,并加载到内存中批量执行,之前的程序运行良好。但是今天相关开发人员更新了其中壹個 SQL 脚本,于是程序运行的时候就出错了,错误提示信息如下:批处理中出现错误: ORA-01756: 引号内的字符串没有正确结束用 Notepad++ 打开看了下 SQL 脚本,没有发现明显的语法错误,再仔细找了找包含单引号和双引号的语句,也没有看到语句未正确结束的地方。于是有点困惑,开始启动 Eclipse 的 Debug 模式仔细分析,并调低了日志级别到 DEBUG,将所有解析出来的 SQL 语句打印至控制台。

结果在日志中发现有的 SQL 语句解析之后居然是乱码,截取部分内容如下所示:

?
1
<code class= "hljs" >4,2,'?占淇迹罩湛贾?      from TRUSTDB.TRUST_PRDT_MEM_SET t</code>

很明显的,数字2后面的部分只有壹個开始的单引号,而没有关闭的单引号,看来极有可能是这段乱码引起的,上述内容在原始的 SQL 文件(GBK 编码)中实际是这样的:

?
1
<code class= "hljs javascript" ><span class= "hljs-number" >4,<span class= "hljs-number" >2,<span class= "hljs-string" > '日间开始,日终开始之前'      <span class= "hljs-keyword" > from TRUSTDB.TRUST_PRDT_MEM_SET t</span></span></span></span></code>

不知道为什么经过 Java 解析之后会变成壹串乱码。找到问题的所在,修改的时候直接把“日间开始,日终开始之前”中间的全角逗号改成了半角逗号,问题就宣告解决,同时我还注意到在这個 SQL 脚本中,还有其它地方也使用到了全角的逗号,但是那些地方没有出问题,独独此处报错了,真是奇怪。在我看来,这個修复方法实在不太理想,不知道是否还有更好的方法。另外,附上我的 SQL 文件解析代码如下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code class = "hljs javascript" >List<<span class = "hljs-built_in" >String> loadSql(<span class = "hljs-built_in" >String filepath) throws Exception {
     List<<span class = "hljs-built_in" >String> sqls = <span class = "hljs-keyword" > new ArrayList<<span class = "hljs-built_in" >String>();
     StringBuffer sb = <span class = "hljs-keyword" > new StringBuffer();
     byte [] buff = <span class = "hljs-keyword" > new byte [<span class = "hljs-number" > 1024 ];
     int byteRead = <span class = "hljs-number" > 0 ;
     LOGGER.debug(<span class = "hljs-string" > "Start parse sql file [" + filepath + <span class = "hljs-string" > "]." );
     InputStream sqlFileIn = ClasspathResourceLoader.getResourceAsStream(filepath);
     <span class = "hljs-comment" > //开始读取文件内容
     <span class = "hljs-keyword" > while ((byteRead = sqlFileIn.read(buff)) != <span class = "hljs-number" >- 1 ) {
         sb.append(<span class = "hljs-keyword" > new <span class = "hljs-built_in" >String(buff, <span class = "hljs-number" > 0 , byteRead));
     }
     <span class = "hljs-comment" > //将读取到的字符串以换行符分割
     <span class = "hljs-built_in" >String[] sqlArr = sb.toString().split(<span class = "hljs-string" > "(;\\s*\\r\\n)|(;\\s*\\n)" );
     <span class = "hljs-keyword" > for ( int i = <span class = "hljs-number" > 0 ; i < sqlArr.length<span class = "hljs-number" >- 1 ; i++) {
         <span class = "hljs-comment" > //将每個独立语句中的注释和末尾的分号去掉,只保留语句内容
         <span class = "hljs-built_in" >String sql = sqlArr[i].replaceAll(<span class = "hljs-string" > "--.*" , <span class = "hljs-string" > "" ).replaceAll(<span class = "hljs-string" > ";" , <span class = "hljs-string" > " " ).trim();
         <span class = "hljs-keyword" > if (!sql.equals(<span class = "hljs-string" > "" )) {
             sqls.add(sql);
         }
     }      
     LOGGER.debug(<span class = "hljs-string" > "sql list=" + sqls);
     <span class = "hljs-keyword" > return sqls;
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

目前这個问题暂存,待日后有更好的方法时我会回过头来继续补充完善。其实有個更简单的办法找到 SQL 语句中出错的地方,就是把日志中解析之后输出的 SQL 语句复制粘贴到 PL/SQL Developer 的编辑器中,观察这些语句的语法染色,通常来讲,如果因为单引号或者双引号不匹配引发了语句错误,在编辑器里显示出来的效果就会有点不大壹样。我们只需要从代码尾部开始往上找到那個不壹样的地方,然后修改掉它,就很容易解决问题了。

posted @ 2017-03-08 15:01 左正 阅读( 237) 评论( 0) 编辑 收藏
 

公告

支付宝
昵称: 左正
园龄: 7年2个月
粉丝: 126
关注: 29
+加关注
<2018年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910
Copyright ©2018 左正
本文转自 左正博客园博客,原文链接: http://www.cnblogs.com/soundcode/p/6519491.html,如需转载请自行联系原作者
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值