一、问题描述
1.之前一直使用Mysql数据库,对oracle不算太熟悉,由于接第三方系统,他们的一个标识是LONG类型的自增字段,然后在设计数据库表结构的时候,发现oracle也有这个LONG类型,也没有做事前评估,直接创建啦。下面是建表语句的示例:
CREATE TABLE "TZTEST_OWN"."TEST_LONG_TABLE" (
"ID" VARCHAR2(20 BYTE) NOT NULL ,
"TEST_DATA" VARCHAR2(20 BYTE) ,
"TEST_LONG" LONG
)
TABLESPACE "USERS"
LOGGING
NOCOMPRESS
PCTFREE 10
INITRANS 1
STORAGE (
INITIAL 65536
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
)
PARALLEL 1
NOCACHE
DISABLE ROW MOVEMENT
;
-- ----------------------------
-- Primary Key structure for table TEST_LONG_TABLE
-- ----------------------------
ALTER TABLE "TZTEST_OWN"."TEST_LONG_TABLE" ADD CONSTRAINT "SYS_C0011392" PRIMARY KEY ("ID");
2.插入数据
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('1', 'AA', '222');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('2', 'BB', '333');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('3', 'CC', '444');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('4', 'DD', '555');
INSERT INTO "TZTEST_OWN"."TEST_LONG_TABLE"("ID", "TEST_DATA", "TEST_LONG") VALUES ('5', 'EE', '111');
3.更新插入没有问题,但是在做LONG类型的字段查询时出现啦问题;
SELECT * FROM TEST_LONG_TABLE WHERE TEST_LONG = 111L
SELECT * FROM TEST_LONG_TABLE WHERE LONG_to_char(TEST_LONG) = '111'
问题:
SELECT * FROM TEST_LONG_TABLE WHERE TEST_LONG = 111L
> ORA-00933: SQL command not properly ended
> 时间: 0.03s
怎么转换都不能使用,顿时慌得一笔。然后就请教各路大神,各种百度,最后通过ORACEL的官方文档找到了答案。百度都是只是不建议使用LONG类型,都是各种转换的例子,如果想明白为什么请参考官方解释:https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#sthref103
二、问题解决方案
无缝衔接的话建议参考:https://www.2cto.com/database/201512/455365.html
由于我们数据量太大而且数据同步需要时长太久,我们采取的是凌晨停服,新增一个字段,然后把LONG类型的那个字段的值同步到另外一个字段里面(使用的是VARCHAR2),最后删除原来字段,更新新建字段名称为原字段名。一千五百万数据整个操作不超过十分钟,最后代码类型同步之后安稳上线。
-- 测试数据库15206240 插入新字段 0.3s
alter table TEST_LONG_TABLE add (TEST_LONGS varchar2(50) default '0' not null);
--删除字段
ALTER TABLE TEST_LONG_TABLE DROP COLUMN TEST_LONG;
--alter table TEST_LONG_TABLE drop column TEST_LONG
--> OK
--> 时间: 210.692s
--更换字段名
ALTER TABLE TEST_LONG_TABLE RENAME COLUMN TEST_LONGS TO TEST_LONG;
--ALTER TABLE TEST_LONG_TABLE RENAME COLUMN TEST_LONGS TO TEST_LONG
--> OK
--> 时间: 0.237s
--创建索引
Create index index_TEST_LONG on TEST_LONG_TABLE ( TEST_LONG )
--Create index index_TEST_LONG on TEST_LONG_TABLE ( TEST_LONG )
--> OK
--> 时间: 28.326s
如有披露或问题欢迎留言或者入群探讨