zoukankan      html  css  js  c++  java
  • 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 的编辑器中,观察这些语句的语法染色,通常来讲,如果因为单引号或者双引号不匹配引发了语句错误,在编辑器里显示出来的效果就会有点不大壹样。我们只需要从代码尾部开始往上找到那個不壹样的地方,然后修改掉它,就很容易解决问题了。

  • 相关阅读:
    从开心网的奴隶安抚与折磨想到员工积极性与人力成本的问题
    悲剧的做网站的,我们都没有认真的前行
    如何做生意
    Android Market中产品图标设计原则
    控制UpdataPanel中的GridView模板列控件同步刷新
    DataTable筛选
    IE6,7,8,FF兼容总结
    DevPress Grid 设置行样式
    SQL分组查询
    DevexPress checkedit 多选解决方案(原创)
  • 原文地址:https://www.cnblogs.com/soundcode/p/6519491.html
Copyright © 2011-2022 走看看