开发者社区> 问答> 正文

当数据库列中使用了ORACLE数据库关键字Exception时报错

为了记录异常信息到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

展开
收起
山海行 2023-07-05 21:55:41 67 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    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;
    修改列名后,需要在应用程序中相应地更新对列名的引用。

    2023-07-30 09:38:22
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    当使用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数据库执行。

    希望这些信息能帮助到您!如果您还有其他问题,请随时向我提问。

    2023-07-11 16:22:06
    赞同 展开评论 打赏
  • 如果没有配置filters="wall",那样只会打印error log。

    问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 12:29:33
    赞同 展开评论 打赏
  • 您在使用 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 的冲突问题。

    2023-07-06 10:55:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像