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