缓存表的数据类型可以与Oracle不一样吗?

在建立缓存组时,默认时缓存表的类型与Oracle保持一致,那是否可以不一样呢?
之所以有这个问题是由于两点:
1. 之前Oracle中的表设计不合理,如果能改Oracle端的设计是最好的,这样从根源上解决了问题,但如果一时改不了,则希望在TimesTen端改
2. 由于TimesTen设计与Oracle不一样,因此为优化计,一些数据类型需要更改为TimesTen本地类型,特别是Oracle中的NUMBER整数类型(标度为0)需要改为TimesTen中的tt_integer, tt_smallint, tt_tinyint等。

因此做了以下的实验:
在Oracle端,建立表tab01,特意将字段a定义为varchar2(40),其实SYSGUID只需32字节:

create table tab01(a varchar2(40), b number(8), primary key(a));
insert into tab01 select sys_guid(), 1 from dual;
grant select, insert, delete, update on tab01 to cacheadm;

利用SQL*Developer创建缓存组:
这里写图片描述
我们看到VARCHAR2是不允许修改的,但NUMBER是可以的,而且给出了对应的TimesTen本地数据类型,这点很贴心。我一直强调建立缓存组应用SQL*Developer图形化工具,会比命令行方便很多,这里也算是一个加分功能吧。
NUMBER可以修改,那VARCHAR2呢?如果TimesTen作为独立数据库,显然是可以的,ttImportFromOracle实用程序type 1模式考虑了NUMBER,type 2,1模式又多考虑了VARCHAR2。现在TimesTen作为缓存时,虽然在图形界面中不能改,但我将其生成的脚本拷贝到命令行中执行:

Command> CREATE READONLY CACHE GROUP "CG_TAB01_RO" 
       >  AUTOREFRESH MODE INCREMENTAL INTERVAL 5 SECONDS
       >  STATE ON
       >  FROM
       >   "TTUSER"."TAB01" (
       >     "A" VARCHAR2(32 BYTE) NOT NULL,
       >     "B" TT_INTEGER       ,
       >     PRIMARY KEY("A")
       >   );
 5121: Non-standard type mapping for column TTUSER.TAB01.A, cache operations are restricted
 5168: Restricted cache groups are deprecated
 5126: A system managed cache group cannot contain non-standard column type mapping
The command failed.

结果失败了。因此如果TimesTen作为缓存组,则只能做typemap 1的转换。
回到此问题,缓存表的数据类型可以与Oracle不一样,但只限于NUMBER整数类型。

猜你喜欢

转载自blog.csdn.net/stevensxiao/article/details/80293999