第九章 触发器定义
描述触发器定义的结构。
介绍
触发器是在SQL中发生特定事件时执行的代码段。InterSystems IRIS支持基于执行INSERT
、UPDATE
和DELETE
命令的触发器。根据触发器定义,指定的代码将在相关命令执行之前或之后立即执行。每个事件可以有多个触发器,只要它们被分配了执行顺序。
可以向持久类添加触发器定义。它们在其他类中没有意义。
详情
触发器定义具有以下结构:
/// description
Trigger name [ keyword_list ]
{ implementation }
-
description
描述(可选)旨在显示在“类参考”中。默认情况下,描述为空白。 -
name
(必需)是触发器的名称。这必须是有效的类成员名称,并且不能与任何其他类成员名称冲突。 -
keyword_list
(必需)是以逗号分隔的关键字列表,用于进一步定义触发器。 -
implementation
实现(必需)是零行或多行ObjectScript代码,用于定义触发触发器时要执行的代码。
示例
/// 此触发器在每次插入后更新日志表
Trigger LogEvent [ Event = INSERT, Time = AFTER ]
{
// 获取插入行的行id
NEW id
SET id = {ID}
// 将值插入日志表
&sql(INSERT INTO LogTable (TableName, IDValue) VALUES ('MyApp.Person', :id))
}
第十章 扩展数据块
描述XData块的结构。
介绍
XData
块是包含在类定义中的命名数据单元,通常由类中的方法使用。最常见的情况是,它是一个XML文档,但是它可以由其他形式的数据组成,例如JSON
或YAML
。
详情
XData
块具有以下结构:
/// description
XData name [ keyword_list ]
{
data
}
-
description
描述(可选)旨在显示在“类别参考”中。默认情况下,描述为空白。 -
name
(必需)是XData
块的名称。这必须是有效的类成员名称,并且不能与任何其他类成员名称冲突。 -
data
数据(可选)包含扩展数据块的有效载荷。如果是XML,则它必须是格式良好的文档(只有一个根元素),开头没有XML声明。 -
keyword_list
(可选)是以逗号分隔的关键字列表,进一步定义了XData
块。如果省略此列表,也要省略方括号。
示例
Class Demo.CoffeeMakerRESTServer Extends %CSP.REST
{
Parameter HandleCorsRequest = 1
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
<Route Url="/test" Method="GET" Call="test"/>
<Route Url="/coffeemakers" Method="GET" Call="GetAll" />
<Route Url="/coffeemaker/:id" Method="GET" Call="GetCoffeeMakerInfo" />
<Route Url="/newcoffeemaker" Method="POST" Call="NewMaker" />
<Route Url="/coffeemaker/:id" Method="PUT" Call="EditMaker" />
<Route Url="/coffeemaker/:id" Method="DELETE" Call="RemoveCoffeemaker"/>
</Routes>
}
第十一章 类关键字 - Abstract
指定这是否是抽象类。
用法
要将类标记为抽象类,请使用以下语法:
Class MyApp.MyClass [ Abstract ]
{ //class members }
否则,省略此关键字或将单词Not放在关键字的前面。
详解
如果一个类是抽象的,就不能创建它的实例。
对子类的影响
此关键字不是继承的。
默认
如果省略这个关键字,这个类就不是抽象的。
第十二章 类关键字 - ClassType
指定此类的类型(或行为)。
用法
要指定类的类型(如果需要),请使用以下语法:
Class MyApp.MyClass [ ClassType = classtype ]
{ //class members }
其中classtype
是下列之一:
-
datatype
— 该类是一个数据类型类,用于表示文字值。 -
persistent
持久—该类表示要存储在数据库中的数据。 -
serial
—该类表示要存储在另一个持久对象中(处于序列化状态)的数据。 -
stream
—该类表示流数据。 -
view
视图—该类用于定义一个SQL视图。 -
index
—该类是一个索引类,一个定义索引接口的专用类。 - 空字符串,表示此类没有特定类型。抽象类通常不指定类类型。
如果未指定此关键字,则类类型从主超类继承(如果有)。
请注意,ClassType
是为%RegisteredObject
、%SerialObject
、%Persistent
和数据类型类等系统类指定的,因此如果对这些类进行子类化,通常不需要指定此关键字。
详解
此关键字指定如何使用此类。类别编译器使用类别类型关键字来决定如何编译类别。例如,如果ClassType
是持久性的,则类编译器还会调用存储编译器来为类生成持久性代码。除非明确定义,否则ClassType
的值要么是默认值,要么是从主超类继承而来的。
对于持久性类,只有在标准持久性行为被重写时,才需要显式的ClassType
语句。如果一个类定义包含这样的语句,要么是因为开发人员指定了它,要么是因为这个类起源于用旧版本的InterSystems IRIS开发的代码。
对子类的影响
这个关键字是从主超类继承的。子类可以覆盖关键字的值。
默认
如果省略此关键字,类类型将从主超类继承(如果有)。
注意:分片类的类类型不能有持久以外的任何值。