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

原文链接:

https://www.gbase.cn/community/post/3854

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在本系列迁移指南的收官之作中,我们将深入探讨DM与GBase 8s在函数、包和自定义类型方面的语法和应用差异。这些高级特性的掌握对于数据库开发者和管理员来说至关重要,它们不仅关系到数据库的性能优化,也是实现复杂业务逻辑的重要手段。

一、函数(Function)的定义与使用

1、无参函数的创建

无参函数在数据库中用于执行不依赖于外部输入的计算或返回固定的结果。

  • DM
CREATE OR REPLACE FUNCTION F_FUT_CCHS_BDCS FOR CALCULATE
RETURN INT
IS
BEGIN
   RETURN 1;
END;
/
  • GBase8s
CREATE OR REPLACE FUNCTION F_FUT_CCHS_BDCS
RETURN INT
IS
BEGIN
   RETURN 1;
END;
/

在GBase 8s中创建无参函数更为直接,无需指定FOR CALCULATE,这体现了GBase 8s在语法上的简洁性。

2、确定性函数的特性

确定性函数是那些在给定相同输入时总是返回相同结果的函数,它们在优化查询和保证数据一致性方面发挥重要作用。

  • DM
create or replace function F_FUT_CCHS_QDX() return int deterministic as
declare
begin
   return 0;
end;
/
  • GBase8s
create or replace function F_FUT_CCHS_QDX return int deterministic is
begin
   return 0;
end;
/

在GBase 8s中声明函数为确定性,可以使用deterministic关键字,这有助于数据库优化器更有效地使用该函数。

二、包(Package)的应用

1、创建包规范和包体

数据库包是封装存储过程、函数、异常和其他数据库对象的一种方式,有助于组织和重用代码。

  • DM
CREATE OR REPLACE PACKAGE PKG_FUT_BAGL_CJ IS
E_NOPERSON EXCEPTION;(不能在包头中声明,需要放在包体中)

PERSONCOUNT INT;
PCUR CURSOR;
PROCEDURE   ADDPERSON(PNAME   VARCHAR(100),     PCITY
VARCHAR(100));
PROCEDURE REMOVEPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100));
PROCEDURE REMOVEPERSON(PID INT);
FUNCTION GETPERSONCOUNT RETURN INT;
PROCEDURE PERSONLIST;
END PKG_FUT_BAGL_CJ;
CREATE OR REPLACE PACKAGE BODY PKG_FUT_BAGL_CJ AS
PROCEDURE ADDPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)) AS
BEGIN
INSERT INTO TAB_FUT_BAGL_CJ(NAME, CITY) VALUES(PNAME, PCITY);
PERSONCOUNT = PERSONCOUNT + SQL%ROWCOUNT;
END ADDPERSON;
PROCEDURE REMOVEPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)) AS
BEGIN
DELETE FROM TAB_FUT_BAGL_CJ WHERE NAME LIKE PNAME AND CITY LIKE PCITY;
PERSONCOUNT = PERSONCOUNT - SQL%ROWCOUNT; END REMOVEPERSON;
PROCEDURE REMOVEPERSON(PID INT) AS
BEGIN
DELETE FROM TAB_FUT_BAGL_CJ WHERE ID = PID;
PERSONCOUNT = PERSONCOUNT - SQL%ROWCOUNT; 
END REMOVEPERSON;
FUNCTION GETPERSONCOUNT RETURN INT AS
BEGIN
RETURN PERSONCOUNT;
END GETPERSONCOUNT;
PROCEDURE PERSONLIST AS
DECLARE
V_ID INT;
V_NAME VARCHAR(100);
V_CITY VARCHAR(100);
BEGIN
IF PERSONCOUNT = 0 THEN
RAISE E_NOPERSON;
END IF;
OPEN PCUR FOR SELECT ID, NAME, CITY FROM TAB_FUT_BAGL_CJ;
LOOP
FETCH PCUR INTO V_ID,V_NAME,V_CITY;
EXIT WHEN PCUR%NOTFOUND;
PRINT ('NO.' + (CAST (V_ID AS VARCHAR(100))) + '    ' + V_NAME + '????' + V_CITY );
END LOOP;
CLOSE PCUR;
END PERSONLIST;
BEGIN
SELECT COUNT(*) INTO PERSONCOUNT FROM TAB_FUT_BAGL_CJ;
END PKG_FUT_BAGL_CJ;
/
  • GBase8s
CREATE OR REPLACE PACKAGE PKG_FUT_BAGL_CJ IS
PERSONCOUNT INT;
Type PCUR is ref CURSOR;
PROCEDURE   ADDPERSON(PNAME   VARCHAR(100),     PCITY
VARCHAR(100));
PROCEDURE REMOVEPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100));
PROCEDURE REMOVEPERSON(PID INT);
FUNCTION GETPERSONCOUNT RETURN INT;
PROCEDURE PERSONLIST;
END PKG_FUT_BAGL_CJ;
CREATE OR REPLACE PACKAGE BODY PKG_FUT_BAGL_CJ AS/IS
E_NOPERSON EXCEPTION;
PROCEDURE ADDPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)) AS
BEGIN
INSERT INTO TAB_FUT_BAGL_CJ(NAME, CITY) VALUES(PNAME, PCITY);
PERSONCOUNT := PERSONCOUNT + sql%rowcount;
END ADDPERSON;
PROCEDURE REMOVEPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)) AS
BEGIN
DELETE FROM TAB_FUT_BAGL_CJ WHERE NAME LIKE PNAME AND CITY LIKE PCITY;
PERSONCOUNT := PERSONCOUNT - sql%rowcount; 
END REMOVEPERSON;
PROCEDURE REMOVEPERSON(PID INT) AS
BEGIN
DELETE FROM TAB_FUT_BAGL_CJ WHERE ID = PID;
PERSONCOUNT := PERSONCOUNT - sql%rowcount;
END REMOVEPERSON;
FUNCTION GETPERSONCOUNT RETURN INT AS
BEGIN
RETURN PERSONCOUNT;
END GETPERSONCOUNT;
PROCEDURE PERSONLIST AS
V_ID INT;
V_NAME VARCHAR(100);
V_CITY VARCHAR(100);
BEGIN
IF PERSONCOUNT = 0 THEN
RAISE E_NOPERSON;
END IF;
OPEN PCUR FOR SELECT ID, NAME, CITY FROM TAB_FUT_BAGL_CJ;
LOOP
FETCH PCUR INTO V_ID,V_NAME,V_CITY;
dbms_output.put_line ('NO.' + (CAST (V_ID AS VARCHAR(100))) + '    ' + V_NAME + '????' + V_CITY );
END LOOP;
CLOSE PCUR;
END PERSONLIST;
BEGIN
SELECT COUNT(*) INTO PERSONCOUNT FROM TAB_FUT_BAGL_CJ;
END PKG_FUT_BAGL_CJ;
/

在GBase 8s中创建包规范与DM类似,但在包体的实现上,GBase 8s使用`AS/IS`关键字,这反映了两种数据库在对象封装方面的细微差异。

2、调用包中的对象

通过包,我们可以将一组相关的数据库对象组织在一起,并在需要时调用它们。

  • DM
CALL PKG_FUT_BAGL_CJ.ADDPERSON('BLACK', '南京');
  • GBase8s
declare
begin
   PKG_FUT_BAGL_CJ.ADDPERSON('BLACK', '南京');
end;
/

在GBase 8s中调用包中的过程或函数时,通常使用declare和begin…end;结构,这有助于在PL/SQL环境中执行包操作。

三、自定义类型(Custom Type)的创建与使用

创建对象类型

对象类型允许用户定义具有多个属性和方法的复杂数据结构。

  • DM
CREATE TYPE TYPE_FUT_ZDY_DXLX AS OBJECT( RPART REAL,
IPART REAL,
FUNCTION PLUS(X TYPE_FUT_ZDY_DXLX) RETURN TYPE_FUT_ZDY_DXLX,
FUNCTION LES(X TYPE_FUT_ZDY_DXLX) RETURN
TYPE_FUT_ZDY_DXLX
);
  • GBase8s
CREATE TYPE TYPE_FUT_ZDY_DXLX AS OBJECT( RPART REAL,
 IPART REAL,
MEMBER FUNCTION PLUS(X TYPE_FUT_ZDY_DXLX) RETURN TYPE_FUT_ZDY_DXLX,
MEMBER FUNCTION LES(X TYPE_FUT_ZDY_DXLX) RETURN TYPE_FUT_ZDY_DXLX
);

创建对象类型体

对象类型体包含对象类型的方法的具体实现。

  • DM
CREATE TYPE BODY TYPE_FUT_ZDY_DXLX AS 
FUNCTION PLUS(X TYPE_FUT_ZDY_DXLX) RETURN TYPE_FUT_ZDY_DXLX IS
BEGIN
RETURN TYPE_FUT_ZDY_DXLX (RPART+X.RPART, IPART+X.IPART);
END;
FUNCTION LES(X TYPE_FUT_ZDY_DXLX) RETURN TYPE_FUT_ZDY_DXLX IS
BEGIN
RETURN TYPE_FUT_ZDY_DXLX (RPART-X.RPART, IPART-X.IPART);
END;
END;
/
  • GBase8s
CREATE TYPE BODY TYPE_FUT_ZDY_DXLX AS 
MEMBER FUNCTION PLUS(X TYPE_FUT_ZDY_DXLX) RETURN TYPE_FUT_ZDY_DXLX IS
BEGIN
RETURN TYPE_FUT_ZDY_DXLX (RPART+X.RPART, IPART+X.IPART);
END;
MEMBER FUNCTION LES(X TYPE_FUT_ZDY_DXLX) RETURN TYPE_FUT_ZDY_DXLX IS
BEGIN
RETURN TYPE_FUT_ZDY_DXLX (RPART-X.RPART, IPART-X.IPART);
END;
END;
/

通过本篇文章深入解析了DM和GBase 8s在函数、包和自定义类型方面的语法和应用差异。这些知识点对于进行数据库迁移和开发具有重要的指导意义。数据库迁移是企业数据战略中的关键一环,正确的迁移策略和实施步骤能够为企业带来长远的利益。南大通用GBase 8s作为新一代数据库系统,其先进的特性和优化的性能为企业数据管理提供了新的解决方案。希望通过本系列文章的指南,能够帮助您顺利完成从DM到GBase 8s的数据库迁移,开启数据管理的新篇章。

原文链接:

https://www.gbase.cn/community/post/3854

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值