关键字:
人大金仓、金仓数据库、KingbaseES、KES、DATE、ORA_DATE、ORA_DATE_STYLE
内容正文:
问题现象:
使用KingbaseES数据库的客户端工具sys_dump时,出现如下所示报错:
1、在ksql终端中使用SQL命令新建t表:create table t(id integer, dat date default now()::text::date not null)
2、在ksql终端中使用SQL命令启用Oracle模式:alter system set ORA_DATE_STYLE=on
3、重启数据库服务,使得Oracle模式生效
4、在ksql终端中验证Oracle模式起效:select now()::text::date,查询显示格式为“YYYY-MM-DD HH24:MI:SS”
5、在ksql终端中执行写表SQL:insert into t values (1)
6、在ksql终端中执行查表SQL:select * from t,查询结果 DATE格式为 “YYYY-MM-DD”,没有时分秒“HH24:MI:SS”
问题原因:
受ORA_DATE_STYLE参数的控制,关键字DATE在PG(缺省)模式下的数据类型表示为“DATE”类型,在Oracle模式下表示为“ORA_DATE”类型。KingbaseES数据库管理系统的表元信息是持久化存储在系统目录“sys_attribute”之中的,一旦创建表成功,列字段的数据类型就已经被确定,不再受ORA_DATE_STYLE参数的控制。
就上诉案例而言,由于新建t表时处于PG模式下,DAT列的类型为DATE类型。后续无论如何调整ORA_DATE_STYLE参数,DAT列的类型依旧为“DATE”类型,不会变成期望的“ORA_DATE”类型。PG模式下“DATE”类型最小精度只支持“日”,Oracle模式下“ORA_DATE”类型最小精度可支持到“时分秒”。上述建表成功后,查看表结构为:
kingbase=# \d t;
ID | INTEGER |
DAT | DATE | 非空 默认 ((NOW())::TEXT)::DATE
解决步骤:
如果期望使用带“时分秒”的DATE类型建立数据表,则需要在新建表之前切换至Oracle模式,然后再执行建表的SQL语句。仍然使用上述的语句,只需调整步骤即可解决问题。
1)在ksql终端中使用SQL命令启用Oracle模式:
| kingbase=# alter system set ORA_DATE_STYLE=on;
SET
2) 重启数据库服务,使得Oracle模式生效
3) 在ksql终端中使用SQL命令新建t表:
| kingbase=# create table t(id integer, dat date default now()::text::date not null);
CREATE TABLE
4) 在ksql终端中执行写表SQL:
| kingbase=# insert into t values (1);
INSERT 0 1
5) 在ksql终端中执行查表SQL,得到拥有“时分秒”的DATE类型了:
| kingbase=# select * from t;
ID | DAT
----+---------------------
1 | 2021-10-25 13:42:47
(1 行记录)
6)在ksql终端中查看t表的结构:
| kingbase=# \d t;
ID | INTEGER |
DAT | ORA_DATE | 非空 默认 ((NOW())::TEXT)::ORA_DATE
至此,出现的问题得以修复。
相关内容可参考官方产品用户文档中的路径: