一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

创建自定义数据类型的方法及装置与流程

2022-04-09 06:13:59 来源:中国专利 TAG:


1.本发明涉及数据库技术领域,尤其涉及一种创建自定义数据类型的方法及装置。


背景技术:

2.自定义数据类型即用户自己创建的数据类型,其包括成员属性和成员函数,成员属性即自定义数据类型里定义的变量,成员函数则包括constructor function、member/static function、member/static procedure、map/order member function,对于每一种函数、过程在自定义数据类型中代表的意义都不一样。
3.postgresql数据库中使用【create type name as(属性1,属性2,...);】来创建自定义数据类型,对于同模式下同名的类型,无法创建成功,也无法使用replace功能,该语法进一步限制了类型的创建。
4.oracle数据库中使用【create type name as object(属性1,属性2,...,成员函数,...);】来创建自定义数据类型头,对于成员函数,需要使用【create type body name as成员函数...end;】来实现函数的功能。同模式下同名的类型,可以使用replace来替换该类型。
5.在postgresql数据库中,原生的自定义数据类型语法只支持创建成员属性,不支持创建成员函数且创建的语法上和oracle数据库有较大区别,无法实现从oracle数据库往postgresql数据库的无缝迁移。


技术实现要素:

6.本发明要解决的技术问题是解决postgresql数据库语法和功能上对oracle的兼容,增强postgresql的兼容性、易用性,提升应用迁移效率,本发明提出一种创建自定义数据类型的方法及装置。
7.根据本发明实施例的创建自定义数据类型的方法,包括:
8.s100,创建自定义数据类型头,包括创建成员属性和创建成员函数头;
9.s200,创建自定义类型函数体,包括:
10.判断数据类型是否存在,若不存在,则报错;若存在,则判断函数体是否存在,若不存在,则创建函数体;若存在,则判断是否进行replace,若否,则报错,若是,更新函数体。
11.根据本发明的一些实施例,步骤s100中,创建成员属性具体包括:
12.s111,根据自定义数据类型,在pg_type表、pg_class表和pg_attribute表中插入相应的数据;
13.s112,获取pg_type表中自定义数据类型的oid,取得类型名、类型模式,在pg_namespace表中创建与类型名、类型模式相同的伪模式;
14.s113,判断是否有成员函数头,没有则结束,有则创建成员函数头。
15.在本发明的一些实施例中,步骤s100中,创建成员函数头具体包括:
16.s121,从pg_namespace中获取与类型名、类型模式相同的伪模式,为成员函数头定
义promemberkind值;
17.s122,进行函数创建流程,在pg_proc表中插入相应数据;
18.s123,从创建完函数头返回的数据结构中取得函数的oid,把oid更新到pg_namespace表的nspobjecthead字段中。
19.根据本发明的一些实施例,步骤s200中,判断函数体是否存在包括:
20.s211,根据自定义数据类型的类型名、类型模式从pg_namespace表中获取nspobjecthead字段值;
21.s212,判断成员函数是否在创建的类型头里有声明,如果没有声明,提示错误,如果有声明,则更新或创建函数体。
22.在本发明的一些实施例中,函数体的创建方法包括:
23.s221,填充pg_proc表中的prosrc字段值;
24.s222,从返回的数据结构中取得函数的oid,并更新到pg_namespace表的nspobjectbody字段中。
25.根据本发明的一些实施例,所述方法还包括:
26.在创建自定义数据类型时,判断自定义数据类型是否存在,若不存在,则执行步骤s100,若存在,则判断是否进行replace功能,若不进行,则报错,若进行,则对自定义数据类型进行更新。
27.在本发明的一些实施例中,对自定义数据类型进行更新包括:
28.更新成员属性,包括对pg_type表、pg_class表和pg_attribute表中对应数据进行更新;
29.更新成员函数头,包括:
30.判断自定义数据类型成员函数头是否和原有成员函数头相同,若是,则结束;若否,则移除原成员函数并创建新的成员函数头,更新pg_namespace表的nspobjecthead字段。
31.根据本发明实施例的创建自定义数据类型的装置,包括:
32.第一创建模块,用于创建自定义数据类型头,包括创建成员属性和创建成员函数头;
33.第二创建模块,用于创建自定义类型函数体,包括:
34.判断数据类型是否存在,若不存在,则报错;若存在,则判断函数体是否存在,若不存在,则创建函数体;若存在,则判断是否replace功能,若否,则报错,若是,更新函数体。
35.根据本发明的一些实施例,所述装置还包括:
36.判断模块,用于在创建自定义数据类型时,判断自定义数据类型是否存在,若不存在,则通过所述第一创建模块创建自定义数据类型头;
37.更新模块,用于在判断自定义数据类型存在时,且判断进行replace功能时,对自定义数据类型进行更新。
38.在本发明的一些实施例中,所述更新模块包括:
39.属性更新模块,用于更新成员属性,包括对pg_type表、pg_class表和pg_attribute表中对应数据进行更新;
40.函数更新模块,用于更新成员函数头,包括:
41.判断自定义数据类型成员函数头是否和原有成员函数头相同,若是,则结束;若否,则移除原成员函数并创建新的成员函数头,更新pg_namespace表的nspobjecthead字段。
42.本发明提出的创建自定义数据类型的方法及装置具有如下优点:
43.本发明在原来功能的基础上,重新设计语法和功能,无论是使用postgresql创建自定义数据类型的语法还是使用oracle创建自定义数据类型的语法都可以兼容。极大的提高了数据库的兼容性,提升了产品竞争力。
附图说明
44.图1为根据本发明实施例的数据库系统表间关联关系示意图;
45.图2为根据本发明实施例的创建自定义数据类型的方法中创建自定义数据类型头的方法流程图;
46.图3为根据本发明实施例创建自定义数据类型的方法中创建自定义类型函数体的方法流程图。
47.图4为根据本发明实施例的创建自定义数据类型的装置组成示意图。
48.附图标记:
49.装置100,
50.第一创建模块10,第二创建模块20,判断模块30,更新模块40。
具体实施方式
51.为更进一步阐述本发明为达成预定目的所采取的技术手段及功效,以下结合附图及较佳实施例,对本发明进行详细说明如后。
52.本发明中说明书中对方法流程的描述及本发明说明书附图中流程图的步骤并非必须按步骤标号严格执行,方法步骤是可以改变执行顺序的。而且,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
53.本发明中涉及的相关术语解释如下:
54.模式:即名字空间,它包含命令对象(表、数据类型、函数以及操作符等),创建这些对象时,对象前加的前缀即模式。
55.oid:对象标识符,在数据库中是唯一的存在且用无符号整型数字标识,这个全库唯一的无符号整型数字也被叫着oid。
56.对于postgresql数据库都有对应的系统表来存储元数据,每一个系统表代表的意义不同,存储的元数据也不同。系统表间的关联情况如图1所示。
57.系统表设计:
58.pg_namespace增加字段:
59.字段说明nspparentspace自定义数据类型对应的模式nspobjectoid自定义数据类型的oidnspobjecthead自定义数据类型头中成员函数的oidnspobjectbody实现自定义数据类型成员函数后的oid
60.pg_proc增加字段:
61.字段说明promemberkind自定义数据类型成员函数类型
62.结合图2和图3所示,根据本发明实施例的创建自定义数据类型的方法,包括:
63.s100,创建自定义数据类型头,包括创建成员属性和创建成员函数头;
64.s200,创建自定义类型函数体,包括:
65.判断数据类型是否存在,若不存在,则报错;若存在,则判断函数体是否存在,若不存在,则创建函数体;若存在,则判断是否进行replace,若否,则报错,若是,更新函数体。
66.根据本发明的一些实施例,结合图2所示,步骤s100中,创建成员属性具体包括:
67.s111,根据自定义数据类型,在pg_type表、pg_class表和pg_attribute表中插入相应的数据;
68.s112,获取pg_type表中自定义数据类型的oid,取得类型名、类型模式,在pg_namespace表中创建与类型名、类型模式相同的伪模式;
69.s113,判断是否有成员函数头,没有则结束,有则创建成员函数头。
70.在本发明的一些实施例中,结合图2所示,步骤s100中,创建成员函数头具体包括:
71.s121,从pg_namespace中获取与类型名、类型模式相同的伪模式,为成员函数头定义promemberkind值;
72.s122,进行函数创建流程,在pg_proc表中插入相应数据;
73.s123,从创建完函数头返回的数据结构中取得函数的oid,把oid更新到pg_namespace表的nspobjecthead字段中。
74.根据本发明的一些实施例,结合图3所示,步骤s200中,判断函数体是否存在包括:
75.s211,根据自定义数据类型的类型名、类型模式从pg_namespace表中获取nspobjecthead字段值;
76.s212,判断成员函数是否在创建的类型头里有声明,如果没有声明,提示错误,如果有声明,则更新或创建函数体。
77.在本发明的一些实施例中,结合图3所示,函数体的创建方法包括:
78.s221,填充pg_proc表中的prosrc字段值;
79.s222,从返回的数据结构中取得函数的oid,并更新到pg_namespace表的nspobjectbody字段中。
80.根据本发明的一些实施例,结合图2所示,方法还包括:
81.在创建自定义数据类型时,判断自定义数据类型是否存在,若不存在,则执行步骤s100,若存在,则判断是否进行replace功能,若不进行,则报错,若进行,则对自定义数据类型进行更新。
82.在本发明的一些实施例中,结合图2所示,对自定义数据类型进行更新包括:
83.更新成员属性,包括对pg_type表、pg_class表和pg_attribute表中对应数据进行更新;
84.更新成员函数头,包括:
85.判断自定义数据类型成员函数头是否和原有成员函数头相同,若是,则结束;若否,则移除原成员函数并创建新的成员函数头,更新pg_namespace表的nspobjecthead字
段。
86.根据本发明实施例的创建自定义数据类型的装置100,包括:第一创建模块10和第二创建模块20。
87.其中,第一创建模块10用于创建自定义数据类型头,包括创建成员属性和创建成员函数头;
88.第二创建模块20用于创建自定义类型函数体,包括:
89.判断数据类型是否存在,若不存在,则报错;若存在,则判断函数体是否存在,若不存在,则创建函数体;若存在,则判断是否replace功能,若否,则报错,若是,更新函数体。
90.根据本发明的一些实施例,装置100还包括:判断模块30和更新模块40。
91.其中,判断模块30用于在创建自定义数据类型时,判断自定义数据类型是否存在,若不存在,则通过第一创建模块10创建自定义数据类型头;
92.更新模块40用于在判断自定义数据类型存在时,且判断进行replace功能时,对自定义数据类型进行更新。
93.在本发明的一些实施例中,更新模块40包括:
94.属性更新模块用于更新成员属性,包括对pg_type表、pg_class表和pg_attribute表中对应数据进行更新;
95.函数更新模块用于更新成员函数头,包括:
96.判断自定义数据类型成员函数头是否和原有成员函数头相同,若是,则结束;若否,则移除原成员函数并创建新的成员函数头,更新pg_namespace表的nspobjecthead字段。
97.本发明提出的创建自定义数据类型的方法及装置100具有如下优点:
98.本发明在原来功能的基础上,重新设计语法和功能,无论是使用postgresql创建自定义数据类型的语法还是使用oracle创建自定义数据类型的语法都可以兼容。极大的提高了数据库的兼容性,提升了产品竞争力。
99.下面参照附图详细描述根据本发明的创建自定义数据类型的方法及装置100。值得理解的是,下述描述仅是示例性描述,而不应理解为对本发明的具体限制。
100.创建自定义数据类型时,包括:
101.往pg_type、pg_class、pg_attribute系统表中创建与类型相关的信息。
102.在pg_namespace系统表中创建与类型同名的模式。
103.往pg_proc系统表中创建自定义类型的成员函数。
104.如图2和图3所示,创建自定义数据类型分为两部分,第一部分创建自定义数据类型头,第二部分创建自定义类型函数体。
105.其中,第一部分创建自定义数据类型头方法如下:
106.语法:create[or replace]type name as object(属性1,属性2,...,成员函数,...);
[0107]
流程如图2所示。
[0108]
创建自定义数据类型头分为两个点,第一个点创建成员属性,第二个点创建成员函数头。
[0109]
判断该类型是否已经存在,否:创建新类型,是:是否走replace功能,否,报错,是,
更新该类型。
[0110]
创建新类型中,创建成员属性包括:
[0111]
由系统提供的创建机制往pg_type表中插入一条数据,走表的创建流程,往pg_class和pg_attribute中插入相应的数据。
[0112]
获取pg_type表中类型的oid,取得类型名、类型模式,往pg_namespace表中创建伪模式。
[0113]
判断是否有成员函数头,没有则结束,有则开始创建成员函数头。
[0114]
创建新类型中,创建成员函数头包括:
[0115]
从pg_namespace中获取与类型名、类型模式相同的伪模式,为不同的成员函数头定义promemberkind值,走函数创建流程,往pg_proc表中插入数据,此时表中的prosrc值为空。从创建完函数头返回的数据结构中取得函数的oid,把该oid更新到pg_namespace表的nspobjecthead字段中。
[0116]
更新类型中,更新成员属性包括:
[0117]
更新系统表pg_type,pg_class和pg_attribute中信息。
[0118]
更新类型中,更新成员函数头包括:
[0119]
判断该类型成员函数头是否和旧类型的成员函数头相同,是:结束,否:移除原来的成员函数并创建新的成员函数头,更新pg_namespace表的nspobjecthead字段,移除旧的函数oid并把新函数oid存储在该字段中。
[0120]
第二部分创建自定义类型函数体包括:
[0121]
语法:
[0122]
create[or replace]type body name as
[0123]
函数头as
[0124]
begin
[0125]
pl块
[0126]
end;
[0127]
...
[0128]
end;
[0129]
流程:
[0130]
判断该类型是否存在,否:报错,是:判断函数体是否存在,否,创建函数体,是:是否走replace功能,否,报错,是,更新函数体。
[0131]
更新、创建函数体包括:
[0132]
根据类型名、类型模式从pg_namespace表中取得nspobjecthead字段值,判断成员函数是否在创建的类型头里有声明,如果没有声明,提示错误,如果有声明,走函数更新或创建流程,填充pg_proc表中的prosrc字段值,填充完后,从返回的数据结构中取得函数的oid,把该oid更新到pg_namespace表的nspobjectbody字段中。
[0133]
需要说明的是,自定义数据类型的设计是一种面向对象的设计思想,包含了成员属性和成员函数,在postgresql数据库中,只实现了成员属性,没有实现成员函数功能,这极大的限制了使用,如果是从oracle迁移到postgresql数据库中,涉及到自定义数据类型部分的功能就无法迁移成功,这极大的限制了用户的使用。
[0134]
本发明的出现,在原来功能的基础上,重新设计语法和功能,无论是使用postgresql创建自定义数据类型的语法还是使用oracle创建自定义数据类型的语法都可以兼容。极大的提高了数据库的兼容性,提升了产品竞争力。
[0135]
通过具体实施方式的说明,应当可对本发明为达成预定目的所采取的技术手段及功效得以更加深入且具体的了解,然而所附图示仅是提供参考与说明之用,并非用来对本发明加以限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献