概述
只稍微熟悉MySQL,但是不可避免会使用Oracle,此文记录Oracle使用问题。
问题
获取版本号
SELECT version FROM PRODUCT_COMPONENT_VERSION WHERE product LIKE 'Oracle Database%';
输出:19.0.0.0.0
字段最大长度
和通用SQL类似:select max(length(C_LONG_COMMENTS))from SYSADM.C_BATCH_TBL;
ORA-00942:表或视图不存在
很简单的Select查询语句,报错如上。数据库owner坚称表或视图存在。
原因:连接该数据库的用户没有查看该表或视图的权限,故而报错。需要联系数据库owner,或管理员添加权限。
另,在获得权限后,DataGrip依旧是红色警告,点击SYSADM,确实看不到表或视图,但是不影响SQL查询获取结果。
ORA-00911:无效字符
复制到DataGrip里面,\r\n
没有变成回车换行,居然报错。SQL在JDBC程序里面执行是没有问题的。
ORA-00933:SQL command not properly ended
一段简单的SQL查询语句放在DataGrip执行成功,但是在JDBC代码里面执行失败:
断点调试,发现原因居然是多了一个;
!!!!
数据同步
Oracle到MySQL的数据同步。
大小写
Oracle自动将查询的结果变成大写,同步到MySQL,表字段定义允许是下划线命名的。
时间戳BatchUpdateException: Data truncation: Incorrect datetime value
Oracle的时间戳数据支持毫秒数
同步到MySQL时,不管MySQL字段定义为timestamp还是varchar,同步数据都会报错:
解决方法:
TO_CHAR(CREATEDTTM, 'YYYY-MM-DD HH24:MI:SS') as CREATEDTTM
clob类型序列化问题NotSerializableException: oracle.jdbc.driver.T4CConnection
Oracle字段定义为CLOB,MySQL定义为varchar或text,都会报错:
解决方法:
CAST(C_LONG_COMMENTS AS VARCHAR2(3000)) as C_LONG_COMMENTS
参考
Oracle to MySQL timestamp conversion in MySQL insert statementNotSerializableException while getting CLOB data from ORACLE using JDBC