2.1字段类型差异
1)Gbase 8s 无varchar2、number类型
2)Gbase 8s varchar、nvarchar类型长度最大支持255字节,超长内容需使用其他类型
例如lvarchar(最大支持32739个字节),或者text,clob
从oracle迁移的话,varchar2、number类型全部都要更换
3)Gbase 8s定义 indate DATE default sysdate 不支持
官方说明:datetime year to second default current year to second
4)Gbase 8s varchar类型 default 0 必须带上单引号 ‘0’
6)Gbase 8s 含有serial自增列
7)Gbase 8s 时间类型范围不同
date 类型只表示年月日
datetime 类型可表示年月日时分秒精度
从oracle迁移的话,date类型全部要更换datetime
2.2约束差异
1)unique索引不支持创建在text或者byte列
create unique index DEV_AREATAB_INDEX1 on DEV_AREATAB (CENTERID, SUBLEVEL);
报错[IX000]:index not allowed on text or byte columns
2)unique索引不支持创建在clob或者blob列
主键和索引都不支持大对象(官方验证)
create unique index DEV_AREATAB_INDEX1 on DEV_AREATAB (CENTERID, SUBLEVEL);
报错[IX000]:btree index not allowed on clob or blob columns
3)主键约束列若都是varchar类型,无论单列还是多列,总长度不能超长(经测试不能超过388个字节)
alter table DEV_SCREENCONTROLPLAN add constraint DEV_SCREENCONTROLPLAN_PK primary key (CENTERIDS, TASKID, PLANID, IDS, IDSLIST);
报错Cannot add index.Cannot add index.
java.sql.SQLException: ISAM error: illegal key descriptor (too many parts or too long).
4)unique约束列若都是varchar类型,无论单列还是多列,总长度不能超长(经测试不能超过388个字节)
alter table DB_UPDATEINFO
add constraint unique (SQLPATH, SQLTITLE) constraint DB_UPDATEINFO_UK1 ;
报错Cannot add index.Cannot add index.
java.sql.SQLException: ISAM error: illegal key descriptor (too many parts or too long).
测试最大长度:
create table t3(aaaid varchar(189) ,aaaaname varchar(200));
alter table t3 add constraint primary key (aaaid,aaaaname) constraint t3_pk;
—创建失败: Total length of columns in constraint is too long.
create table t3(aaaid varchar(188) ,aaaaname varchar(200));
alter table t3 add constraint primary key (aaaid,aaaaname) constraint t3_pk;
—创建成功
(官方验证)
每个索引的字节数:(对于给定的页大小)
2k page size=387 (很明显我们是默认的2k page size)
4k page size=796
8k page size=1615
12k page size=2435
16k page size=3254
官方:可以在创建表空间的时候指定page size为其他大小,这样就可以调整索引支持的最大长度。
5)主键列和外键列的字段类型必须完全一致,例如varchar(64) 长度都必须一致
2.3 SQL语法差异
1)Create global temporary table 全局临时表语法不支持
(全局临时表不支持,临时表仅限于当前会话)语法:create temp table test(id int);
2)rownum过滤结果集行数不支持
Gbase8s支持语法:skip num first num 或者limit num
3)添加主键、unique、外键约束语法不同:
主键约束:
ALTER TABLE tinadb:dev_basetab ADD CONSTRAINT PRIMARY KEY (deviceid) CONSTRAINT dev_basetab_pk ;
Unique约束:
alter table DEV_BASECLASSTAB add constraint unique (CLASSNAME) constraint DEV_BASECLASSTAB_UK1;
外键约束:
alter table CMS_KEYWORK_EXTERNAL_TAB add constraint foreign key (KEYWORKID)
references CMS_KEYWORK_TAB (KEYWORKID) on delete cascade constraint FK_KEYWORK_EX disabled;
4)创建对象不能使用or replace来创建,只有trigger可以
5)不支持PACKAGE
6)不支持JAVA SOURCE
7)触发器语法不同,全部需要改写
8)大对象不支持distinct、union、Intersect、Minus 等联合操作
9)insert插入不能指定插入default
Insert into cms_videoandimg(IDENTID,IMGURL,UserId,INDATE) VALUES(Pidentid,Pimgurl,Puserid,default);
去掉这个字段就会插入默认值
10)where (ROLEID,RESOURCEID) in 多列条件不支持
使用where acol||bcol in (select acol||bcol …) 拼接方式合并成一个列来判断两个列的值相同
11)REGEXP_INSTR、REGEXP_REPLACE不支持(正则匹配函数)
12)Dbms_output.put_line不支持,无此打印功能
13)不支持with tab as这种方式定义表,可以使用()tab来定义表
create view view_sys_centerclasses as
with tb as(
select CONNECT_BY_ROOT a.classid as topclassid, classid,classname, parentid
from sys_centerclasses a
connect by prior classid= parentid order by topclassid)
select topclassid,classid,classname,parentid from tb;
修改为:
create view view_sys_centerclasses as
select topclassid,classid,classname,parentid from (
select CONNECT_BY_ROOT a.classid as topclassid, classid,classname, parentid
from sys_centerclasses a
connect by prior classid= parentid order by topclassid) tb;
14)插入语句语句中使用union连接的必须括号括起来
INSERT INTO USR_TEMPORARY_TAB (RESOURCEID)
select * from (
select RESOURCEID from DEV_AREATAB where CENTERID=pCENTERID
union all
select RESOURCEID from DEV_BASETAB where CENTERID=pCENTERID);
15)不支持PLSQL匿名块
DECLARE
roleSUBLEVEL VARCHAR2(320);
pRESOURCEID VARCHAR2(64);
BEGIN
select SUBLEVEL into roleSUBLEVEL from t1 where ROLEID=?;
delete from t3 where (ROLEID||’’||RESOURCEID in (
select ROLEID||’’||pRESOURCEID from t4 where…;
COMMIT;
END;
2.4 存储过程语法差异
1)不支持or replace
2)不支持as begin…end,结束end procedure;
3)变量定义使用define var1 integer;
4)变量赋值使用let
let PIDS = “YPSQ082400004554”; —varchar类型
let PCH = 0; —int类型
varchar变量赋值可以双引号,也可以单引号(建议使用)(官方验证)
4)输入输出参数定义的顺序不同:
Oracle :v1 in int,v2 out varchar2
Gbase 8s:v1 int,out v2 varchar(20) —(输入参数in不指明)
5)参数类型varchar2不支持,可使用varchar或者lvarchar,且必须给定范围
6)end if后面不能带分号
7)结果集的循环语法不同,全部需要改写
CREATE PROCEDURE p2()
define v varchar(50);
foreach SELECT CENTERID into v FROM SYS_CENTERPARAMTAB
INSERT INTO USR_MANAGERRIGHTTAB (ROLEID,CENTER,RELATIONTYPE) VALUES (v,v,0);
END foreach;
end procedure;
或者使用游标
FOREACH cursor1 FOR SELECT * INTO pnt FROM TABLE(vertexes);
8)sys_refcursor类型(返回结果集)语法不同,全部需要改写
create procedure pro_f(p1 int) returns sys_refcursor;
define c1 sys_refcursor; —定义游标变量c1
open c1 for ‘select * from t1 where id=?’ using p1; —打开游标变量c1
return c1;
end procedure;
9)不支持PLS_INTEGER类型,全部需要替换
10)字段名不能使用双引号括起来(oracle中习惯使用双引号来区分字段大小写)
11)异常处理语法不同,全部需要改写
自定义异常EXCEPTION_INIT语法不支持,普通异常写法也不同
12)动态SQL定义变量使用text的话,拼接时有varchar类型就会报错
改用lvarchar扩展类型,最大支持32739个字节
CREATE PROCEDURE p1(PCENTERIP varchar(50))
define pSQL lvarchar(32739);
define pCOUNT int;
let psql=‘update SYS_CENTERPARAMTAB SET CENTERIP=’||PCENTERIP;
EXECUTE IMMEDIATE pSQL;
insert into SYS_SYNCCACHE(id,CMD,CREATTIME) values(1,pSQL,current);
end procedure;