探索技术融合——DM到南大通用GBase 8s的数据库迁移指南(中)

原文链接:https://www.gbase.cn/community/post/3840

更多精彩内容尽在南大通用GBase技术社区

作为本系列文章的中篇,本文将从索引、触发器和存储过程等方面,进一步解析两种数据库系统之间的差异,并提供实际的语法示例和操作指导。无论您是数据库管理员、开发人员,还是对数据库迁移感兴趣的技术爱好者,本篇文章都将为您提供实用的信息和见解。

一、 对象表(Type)的创建与修改

1、创建对象表

对象表在数据库中用于存储具有特定属性的结构化数据。在DM和GBase 8s中创建对象表的语法略有不同,但它们都能实现相同的功能。

  • DM
create or replace type FUT_DXB_CJ_OBJ as object(name varchar(10), sex varchar(10), birthdate date);
--create table FUT_DXB_CJ of FUT_DXB_CJ_OBJ;
  • GBase8s
create row type FUT_DXB_CJ_OBJ (name varchar(10), sex varchar(10), birthdate date);

在oracle模式下也支持DM语法,区别在于下面的建表语句

create table FUT_DXB_CJ of TYPE FUT_DXB_CJ_OBJ;

在GBase 8s中,使用row type来定义对象表,而在DM中,使用type关键字。两者都允许定义具有多个属性的对象。

2、修改对象表

修改对象表时,DM和GBase 8s提供了添加新列的语法。

  • DM
alter table FUT_DXB_CJ add column place nvarchar(20);
  • GBase8s
alter table FUT_DXB_XG add place nvarchar(20);

在DM中,使用alter table语句直接对表进行修改,而GBase 8s中使用相同的方法。这种差异主要体现在特定数据库的语法习惯上。

二、索引(Index)的创建与管理

1、 函数索引

函数索引允许数据库基于某个函数的结果来创建索引,这可以优化涉及该函数的查询性能。

  • DM
create index FUT_SYGL_CJHS_IDX on FUT_SYGL_CJHS (c1+c2);
  • GBase8s
create function getSumSalary(c1 int,c2 int) returning int with(not variant)
return c1+c2;
end function;
create index FUT_SYGL_CJHS_IDX on FUT_SYGL_CJHS (getSumSalary(c1,c2));

在GBase 8s中,创建函数索引前需要先定义一个函数,而在DM中,可以直接在索引创建时使用表达式。

2、分区索引

分区索引是一种特殊类型的索引,它允许索引在逻辑上被分割成多个分区。

  • DM
create index FUT_SYGL_CJFQ_IDX on FUT_SYGL_CJFQ (c1) global partition by range(c1)
(
   partition g_p1 values less than(10),
   partition g_p2 values less than(maxvalue)
);
  • GBase8s
create index FUT_SYGL_CJFQ_IDX on FUT_SYGL_CJFQ (c1) partition by range(c1)
(
   partition g_p1 values less than(10),
   partition g_p2 values less than(maxvalue)
);

分区索引在DM和GBase 8s中的创建语法非常相似,主要区别在于DM中可能需要使用global关键字。

3、位图索引

位图索引是一种高效的索引结构,特别适用于具有少量不同值的列。

  • DM
create or replace bitmap index FUT_SYGL_CJWT_IDX on FUT_SYGL_CJWT (c1);
  • GBase8s
create BITMAP index FUT_SYGL_CJWT_IDX on FUT_SYGL_CJWT (c1);

在GBase 8s中,使用BITMAP关键字来创建位图索引,而在DM中使用bitmap关键字。

4、设置索引不可见/无效

索引的可见性可以被设置为不可见或无效,这在进行维护或重建索引时非常有用。

  • DM
alter index FUT_SYGL_CJBS_IDX VISIBLE;
alter index FUT_SYGL_CJBS_IDX INVISIBLE;
ALTER INDEX FUT_SYGL_SX_IDX UNUSABLE;
  • GBase8s
Set indexes FUT_SYGL_CJBS_IDX disabled;

在GBase 8s中,可以使用Set indexes命令来禁用索引,而在DM中使用alter index来改变索引的可见性。

5、物化视图(Materialized View)

物化视图是一种存储查询结果的数据库对象,可以提高复杂查询的性能。

  • DM
CREATE MATERIALIZED VIEW
FUT_WHST_ZLSX  REFRESH FAST  WITH  ROWID START  WITH
SYSDATE NEXT SYSDATE + 1 AS
SELECT   VENDORID,    ACCOUNTNO,    NAME,   ACTIVEFLAG, CREDIT,ROWID AS X
FROM
FUT_WHST_3 WHERE CREDIT = 1;
  • GBase8s
CREATE MATERIALIZED VIEW
FUT_WHST_ZLSX  REFRESH (FAST)   START  WITH
SYSDATE NEXT SYSDATE + 1 AS
SELECT   VENDORID,    ACCOUNTNO,    NAME,   ACTIVEFLAG, CREDIT,ROWID AS X
FROM
FUT_WHST_3 WHERE CREDIT = 1;

物化视图在DM和GBase 8s中的创建语法相似,都允许指定刷新策略和其他选项。

三、触发器(Trigger)的应用

1、系统事件触发器

系统事件触发器响应数据库系统级别的事件。

  • DM
create trigger FUT_CFQ_XTSJ after LOGIN on database
BEGIN
   INSERT INTO RESULT(type) VALUES('LOGIN');
END;
/
  • GBase8s

通过存储过程实现系统触发器功能,执行特定的SQL命令来模拟触发器行为。

create procedure public.sysdbopen()
 set isolation to dirty read;
 INSERT INTO RESULT(type) VALUES('LOGIN');
 end procedure;
END;
/

2、时间触发器

时间触发器按照预定的时间间隔执行特定的操作。

  • DM
CREATE OR REPLACE TRIGGER FUT_CFQ_TIME
AFTER TIMER on database
for each 1 day for each 1 MINUTE
BEGIN
   Insert into result(type) values ('TIME');
END;
/
  • GBase8s

通过任务调度实现时间触发器的功能,使用task命令来安排重复执行的作业。

从15:35:00开始,每隔1分钟向result插入一条数据

rm $GBASEDBTDIR/etc/sysadmin/stop
dbaccess sysadmin -
execute function task("scheduler start"); 
Create table result (type varchar(10),num int);

delete from sysadmin:ph_task where tk_name = 'test_task';
insert into sysadmin:ph_task( tk_name, tk_type, tk_group, tk_description, tk_execute,tk_start_time, tk_stop_time, tk_frequency,tk_dbs )
VALUES
("test_task","TASK","TABLES","insert values","insert into result(type) values ('TIME');",
DATETIME(15:35:00) HOUR TO SECOND,NULL,INTERVAL (1) MINUTE TO MINUTE,'sysadmin');

四、存储过程(Stored Procedure)的编写与执行

1、游标的使用

游标用于逐行处理查询结果集。

  • DM
CREATE OR REPLACE PROCEDURE PROC_FUT_CCGC_YB AS STR VARCHAR;
CURSOR C1 IS SELECT TITLE FROM FUT_CCGC_YB;
BEGIN
    OPEN C1;
   FETCH NEXT C1 INTO STR;
   PRINT STR;
   CLOSE C1;
END;
/
  • GBase8s
Set serveroutput on;
CREATE OR REPLACE PROCEDURE PROC_FUT_CCGC_YB AS STR VARCHAR;
CURSOR C1 IS SELECT TITLE FROM FUT_CCGC_YB;
BEGIN 
   OPEN C1; 
   FETCH C1 INTO STR; 
   dbms_output.put_line(STR); 
   CLOSE C1; 
END;
/

在GBase 8s中,使用dbms_output.put_line来输出游标获取的数据,而在DM中使用PRINT语句。

2、动态SQL的执行

动态SQL允许在存储过程中构建并执行SQL语句。

  • DM
CREATE OR REPLACE PROCEDURE PROC_FUT_CCGC_DTSQL(id IN INT, name IN varchar(10)) AS
DECLARE
   str_sql varchar := 'SELECT title from FUT_CCGC_YB WHERE id = ? AND name = ?';
BEGIN
   EXECUTE IMMEDIATE str_sql USING id,name;
EXCEPTION
   WHEN OTHERS THEN PRINT 'error';
END;
/
  • GBase8s
CREATE OR REPLACE PROCEDURE PROC_FUT_CCGC_DTSQL(id IN INT, name1 IN varchar(100)) AS
str_sql varchar(100):= 'SELECT title from FUT_CCGC_YB ';
values1 varchar(100):='WHERE id ='||id ;
values2 varchar(100):=' AND name ='''||name1||'''';
result varchar(20);
BEGIN
   EXECUTE IMMEDIATE str_sql||values1||values2 into result;
   dbms_output.put_line(result);
EXCEPTION
   WHEN OTHERS THEN 
   dbms_output.put_line ('error');
END;
/

在GBase 8s中,使用字符串连接来构建动态SQL语句,并使用dbms_output.put_line来输出结果或错误信息。而在DM中,使用PRINT语句来输出错误信息。

以上文字叙述提供了对DM和GBase 8s在不同数据库对象和操作方面的语法差异的详细解释,有助于用户理解两种数据库系统的特性和用法。在下一篇文章中我们将谈谈函数、包、自定义类型等语法差异。敬请期待。再次感谢您的阅读,对于本文内容或数据库迁移的任何问题,欢迎在评论区留言,我们的技术专家将为您提供解答。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值