问题现象
OceanBase Oracle 模式下,导出包含时间类型的 SQL 数据文件后,再通过 ODC 导入该文件时报错:
Reason: ORA-01843: not a valid month.
问题原因
OBDUMPER 生成 INSERT 语句时,未使用 TO_DATE 函数对DATE类型的数据进行转换。如果当前会话的 nls_date_format 变量值与生成的 INSERT 语句中的 DATE 类型数据格式不匹配,则会插入失败。
例如:当前会话的 nls_date_format 变量值为 yyyy-mm-dd,而生成的 INSERT 语句为 INSERT INTO "ALLTYPE"("HIREDATE") VALUES ('2020-06-11 06:19:16'); 则会插入失败。
可以使用以下语句查看 nls_date_format 变量值:
show variables like '%nls_date_format%';
解决方法
方法 1:修改会话变量
注意
此方法会影响当前会话,共享 Session 模式下会影响所有的 SQL 窗口,请谨慎使用。
将 nls_date_format 变量值修改为 INSERT 语句中DATE类型的数据格式。可以通过以下两种方式修改会话变量:
通过 SQL 控制台,执行 SQL 语句。
set session nls_date_format='yyyy-mm-dd HH24:MI:SS';在 ODC 的 会话 > 会话属性 页面中,搜索并修改
nls_date_format变量值。
方法 2:使用 TO_DATE 函数转换
修改 SQL 脚本中的 INSERT 语句,插入DATE类型的数据时,使用TO_DATE函数转换成对应的格式。例如:
INSERT INTO "ALLTYPE"("HIREDATE") VALUES (TO_DATE('2058-04-21 06:19:16', 'yyyy-mm-dd HH24:MI:SS'));