文章
· 七月 22, 2021 阅读大约需 4 分钟

关键字触发器定义,扩展数据块,类关键字Abstract,ClassType

第九章 触发器定义

描述触发器定义的结构。

介绍

触发器是在SQL中发生特定事件时执行的代码段。InterSystems IRIS支持基于执行INSERTUPDATEDELETE命令的触发器。根据触发器定义,指定的代码将在相关命令执行之前或之后立即执行。每个事件可以有多个触发器,只要它们被分配了执行顺序。

可以向持久类添加触发器定义。它们在其他类中没有意义。

详情

触发器定义具有以下结构:

/// 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文档,但是它可以由其他形式的数据组成,例如JSONYAML

详情

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开发的代码。

对子类的影响

这个关键字是从主超类继承的。子类可以覆盖关键字的值。

默认

如果省略此关键字,类类型将从主超类继承(如果有)。

注意:分片类的类类型不能有持久以外的任何值。

讨论 (0)1
登录或注册以继续