使用Navicat迁移MySQL数据至Oracle时大小写原因报“表或视图不存在”问题处理

使用Navicat提供的数据传输工具将JEECMSv9的MySQL的数据迁移至Oracle数据库,数据迁移成功表都存在,但是在程序启动时提示表或视图不存在。

Caused by: java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:886)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3657)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1495)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353)

    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
    ... 63 more

跟踪源码,发现是找不到“jc_task”表,但是在Oracle中这张表是存在的并包含数据。

image

但是奇怪的是表名上加了双引号,去掉双引号后提示“表或视图不存在”。

image

问题原因:

参考:https://www.cnblogs.com/fuchen/p/5680478.html

1、Oracle表和字段是有大小写的区别。Oracle默认是大写,如果我们用双引号括起来的就区分大小写,如果没有,系统会自动转成大写。
2、Navicat传输数据时按照MySQL中的表名大小写状态进行传输,导致在Oracle中必须通过加双引号的方式进行操作。

解决办法:

Navicat数据传输工具的选项卡中提供了“转换对象名为小写/大写”的选项,勾选为大写再次进行数据传输即可。

image

原文地址:https://www.cnblogs.com/xusweeter/p/9761753.html