SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】
今天運行壹個小程序,功能是讀取指定目錄下的 SQL 腳本,并加載到內(nèi)存中批量執(zhí)行,之前的程序運行良好。但是今天相關(guān)開發(fā)人員更新了其中壹個 SQL 腳本,于是程序運行的時候就出錯了,錯誤提示信息如下:批處理中出現(xiàn)錯誤: ORA-01756: 引號內(nèi)的字符串沒有正確結(jié)束。用 Notepad++ 打開看了下 SQL 腳本,沒有發(fā)現(xiàn)明顯的語法錯誤,再仔細找了找包含單引號和雙引號的語句,也沒有看到語句未正確結(jié)束的地方。于是有點困惑,開始啟動 Eclipse 的 Debug 模式仔細分析,并調(diào)低了日志級別到 DEBUG,將所有解析出來的 SQL 語句打印至控制臺。
結(jié)果在日志中發(fā)現(xiàn)有的 SQL 語句解析之后居然是亂碼,截取部分內(nèi)容如下所示:
4,2,'?占淇跡罩湛賈? from TRUSTDB.TRUST_PRDT_MEM_SET t很明顯的,數(shù)字2后面的部分只有壹個開始的單引號,而沒有關(guān)閉的單引號,看來極有可能是這段亂碼引起的,上述內(nèi)容在原始的 SQL 文件(GBK 編碼)中實際是這樣的:
4,2,'日間開始,日終開始之前' from TRUSTDB.TRUST_PRDT_MEM_SET t不知道為什么經(jīng)過 Java 解析之后會變成壹串亂碼。找到問題的所在,修改的時候直接把“日間開始,日終開始之前”中間的全角逗號改成了半角逗號,問題就宣告解決,同時我還注意到在這個 SQL 腳本中,還有其它地方也使用到了全角的逗號,但是那些地方?jīng)]有出問題,獨獨此處報錯了,真是奇怪。在我看來,這個修復(fù)方法實在不太理想,不知道是否還有更好的方法。另外,附上我的 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); //開始讀取文件內(nèi)容 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++) { //將每個獨立語句中的注釋和末尾的分號去掉,只保留語句內(nèi)容 String sql = sqlArr[i].replaceAll("--.*", "").replaceAll(";", " ").trim(); if (!sql.equals("")) { sqls.add(sql); } } LOGGER.debug("sql list=" + sqls); return sqls; }目前這個問題暫存,待日后有更好的方法時我會回過頭來繼續(xù)補充完善。其實有個更簡單的辦法找到 SQL 語句中出錯的地方,就是把日志中解析之后輸出的 SQL 語句復(fù)制粘貼到 PL/SQL Developer 的編輯器中,觀察這些語句的語法染色,通常來講,如果因為單引號或者雙引號不匹配引發(fā)了語句錯誤,在編輯器里顯示出來的效果就會有點不大壹樣。我們只需要從代碼尾部開始往上找到那個不壹樣的地方,然后修改掉它,就很容易解決問題了。
總結(jié)
以上是生活随笔為你收集整理的SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。