为了记录异常信息到Oracle数据库日志表中,sql为 insert into sys_log(ID,EXCEPTION) values(?,?) 会报错。原因是druid中认为EXCEPTION是oracle关键字。改成 insert into sys_log(ID,"EXCEPTION") values(?,?) 也不行。
不用druid的话以上2条语句都能正常执行,用了druid都无法执行。
注:ID为char(32)类型,EXCEPTION为CLOB。
原提问者GitHub用户mfkvfn
Oracle数据库中,Exception是一个关键字,用于异常处理。如果在数据库列中使用Exception作为列名,可能会导致SQL语句解析出错,从而报错。
为了避免这个问题,可以采取以下措施:
避免使用Oracle关键字作为列名:作为一个良好的编程习惯,我们应该避免在数据库中使用Oracle关键字作为列名,以免出现类似的问题。可以在设计数据库表结构时,使用有意义的列名,避免使用关键字。
使用引号转义关键字:如果已经存在使用关键字作为列名的字段,可以使用引号将关键字括起来进行转义,例如:
Copy
SELECT "Exception" FROM table;
在使用引号转义关键字时,需要注意:
引号必须是双引号,而不是单引号。
引号转义后,列名必须保持原样,区分大小写。
修改Oracle关键字:如果无法避免使用Oracle关键字作为列名,并且引号转义也无法解决问题,可以考虑修改Oracle关键字。可以在Oracle数据库中使用RENAME命令,将包含关键字的列名修改为其他合法的列名,例如:
Copy
ALTER TABLE table RENAME COLUMN Exception TO MyException;
修改列名后,需要在应用程序中相应地更新对列名的引用。
当使用Oracle数据库关键字作为列名时,您可以通过在列名周围使用双引号来避免问题。但是,根据您的描述,即使在语句中使用双引号,使用Druid时仍然无法执行。
在这种情况下,您可以尝试使用Druid的转义字符来解决问题。Druid提供了一种特殊的转义语法,以便在SQL语句中使用保留关键字作为列名或表名。
尝试以下语法来使用Druid转义函数:
INSERT INTO sys_log(ID, @@\"EXCEPTION\") VALUES (?, ?)
在上面的语句中,使用了Druid的转义函数@@\"
将EXCEPTION
作为列名进行转义。这将告诉Druid将EXCEPTION
作为普通的列名处理,而不是Oracle关键字。
如果以上语法仍然无法解决您的问题,您可以尝试使用原始的JDBC API来执行SQL语句,而不是使用Druid连接池来执行。这样做可以避免Druid对SQL语句的解析和处理,直接将原始的SQL语句发送给Oracle数据库执行。
希望这些信息能帮助到您!如果您还有其他问题,请随时向我提问。
如果没有配置filters="wall",那样只会打印error log。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
您在使用 druid 操作 Oracle 数据库时,遇到了 Oracle 关键字 Exception 和 druid 的冲突问题。事实上,Exception 是 Oracle 中的关键字,而 druid 在解析 SQL 语句时,会检查关键字的使用情况。为了避免冲突,可以在 SQL 语句中使用双引号(")将 Exception 包括起来,以明确表名/列名。
针对该问题,您可以按照以下方法进行调整:
在 SQL 语句中使用双引号将 Exception 包括起来 您可以在 SQL 语句中使用双引号将 Exception 包括起来,明确指定该列名。例如:
insert into sys_log(ID, "EXCEPTION") values (?, ?) 复制 使用双引号可以告诉 druid 将双引号内的内容作为列名解析,从而避免了 Oracle 关键字 Exception 和 druid 的冲突。
使用 column 转义关键字 除了使用双引号外,还可以使用转义关键字的方式,将 Exception 作为字符串列名处理。例如:
insert into sys_log(ID, column_exception) values (?, ?) 复制 其中,column_exception 是在 druid 的配置中,通过 escape 表达式来指定的。例如,在 JDBC 数据源的配置中,可以添加如下配置:
druid.stat.mergeSql=true; druid.stat.slowSqlMillis=5000; druid.sql.parser.keep-going=false; druid.sql.parser.stmt-comment-enabled=true; druid.sql.parser.skip-comment=false; druid.sql.parser.block-comment-enabled=true; druid.sql.parser.allow-comment-between-stat-and-parameters=true; druid.sql.parser.limit-start=0; druid.sql.parser.limit-end=-1; druid.sql.parser.max-len=65535; druid.sql.parser.identifier-quote='`'; druid.sql.parser.column-quote='"'; druid.sql.parser.check-valid-column=true; druid.sql.parser.cache-size=2048; druid.sql.parser.keep-source-location=true; druid.sql.parser.not-support-hint=true; druid.sql.parser.skip-syntax-errors=true; druid.sql.parser.escape=column_ 复制 在上述配置中,使用 escape 属性指定了转义前缀为 column_,这意味着在 SQL 语句中,将以 column_ 开头的字符串作为列名进行解析。
通过以上方法,您可以避免 Oracle 关键字 Exception 和 druid 的冲突问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。