如何使用 DM 数据类型

分类:编程技术 时间:2024-02-20 16:15 浏览:0 评论:0
0
本文主要讲解“如何使用DM数据类型like”。文章中的讲解内容简单明了,易学易懂。请大家按照小编的思路慢慢深入,一起研究学习《DM数据类型》。喜欢怎么用!”

类类型
DM7通过类类型在DMSQL程序中实现面向对象的编程支持。类封装了结构化数据以及对其进行操作的过程或函数。允许用户对现实世界的对象进行建模,而不必将其抽象为关系数据。

DM7的类类型分为普通类类型和JAVA CLASS类型。除非DM文档中的示例特别声明JAVA CLASS

常见的CLASS类型
DM7中类的定义分为类头和类体两部分,类头完成了类的声明;类体完成实现班级的情况。该类可以包括以下内容:
1。类型定义
在类中,可以定义游标、异常、记录类型、数组类型、内存索引表等数据类型。在类的声明和实现中,可以使用这些数据类型;游标和异常不能在类声明中声明,但可以在实现中定义和使用。
2.属性
属性类中成员变量的数据类型可以是标准数据类型,也可以是类中自定义的特殊数据类型。
3.成员方法
类中的函数或过程在类头中声明;它的实现是在类体中完成的;
成员方法和后面的构造函数都包含一个隐式参数,即self对象。在方法实现中,可以通过this或者self来访问self对象。自我相当于这个。如果不存在重名问题,还可以使用property直接调用对象的方法和方法。 this 和 self 只能从包或对象脚本中调用。

4.构造函数
构造函数是在类中定义和实现的特殊函数。此类函数用于实例化类的对象。构造函数满足以下条件:
1)函数名和类名相同;
2)函数返回值类型是它自己的类。
构造函数有以下约束:
1)系统为每个类提供了两个默认构造函数,即零参数构造函数和全参数构造函数;
2)类的参数个数0参构造函数为0,实例对象中所有属性的初始化值为NULL;
3)全参构造函数的参数个数和类型与实例对象的个数和属性相同类中的属性。按照属性的顺序读取参数的值并赋值​​到属性;
4)用户可以自定义构造函数。一个类可以有多个构造函数,但每个构造函数的参数个数必须不同;
5) 如果用户自定义了0个参数,或者参数个数与属性个数相同的构造函数将覆盖相应的默认构造函数。

下面从类的声明、类的实现、类的删除、类体的删除和类的使用来详细描述类类型的实现过程。
类的声明是在类头中完成的。类头定义是通过CREATE CLASS语句完成的。语法为:
语法格式
CREATE [OR REPLACE] CLASS [<模式名称>.]<类名称> [WITH ENCRYPTION] [UNDER [<模式名称>.]<父类名称>] [[非] 最终] [[非]
可实例化] [AUTHID DEFINER | AUTHID CURRENT_USER] AS|IS <类声明列表> END [类名]
<类内声明列表> ::= <类内声明>;{<类内声明>;}
<类内声明> ::= <变量定义>|<过程定义>|<函数定义> |<类型声明>
<变量定义> ::= <变量名称列表> <数据类型> [默认值定义]
<过程定义> ::= [<方法继承属性> ][STATIC |MEMBER] PROCEDURE <过程名称> <参数列表>
<函数定义> ::= [<方法继承属性>] [MAP] [STATIC|MEMBER] FUNCTION <函数名称><参数列表> RETURN <返回值数据类型>[DETERMINISTIC]
[PIPELINED]
<方法继承属性> ::= <重载属性> | | <重载属性>
<重载属性> ::= [NOT] OVERRDING
::= FINAL |非最终版 |可实例化|不可实例化
<类型声明> ::= TYPE <类型名称> IS <数据类型>

使用说明
1.类中的元素可以按任意顺序出现,对象必须在引用之前声明d;
2.过程和函数的声明是前向声明,类声明不包含任何实现代码;
3.支持对象静态方法声明和调用。可以在PROCEDURE/FUNCTION关键字前添加static保留字来表明该方法是静态方法。静态方法只能用对象名前缀调用,不能在对象实例中调用;
4.支持对象成员方法的声明和调用。您可以在 PROCEDURE/FUNCTION 关键字之前添加 MEMBER 以指示该方法是成员方法。 MEMBER 和 STATIC 不能同时使用。非 STATIC 类型的非构造函数方法默认为成员方法。 MAP表示将对象类型的实例映射到标量值,只能用于成员类型的FUNCTION;
5.关于类继承,有以下使用限制:
1)类定义默认为FINAL,表示对象类型不能被继承。定义父类时必须指定NOT FINAL选项;
2)定义子类时必须指定UNDER选项;
3)NOT INSTANTIABLE对象不能是FINAL;
4) NOT INSTANTIABLE对象不能被实例化,但可以由其子类为其赋值;
5)当对象被实例化时,必须同时给父类和子类的成员变量赋值,并从父类向子类一一赋值;
6)不支持对象的循环继承;
7)不支持对象的多重继承,即一个A类有多个父类;
6) 不支持对象的循环继承;
7) 不支持对象的多重继承,即一个类有多个父类;
8) 不支持支持父类和子类包含同名变量;
9)父类和子类可以有相同的变量名称和参数相同。这种情况下,子类必须指定OVERRIDING;
10)方法默认为NOT OVERRIDING,并且OVERRIDING不能与static一起使用。使用;
11)父类和子类支持同名不同参数的方法(参数个数不同、参数个数相同但类型不同);
12)当同名且支持相同数量不同类型的参数,根据参数类型选择使用的方法;
13)方法默认为INSTANTIABLE。如果声明为NOT INSTANTIABLE,则不能与FINAL和STATIC一起使用;
14)如果父类有多个NOT INSTANTIABLE方法,子类只能部分重写,但此时子类必须定义为NOT FINAL NOT INSTANTIABLE;
15) NOT INSTANTIABLE 方法不能有主体;
16) 该方法默认为 NOT FINAL。如果声明为 FINAL,则不能被子类覆盖;
17) 子类 can 给父类赋值;
18)如果父类对应的实例是子类或者子类的子类,则可以将父类赋值给子类;
19)子类可以用INSTANTIABLE给父类赋值NOT INSTANTIABLE的值;
20)子类实例赋值给父类后,调用时使用父类方法而不是子类方法;
21) 支持使用as语句转换为父类。

所需权限
1.使用该语句的用户必须是DBA或者具有CREATE CLASS数据库权限的用户;
2.您可以使用关键字 AUTHID DEFINER |AUTHID CURRENT_USER 来指定该类的调用者权限。如果是DEFINER,则采用类定义者权限。如果是CURRENT_USER,就是当前用户的权限。默认是类定义者权限。

类的实现是通过类体完成的。定义类体的初始化是通过CREATE CLASS BODY语句完成的,其语法为:
语法格式
CREATE [OR REPLACE] CLASS BODY [.] [WITH ENCRYPTION]作为| IS <类主体部分> END [类名]
<类主体部分> ::= <过程/函数列表> [<初始化代码>]
<过程/函数列表> ::= <过程实现|函数实现>{,<流程实现|函数实现>}
<流程实现> ::= [<方法继承属性>][STATIC|MEMBER]PROCEDURE <流程名称> <参数列表> AS|IS BEGIN <实现> END [过程名称]
<函数实现> ::= [<方法继承属性>][MAP] [STATIC|MEMBER]FUNCTION <函数名称><参数列表> RETURN <返回值数据类型>[DETERMINISTIC] [PIPELINED] AS|IS BEGIN <实现> END [函数名称]
<方法继承属性> ::= <重载属性> | | <重载属性>
<重载属性> ::= [NOT] OVERRDING
::= 最终 |非最终版 |可实例化| NOT INSTANTIABLE
<初始化代码> ::= [[<执行部分>]BEGIN<执行部分>[<异常处理部分>]]
<描述部分> ::=[DECLARE]<描述定义>{<描述定义>}
<描述定义>::=<变量描述>|<异常变量描述>|<光标定义>|<子过程定义>|<子函数定义>
<变量描述>::=<变量名称>{,<变量名称>}<变量类型>[DEFAULT|ASSIGN|:=<表达式>];
<变量类型>::=|<[架构名称.]表名称.列名%TYPE>|<[架构名.]表名%ROWTYPE>|<记录类型>
<记录类型>::= RECORD (<变量名> {,<变量名> })< br/><异常变量描述>::=<异常变量名称>EXCEPTION[FOR<错误号>]
<异常处理语句>::= WHEN <异常名称> THEN

使用说明
1.类声明中定义的对象对于类 bo 是可见的dy ,无需声明即可直接引用。这些对象包括变量、游标、异常定义和类型定义;
2.类主体中的过程和函数定义必须与类声明中的声明完全相同。包括过程名称、参数定义列表的参数名称和数据类型定义;
3.一个类可以有同名的成员方法,并且它们的参数定义列表要求不同。系统会根据用户的调用进行过载(OVERLOAD);
4.声明和实现类时,指定确定性函数的逻辑与包中函数的逻辑相同。目前不支持在函数索引中使用类的确定性函数。

所需权限
使用该语句的用户必须是DBA或该类型对象的所有者,并且是具有CREATE CLASS数据库权限的用户。
完整的类头和类体的创建如下:
----类头创建

SQL> create or replacement class mycls2 as3 type rec_type is record (c1 int , c2 int); --类型声明4 id int; --成员变量5 r rec_type; --成员变量6 function f1(a int, b int) return rec_type; --成员函数 7 function mycls(id int, r_c1 int, r_c2 int) return mycls;8 --用户自定义构造函数 9 end;10 /执行成功使用时间:14.032(ms)。执行id为106。

----类体创建

SQL>创建或替换类体mycls2 as3 function f1(a int, b int) return rec_type4 as5 begin6 r. c1 = a;7 r.c2 = b;8 return r;9 end;10 function mycls(id int, r_c1 int, r_c2 int) return mycls11 as12 begin13 this.id = id; ——是的,用这个。访问它自己的成员14 r.c1 = r_c1; --this也可以省略15 r.c2 = r_c2;16 return this; --use return this 返回这个对象17 end;18 end;19 /执行成功使用时间: 61.783(ms)。执行 ID 为 107。

Recompile the class
重新编译该类。如果重新编译失败,请将类设置为禁用状态。
重编程函数主要用于检查类的正确性。
语法格式
ALTER CLASS [.] COMPILE [DEBUG];

参数
1. <模式名称>表示重新编译的类所属的模块。公式;
2. 表示重新编译后的类的名称;
3. [DEBUG] 可以忽略。

所需权限
执行此操作的用户必须是类的创建者,或者具有DBA权限。
示例
例如重新编译类

SQL> ALTER CLASS mycls COMPILE;执行成功使用时间:8.867(ms)。执行id为108。

删除删除类有两种方法:一是删除类头。删除类头也会删除类体;另一种是删除类体。该方法只能删除类体。 ,类头仍然
存在。

删除类头
类的删除是通过DROP CLASS完成的,即类头的删除。删除类头时,类体也会被删除。
语法格式
DROP CLASS [<架构名称>.]<类名称>[RESTRICT |级联];使用说明
1.如果删除的类不属于当前schema,则必须在语句中指定schema名称;
2.如果删除类声明,相应的类体也会自动删除。

所需权限
执行此操作的用户必须是类的所有者,或者具有 DBA 权限。

删除类主体
从数据库中删除类的实现主体对象。
语法格式
DROP CLASS BODY [<架构名称>.]<类名称>[RESTRICT |级联];使用说明
如果删除的类不属于当前schema,则必须在语句中指定schema名称。
许可ns
执行此操作的用户必须是类的所有者或具有DBA权限。

类的使用
类类型与普通数据类型相同。它们可以用作表中列的数据类型,DMSQL程序语句块中变量的数据类型,或者过程和函数参数的数据类型。

具体使用规则
1.不能修改表中列类型的类或其他类成员变量的属性。删除时需要指定CASCADE来删除类中定义的数据类型。它的名字只在类的声明和实现中有效。如果类内函数的参数或返回值是类内的数据类型,或者类内的成员变量被复制,则需要在DMSDefine中配置与QL程序中结构相同的类型。

根据类使用方式的不同,对象可以分为变量对象和列对象umn 对象。变量对象是指DMSQL程序语句块中声明的类类型变量;列对象指的是表中的类类型列。变量对象可以修改其属性的值,而列对象则不能。

2.变量对象的实例化
类的实例化是通过用NEW表达式调用构造函数来完成的。
3.变量对象的引用
类类型变量之间通过‘=’赋值,是对对象的引用,并不复制一个新的对象。

4.变量对象属性访问
属性可以通过以下方式访问。
<对象名称>.<属性名称>
5.变量对象成员方法调用
成员方法调用的调用方式如下:
<对象名>.<成员方法名>(<参数>{,<参数>})
如果函数内如果修改了对象内部的某个属性的值,修改就会生效。
6. INS列对象的创建
列对象的创建是通过INSERT语句向表中插入数据来完成的。 insert语句中的值是变量对象,插入后存储在表中的数据是列对象。
7.列对象的副本
存储在表中的对象不允许修改对象中的成员变量。通过 into 查询或“=”将列分配给变量就是对象的赋值,生成列对象数据的 A 副本。对此副本进行的修改不会影响表中列对象的值。
8.列对象的属性访问
通过以下方法访问属性:
<列名>.<属性名>
9.列对象的方法调用
<列名>.<成员方法名>(<参数>{,<参数>})
列对象的方法调用过程中对类型内属性的修改为全部在副本上完成列对象的值,并且不影响列对象的值。

应用示例
1.变量对象的应用实例

SQL>declare2 type ex_rec_t is record(a int, b int); --使用具有相同结构的类型 Type 3 & 替换类定义nbsp;rec ex_rec_t;4 o1 mycls;5 o2 mycls;6 begin7 o1 = new mycls(1,2,3);8 o2 = o1; --对象引用 9 rec = o2.r; --变量对象Access的成员变量 10 print rec.a;打印rec.b;11 rec = o1.f1(4,5); -- 成员函数调用12 print rec.a;打印rec.b;13 打印o1.id; -- 成员变量Access 14 end;15 /23451DMSQL执行成功使用时间:3.129(ms)。执行 ID 为 109。

2.列对象的应用实例
创建表。

SQL> 创建表 tt1(c1 int, c2 mycls);执行成功使用时间:28.302(ms)。执行id为112。

创建列对象--插入数据。

SQL> 插入 tt1 值(1, mycls(1,2,3));影响行 1 使用时间:22.639(毫秒)。执行id为113.SQL> commit;执行成功使用时间:17.285(ms)。执行 ID 为 114 。

复制和访问列对象。

SQL> statements2 o mycls;3 id int;4 begin5 select top 1 c2 into o from tt1; --复制列对象6 select top 1 c2.id into id from tt1; --column object 成员访问 7 end;8 /DMSQL执行成功使用时间:33.518(ms)。执行 ID 为 115。

3.类继承应用示例

SQL> CREATE OR REPLACE CLASS cls01 NOT FINAL IS2 name VARCHAR2(10);3MEMBER FUNCTION get_info RETURN VARCHAR2;4 END;5 /执行成功使用时间:22.220(ms)。执行 ID 为 116.SQL> 在 cls01 IS2 ID INT 下创建或替换类 cls02;3 覆盖成员函数 get_info RETURN VARCHAR2;4 END;5 / 成功执行使用时间:14.072(毫秒)。执行id为117。

JAVA CLASS类型
JAVA类的定义与JAVA语言语法类似,可以在类中定义。
JAVA 类可以包括以下内容:
1.类型定义
类中可以定义游标、异常,声明记录类型、数组类型、结构体类型、内存索引表等数据。类型变量。
2.属性类中的成员变量,数据类型可以是标准数据类型,也可以是类外部自定义的特殊数据类型。
3.成员方法
JAVA类中的成员方法以及下面的构造函数都包含一个隐式参数,这个参数就是self对象。在方法实现中,可以通过this或者self、self等访问self对象。以this为定价。如果不存在重名问题,也可以直接使用对象的属性和方法。
4.构造函数
构造函数是在类中定义和实现的特殊函数。此类函数用于实例化类的对象。构造函数满足以下条件:
1)函数名和类名相同;
2)函数没有r返回值类型。
结构体对构造函数有如下约束:
1)系统为每个类提供了两个默认的构造函数,即一个0参数构造函数和一个全参数构造函数;
2)0参数构造函数构造函数参数个数为0,实例对象中所有属性初始化值为NULL;
3)全参数化构造函数参数个数和类型与属性个数和属性相同在类中,按照属性的顺序。依次读取参数的值,并给属性赋值;
4)用户可以自定义构造函数。一个类可以有多个构造函数,但每个构造函数的参数个数必须不同;
5)如果用户定义了0个参数的构造函数,或者参数个数与属性个数相同,则相应的默认构造函数将被覆盖。

定义JAVA类
定义是通过CREATE JAVA CLASS语句完成的,语法为:
语法格式
CREATE [OR REPLACE] JAVA [PUBLIC] [ABSTRACT] [ FINAL] CLASS <类名> [ EXTENDS [<模式名称>.]<父类名称>] {<类定义部分> }
<类定义部分> ::= <类定义列表>< br/><类内定义列表> : := <类内定义>;{<类内定义>;}
<类内定义> ::= [PUBLIC|PRIVATE] <变量定义>|<方法定义>
<变量定义> ::= <变量属性> <数据类型><变量名称列表> [默认值定义]
<变量属性> ::= [STATIC]
<方法定义> ::= [ PUBLIC|PRIVATE] [<方法继承的属性>] [STATIC] <返回类型> <函数名称><参数列表> { <实现主体> }
<方法继承的属性> :: = <重载属性> | |
::= ABSTRACT
::= FINAL
<重载属性> ::= OVERRIDE

使用说明
1. 类中的元素可以出现我n 任何顺序,对象必须在引用之前声明。
2.支持对象静态方法声明和调用。可以在方法前添加static保留字,表明该方法是静态方法。静态方法只能使用对象名前缀调用,不能在对象实例内调用。
3.支持对象成员方法的声明和调用。非 STATIC 类型的非构造函数方法默认为成员方法。调用成员方法时,需要先实例化,实例化参数值默认为null。
4.变量定义还包括游标和异常定义。
5.如果方法属性是PUBLIC,则在访问类的时候就可以访问到。如果是PRIVATE属性,则访问类时无法访问该方法。
6.关于JAVA类继承,有以下使用限制:
1)JAVA CLASS定义默认可以继承,FINAL表示不能继承类不能被继承;
2) 定义子类时必须指定 EXTENDS 选项;
3) ABSTRACT 对象不能是 FINAL;
4) ABSTRACT 对象不能被实例化,但是可以和它的子类一起赋值;
5)子类对象实例化时,父类和子类的成员变量都必须被赋值,并且值是从父类一一赋值的到子类;
6)不支持对象的循环继承;
7)不支持对象的多重继承,即一个类只能有一个父类;
8) 不支持父类和子类包含同名变量;
9) 父类和子类可以有相同的名称和相同的参数,这种情况下子类必须指定OVERRIDE;
10)方法默认为NOT OVERRIDING,OVERRIDING不能与static一起使用;
11)父类和子类支持方法wi名称相同但参数不同(参数个数不同,参数个数相同但类型不同);
12)名称相同且参数个数相同但类型不同时,该方法为根据参数类型选择使用;
13)如果方法声明为ABSRACT,则不能与FINAL和STATIC一起使用;
14)如果父类有多个ABSTRACT方法,子类只能部分重写它,但此时子类必须定义为ABSTRACT;
15)ABSTRACT方法不能有主体;
16)该方法默认是可继承的。如果声明为FINAL,则不能被子类重写;
17)子类可以赋值给父类;
18)如果父类对应的实例是子类或者子类子类,然后可以将父类分配给子类。 Class;
19) ABSTRACT子类可用于给非ABSTRACT父类赋值classes;
20) 子类实例赋值给父类后,调用时使用父类方法,而不是子类方法;
21) 支持使用super无参数方法将方法转换为父类的引用;
22) 支持使用this()调用类的构造函数,使用super()来调用调用父类的构造函数;
23)子类必须有新的成员或方法,并且不能完全为空。

重新编译JAVA类
重新编译JAVA类。如果重新编译失败,请将JAVA类设置为禁用状态。
重编程功能主要用于检查JAVA类的正确性。
语法格式
ALTER JAVA CLASS [.] COMPILE [DEBUG];
参数
1. 表示重新编译后的JAVA类所属的模式;
2.指定要重新编译的JAVA类的名称;
3. [DEBUG] 可以忽略。

所需权限
您执行此操作的ser必须是JAVA类的创建者,或者具有DBA权限。
12.2.3 删除JAVA类
JAVA类的删除是通过DROP CLASS完成的。
语法格式
DROP CLASS <类名>[RESTRICT | CASCADE];

类的使用
下面是一个简单的应用示例。如何在列对象上使用 JAVA CLASS。
1.创建 JAVA 类。

SQL> create or replacement java class jcls2 {3 int a;4 public static int testAdd2(int a, int b)5 { //这里创建的是静态STATIC方法 6 return a + b ; 7 }8 public int testAdd3(int a, int b, int c)9 { //这里创建的是成员方法 10 return a + b +c;11 }12 };13 /执行成功used time: 16.964(ms) 。执行id是123.

2.在列对象中使用 JAVA CLASS。

SQL> create table tt2(c1 int, c2 jcls);执行成功使用时间:9.261(ms)。执行 id 为 124.SQL> insert into tt2 value(jcls.testadd2(1,2), jcls(1)); //静态方法调用2 /affect第 1 行使用时间:1.255(ms)。执行id为125.SQL> insert into tt2 values(jcls().testadd3(1,2,3),jcls(2)); //成员方法必须在调用之前实例化 2 /影响行 1used time: 1.023(ms). execute id is 126。

感谢您的阅读,以上是《如何使用DM数据类型》之类的“使用”内容。学习完该文章,相信大家都有了更深入的了解DM数据类型like如何使用,具体用法需要在实践中验证,下面是小编为您推送的,更多相关知识点文章,敬请关注!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何使用 DM 数据类型

用户评论