#Caché

1 关注者 · 982 帖子

  

InterSystems Caché 是一个多模型 DBMS 和应用服务器。

查看此处提供的更多详细信息

文档

文章 姚 鑫 · 八月 30, 2021 9m read

第一章 SQL命令 ALTER TABLE(一)

修改表。

大纲

ALTER TABLE table alter-action

where alter-action is one of the following:
     ADD  [(] add-action {,add-action} [)] |
     DROP [COLUMN ] drop-column-action {,drop-column-action} |
     DROP drop-action |
     DELETE drop-action |
     ALTER [COLUMN] field alter-column-action |
     MODIFY modification-spec {,modification-spec}
     RENAME table

add-action ::= 
     [CONSTRAINT identifier]
     [(] FOREIGN KEY (field-commalist) 
          REFERENCES table (field-commalist)
          [ON DELETE ref-action] [ON UPDATE ref-action] 
          [NOCHECK]  [)]
  
0
0 197
文章 姚 鑫 · 八月 30, 2021 12m read

第0讲 前言

自我介绍

大家好,我简单的自我介绍一下,我是姚鑫,

为什么开这次的课程

首先Caché,M这门技术相对比较冷门,资料方面都是英文,没有系统的相关资料,记得刚入职时学习的东西都是很基础的,稍微有一些复杂的结构变化,就不知道如何下手。之后,群里的小伙伴总有人问我,希望我出一个系统的Caché视频,这件事我也酝酿了很久,目的就是帮助到更多的同学,让每个小伙伴在日后的工作学习中能更加的得心应手。遇到困难或问题时,大家可以随时在群里咨询,群里的氛围很和谐,有很多热心的大佬,不会说有那种自己觉得简单的问题,不好意思问,没人回答的情况。只要你觉得是个问题就可以发出来。

因为这段时间比较忙,准备的比较仓促,可能有一些内容会有遗漏,大家有啥想法可以群里留言,会后可以答疑,大家可以提出来,一起探讨一下,后续的会准备的更加充分一些。

课程特点

  • 本次课程什么时候讲完什么时候结束。
  • 全方位无死角覆盖所有知识点,讲解详细,上手容易。
  • 内容实际,实用性强,每个知识点都可以找到对应的参考实例。

受众

  • 0基础刚接触Caché的同学。
  • 有一定接触,但是对一些细节和概念不清楚的同学。
  • 想掌握更多编程细节的同学。

效果

  • 可以掌握Caché编程所有的知识点,避免对一些冷门只是无从下手。
  • 对于一门技术而言,只有对其了解足够深入,才能用最浅,通俗的话语将其描述出来。做到深入浅出就是本次课程的一个主要目标
0
1 481
文章 姚 鑫 · 八月 29, 2021 6m read

第一章 SQL中使用的符号

SQL中用作运算符等的字符表

符号表

每个符号的名称后跟其ASCII十进制代码值。

符号名称和用法
[space] or [tab]空白(制表符(9)或空格(32)):关键字、标识符和变量之间的一个或多个空白字符。
!感叹号(33):条件表达式中谓词之间的或逻辑运算符。用于WHERE子句、HAVING子句和其他地方。在SQL Shell命令用于发出ObjectScript命令行。
!=感叹号/等号:不等于比较条件。
"引号(34):包含一个分隔的标识符名称。在动态SQL中,用于将类方法参数的文字值括起来,例如将SQL代码作为%Prepare()方法的字符串参数,或者将输入参数作为%Execute()方法的字符串参数。在%PATTERN中,用于将文字值包含在模式字符串中。例如,'3L1"L".L'(意思是3个小写字母,后面跟着大写字母“L”,后面跟着任意数量的小写字母)。在XMLELEMENT中,用于括起标记名字符串。
""两个引号:本身是无效的分隔标识符。在分隔标识符内,文字引号字符的转义序列。例如,"a""good""id"
#井号(35):有效的标识符名称字符(不是第一个字符)。前后带有空格的模算术运算符。对于嵌入式SQL,是ObjectScript宏预处理器指令前缀。例如,#include。在
0
0 1515
文章 姚 鑫 · 八月 27, 2021 2m read

第153章 Storage关键字 - SqlRowIdProperty

指定SQL RowId属性。

大纲

<SqlRowIdProperty>prop</SqlRowIdProperty>

该元素的值是一个SQL标识符。

描述

此元素仅由从早期InterSystems产品迁移的类使用。

默认值

<SqlRowIdProperty>元素的默认值为空字符串。

第154章 Storage关键字 - SqlTableNumber

指定内部SQL表号。

大纲

<SqlTableNumber>123</SqlTableNumber>

该元素的值是一个表号。

描述

此元素仅由从早期InterSystems产品迁移的类使用。

默认值

<SqlTableNumber>元素的默认值为空字符串。

第155章 Storage关键字 - State

指定用于串行对象的数据定义。

大纲

<State>state</State>

此元素的值是此存储定义中的数据定义的名称。

描述

对于串行(嵌入式)类,此关键字指示使用哪个数据定义来定义对象的序列化状态(序列化时对象属性的排列方式)。这也是默认数据定义,默认结构生成器将向其添加未存储的属性。

默认值

<State>元素的默认值为空字符串。

第156章 Storage关键字 - StreamLocation

指定流属性的默认存储位置。

0
0 130
文章 姚 鑫 · 八月 26, 2021 2m read

第149章 Storage关键字 - IdFunction

指定使用默认存储为持久类分配新ID值的系统函数。

大纲

<IdFunction>increment</IdFunction>

这个元素的值可以是increment(使用$increment函数)或sequence(使用$sequence函数)。

描述

如果持久化类不使用IdKey来确定对象ID值,则该元素允许指定用于分配ID值的函数($increment函数或$sequence函数)。

如果类使用$increment函数,则通过对<IdLocation>元素中定义的全局位置中存储的值进行递增来创建新的id。

如果类使用$sequence函数,它可能会保留id块,以便在快速数据摄入的情况下获得更快的速度。 如果没有使用所有保留的ID,则可能导致ID号之间的空白。 当随后的数据被吸收时,这些空白可能会也可能不会被填补。 一个副作用是,具有较高ID的类的实例不一定比具有较低ID的类的实例更新。 此外,在<IdLocation>元素中定义的全局位置上的值与当前分配的任何id都不直接相关。

默认值

<IdFunction>元素的默认值是使用类定义创建的类的递增值。

<IdFunction>元素的默认值是使用DDL CREATE TABLE语句创建的类的序列。

第150章 Storage关键字 - IdLocation

指定

0
0 146
文章 Jingwei Wang · 八月 25, 2021 4m read

Object Script(二)

ObjectScript没有定义任何保留字:你可以自由地使用任何字作为标识符(如变量名)。为了达到这个目的,ObjectScript使用了一组内置的命令以及特殊的字符(比如函数名的"$"前缀),以便将标识符与其他语言元素区分开来。

示例

含义

abc^def

调用routine中的一个标签:

def是一个routine,abc是该routine中的一个标签。

i%abcdef

i%<PropertyName>

用于从实例变量自身的Get或Set访问器方法中引用该变量,或者绕过其Get或Set方法

abc->def

这种语法只在InterSystems的SQL语句中可以使用。它指定了一个隐含的左外连接。abc是你正在查询的类中的一个对象值字段,def是子类中的一个字段。

abc?def

一个问号是模式匹配操作符,测试变量abc中的值是否与def中指定的模式相匹配

abc[def

左括号([)是二进制包含运算符。这个表达式检测字符串"abc "是否包含字符串 "def"

abc]def

0
0 458
文章 姚 鑫 · 八月 25, 2021 2m read

第145章 XData关键字 - XMLNamespace

指定XData块所属的XML名称空间。

用法

要指定XData块所属的XML名称空间,请使用如下语法:

XData name [ XMLNamespace = "namespaceURL" ] { }

其中namespaceURLXML名称空间的URI。 注意,这一项是用双引号括起来的。

详情

该关键字指定XData块所属的XML名称空间。

默认

如果省略这个关键字,则该XData块的内容不属于任何名称空间。

示例

XData MyXData [ XMLNamespace = "http://www.mynamespace.org" ]
{
}

第146章 Storage关键字 - DataLocation

指定该类的数据存储位置。

大纲

<DataLocation>^Sample.PersonD</DataLocation>

element的值是一个全局变量名称,具有可选的前导下标。

描述

一个表达式,它是存储该类数据的位置。 通常这将是一个全局变量引用,如^User.PersonD。 全局变量引用还可以包含一个或多个前导下标。 例如, ^User.Data("Person")

在从属类(父-子关系中的子类)中使用{%%PARENT}代替全局或局部变量名也是有效的。 例如,{%%PARENT}(Chil

0
0 140
文章 姚 鑫 · 八月 24, 2021 2m read

第141章 触发器关键字 - UpdateColumnList

指定一个或多个列,其修改将导致SQL触发触发器。 仅对TSQL可用。

用法

要指定其修改触发触发器的列,请使用以下语法:

Trigger name [ Event = sqlevent, UpdateColumnList = updatecolumnlist ]  {    //implementation }

其中updatecolumnlist是一个列名或用逗号分隔的列名列表,用括号括起来。

详情

该关键字指定一个或多个列,其修改将触发触发器。 注意,此关键字仅对TSQL可用。

第142章 XData关键字 - Internal

指定这个XData块是否是内部的(不在类文档中显示)。 注意,类文档目前根本没有显示XData

用法

要指定这个XData块是内部的,请使用以下语法:

XData name [ Internal ]  { }

否则,忽略该关键字或将Not放在该关键字之前。

详情

类文档中不显示内部类成员。 如果希望用户看到一个类而不是它的所有成员,则此关键字非常有用。

注意,类文档目前根本没有显示XData块。

第143章 XData关键字 - MimeType

指定XData块的MIME类型。

用法

要指定XData块的MIME类型,请使用如下语法:

XData name [ MimeTyp
0
0 127
文章 姚 鑫 · 八月 23, 2021 2m read

第137章 触发器关键字 - OldTable

指定存储受事件影响的行或语句的旧值的转换表的名称。

用法

要指定存储旧值的转换表的名称,请使用以下语法:

Trigger name [ Event = sqlevent, OldTable = oldtable, NewTable = newtable ] {    //implementation }

其中oldtable是此命名空间中的SQL表的名称。

详情

每个触发器都可以通过转换表(由旧表和新表关键字指定)访问受事件影响的行或语句的旧值和新值。

默认

默认值为空字符串。

第138章 触发器关键字 - Order

在同一个EVENTTIME有多个触发器的情况下,指定触发器应该触发的顺序。

用法

要指定此触发器的触发顺序,相对于具有相同EVENTTIME的其他触发器,请使用以下语法:

Trigger name [ Event = sqlevent, Order = n, Time = time ] {    //implementation }

其中n为整数。

详情

在同一个EVENTTIME有多个触发器的情况下,该关键字指定触发器应该触发的顺序。

默认

默认值为0

第139章 触发器关键字 - SqlName

指定用于此触发器的SQL名称。

用法

要覆盖此触发器的默认SQL名称,请使用以下语法:

Trigger
0
0 111
文章 姚 鑫 · 八月 22, 2021 3m read

第133章 触发器关键字 - Foreach

控制触发器何时被触发。

用法

Trigger name [ Event = sqlevent, Foreach = foreach ]  {    //implementation }

其中foreach是下列值之一:

  • row — 该触发器由触发语句影响的每一行触发。 注意,TSQL不支持行级触发器,因此Language关键字的设置必须是objectscript
  • row/object — 此触发器由受触发语句或通过对象访问进行的更改影响的每一行触发。请注意,TSQL不支持行级触发器,因此Language关键字的设置必须为objectscript

这个选项定义了一个统一触发器,之所以这么叫,是因为它是由通过SQL或对象访问发生的数据更改触发的。 (相比之下,与其他触发器相比,如果在通过对象访问发生更改时使用相同的逻辑,则需要实现回调,如%OnDelete()。)

  • statement — 整个语句只触发一次触发器。 ObjectScriptTSQL都支持语句级触发器; 即Language关键字的设置分别为objectscripttsql

详情

控制何时触发触发器。

默认

如果省略此关键字,则触发器为行级触发器。

例外

TSQL不支持行级触发器。

第134章 触发器关键字 - Internal

指定此触发器定义是否为内

0
0 159
文章 姚 鑫 · 八月 21, 2021 3m read

第129章 查询关键字 - WebMethod

指定这个类查询是否为web方法。 仅应用于定义为web服务web客户端的类。

用法

要指定这个查询是一个web方法,请使用以下语法:

Query name(formal_spec) As classname [ WebMethod ] {    //implementation }

否则,忽略该关键字或将Not放在该关键字之前。

详情

这个关键字指定这个类查询是否是一个web方法,是否可以通过SOAP协议调用。

默认

如果忽略此关键字,则无法以web方法调用查询。

生成的类

当你将这个关键字添加到类查询并编译类时,类编译器会生成两个额外的类:

  • Package.OriginalClass.QueryName
  • Package.OriginalClass.QueryName.DS

Package.OriginalClass是包含web方法的类,QueryName是类查询的名称。

例如,假设从类ROBJDemo.QueryWS开始。 ,然后向它添加一个名为MyQuery的类查询。 当你将WebMethod关键字添加到该类查询并编译它时,类编译器会生成以下额外的类:

  • ROBJDemo.QueryWS.MyQuery
  • ROBJDemo.QueryWS.MyQuery.DS

不要修改或直接使用这些生成的类;它们仅供内部使用。

WSDL

0
0 144
文章 姚 鑫 · 八月 20, 2021 2m read

第125章 查询关键字 - SqlName

覆盖投影SQL存储过程的默认名称。 仅当此查询被投影为SQL存储过程时应用。

用法

要覆盖查询投射为SQL存储过程时使用的默认名称,请使用以下语法:

Query name(formal_spec) As classname [ SqlProc, SqlName = sqlname ] {    //implementation }

其中sqlnameSQL标识符。

详解

如果将此查询投影为一个SQL存储过程,则使用此名称作为存储过程的名称。

默认

如果忽略此关键字,查询名称将用作SQL过程名称。

第126章 查询关键字 - SqlProc

指定查询是否可以作为SQL存储过程调用。

用法

要指定查询可以作为SQL存储过程调用,请使用以下语法:

Query name(formal_spec) As classname [ SqlProc ] {    //implementation }

否则,忽略该关键字或将Not放在该关键字之前。

详情

该关键字指定是否可以作为SQL存储过程调用查询。

默认

如果忽略此关键字,则无法将查询作为SQL存储过程调用。

第127章 查询关键字 - SqlView

指定是否将此查询投影为SQL视图。

用法

要指定查询投影为SQL视图,请使用以下语法:

Query name(formal_spec) A
0
0 165
问题 Michael Lei · 八月 19, 2021

我有一个CSP页面,当我把大量的文本(例如:10000个字符)放到一个提交的表单的一个字段中时,会出现 "414 error - Request-URI Too Long"。该表格是用POST方法提交的。

根据我做的一些实验,似乎一个URL的最大尺寸是8200个字符左右。

官方的限制是什么,是否有办法增加它?我在文档中搜索了一下,但没有找到任何东西。

1
0 224
文章 姚 鑫 · 八月 19, 2021 4m read

第121章 查询关键字 - Private

指定查询是否为私有查询。

用法

要指定此查询为私有查询,请使用以下语法:

Query name(formal_spec) As classname [ Private ] {    //implementation }

否则,请省略此关键字或将该词放在该关键字之前。

详解

私有类成员只能由同一类(或其子类)的其他成员使用。请注意,其他语言通常使用单词Protected来描述这种可见性,使用单词Private来表示从子类不可见。

默认

如果省略此关键字,则此查询不是私有的。

第122章 查询关键字 - SoapBindingStyle

指定此查询用作Web方法时使用的绑定样式或SOAP调用机制。仅适用于定义为Web服务Web客户端的类。

用法

要覆盖查询使用的默认绑定样式(当它用作Web方法时),请使用以下语法:

Query name(formal_spec) As classname [ WebMethod, SoapBindingStyle = soapbindingstyle ] {    //implementation }

其中soapbindingstyle为下列值之一:

  • document - 此Web方法使用文档式调用。

使用这种绑定样式,SOAP消息被格式化为文档,并且通常只有一个部分。

SOAP消息中,<B

0
0 108
文章 姚 鑫 · 八月 18, 2021 2m read

第117章 属性关键字 - Transient

指定属性是否存储在数据库中。仅适用于持久类。

用法

要指定属性不存储在数据库中,请使用以下语法:

Property name As classname [ Transient ];

否则,请省略此关键字或将该词放在该关键字之前。

详情

对于持久化类,指定属性不存储在数据库中。

请注意, IRIS验证瞬态属性的方式与验证其他属性的方式相同。例如,当保存对象时,系统会验证其所有属性,包括所有临时属性。

在子类中,可以将非瞬态属性标记为瞬态Transient,但不能反过来。

默认

如果省略此关键字,则属性不是瞬态Transient的。

第118章 查询关键字 - ClientName

此查询的客户端投影使用的别名。

用法

要在将查询投影到客户端语言时覆盖查询的默认名称,请使用以下语法:

Query name(formal_spec) As classname [ ClientName = clientname ] {    //implementation }

其中clientname是在客户端语言中使用的名称。

详情

当查询被投影到客户端语言时,此关键字允许定义查询的替代名称。如果查询名称包含客户端语言中不允许的字符,这尤其有用。

默认

如果省略此关键字,查询名称将用作客户端名称。

第119章 查询关键字 - Final

指定此

0
0 139
文章 姚 鑫 · 八月 17, 2021 4m read

第113章 属性关键字 - SqlComputeOnChange

此关键字控制何时重新计算属性。仅适用于触发的计算属性。

用法

要指定何时重新计算属性,请使用以下语法:

Property name As classname [ SqlComputed, SqlComputeCode=sqlcomputecode, SqlComputeOnChange = propertynames ];

其中sqlcomputecodeSqlComputeCode中描述,propertyname是单个属性名或以逗号分隔的属性名列表。该值还可以包括值%%INSERT%%UPDATE

请注意,必须使用实际的属性名,而不是SqlFieldname给出的值。

详解

此关键字仅适用于触发的计算属性;对于其他属性,它将被忽略。(触发的计算属性是一个属性,其SqlComputed为真,并且指定了SqlComputeCode,但是其computedTransient都为假)

此关键字控制重新计算此属性的条件。重新计算可能源于:

  • 对任何指定属性的修改。
  • 触发器事件的发生。

如果关键字的值为%%INSERT%%UPDATE,则分别调用INSERTUPDATE,指定字段(属性)值的事件触发计算。

  • 使用%%INSERT,当一行被插入到表中时, IRIS计算字段值。 IRIS调用SQLComputeC
0
0 140
文章 姚 鑫 · 八月 16, 2021 4m read

第109章 属性关键字 - ServerOnly

指定是否将此属性投影到Java客户机。

用法

要指定属性是否被投影到Java客户端,请使用以下语法:

Property name As classname [ ServerOnly = n ];

其中n是下列之一:

  • 0表示此属性是投影的。
  • 1表示不投影该属性。

详解

此关键字指定属性是否被投影到Java客户端。

默认

如果省略此关键字,属性将被投影。

第110章 属性关键字 - SqlColumnNumber

指定此属性的SQL列号。仅适用于持久类。

用法

要指定属性的SQL列号,请使用以下语法:

Property name As classname [ SqlColumnNumber = 4 ]; 

其中n是正整数。

详解

此关键字允许显式设置此属性的SQL列号。这是为了支持传统应用程序而提供的。

默认

默认值为空字符串。

第111章 属性关键字 - SqlComputeCode

指定设置此属性值的代码。

用法

要指定属性的计算方式,请使用以下语法:

Property name As classname [ SqlComputeCode = { Set {FieldName} = Expression }, SqlComputed ];
  • FieldName—正在定义的属性的SQL字段名称。
  • Expression
0
0 149
文章 姚 鑫 · 八月 15, 2021 4m read

第105章 属性关键字 - OnDelete

指定删除相关对象时在当前表中采取的操作。此关键字仅适用于将基数Cardinality 指定为“父”或“一”的关系属性。它的使用在所有其他上下文中都是无效的。

用法

要指定删除相关对象时在当前表中采取的操作,请使用以下语法:

Relationship relname As classname [ Cardinality = cardinality, Inverse = inverse, OnDelete = ondelete ];

其中ondelete是以下值之一。在本讨论中,相关记录是属于关系另一方的记录或对象,引用记录是关系这一方的记录或对象。

  • cascade级联—删除相关记录时,也会删除该表中的引用记录。
  • noaction无操作—当试图删除相关记录时,尝试会失败。
  • setdefault —删除相关记录时,该表中的引用记录将被设置为其默认值。
  • setnull —删除相关记录时,该表中的引用记录将被设置为null

详解

此关键字定义了在关系的另一端删除记录时发生的引用操作。

默认

如果忽略此关键字,则:

  • 对于Cardinality 基数为父的关系,OnDelete是级联的。也就是说,当删除父记录时,默认情况下,关联的子记录将被删除。
  • 对于基数为1的关系,OnDeletenoaction。也就是说,当试图删除“一个”记录时,
0
0 132
文章 姚 鑫 · 八月 14, 2021 3m read

第101章 属性关键字 - InitialExpression

指定此属性的初始值。

用法

要指定此属性的初始值,请使用以下语法:

Property name As classname [ InitialExpression = initialexpression ];

其中,initialexpression是用大括号括起来的常量或ObjectScript表达式。

详解

此关键字指定属性的初始值。该值是在创建新实例时由类的%New()方法分配的。(如果属性是瞬态的的,则其初始值由创建实例时%New()调用的代码或实例从磁盘加载到内存时%OpenId()调用的代码确定。)

初始表达式的值必须适合给定的属性类型。

表达式可以是任意复杂的,有以下限制:

  • 初始表达式不能引用其他属性。也就是说,诸如{..therPropertyname}这样的表达式无效。
  • 初始表达式不能实例化对象,也不能包括对象引用。
  • 初始表达式不能调用实例方法(只能调用类方法)。
  • 必须在ObjectScript中指定初始表达式。
  • 表达式执行的代码不应报告错误。InterSystems IRIS不提供处理表达式返回的错误的方法。
  • 如果表达式执行的代码导致发生其他处理,则InterSystems IRIS不提供处理该处理结果的方法。

子类继承InitialExpression关键字的值并可以重写它。

默认

Init

0
0 118
文章 姚 鑫 · 八月 13, 2021 2m read

第九十七章 属性关键字 - Collection

不推荐使用的方法是指定集合属性的集合类型。不要使用。

详解

此关键字已被“as”语法替换。

第九十八章 属性关键字 - Deprecated

指定此属性已弃用。此关键字被类编译器忽略,仅提供属性已弃用的人类可读指示符。

用法

要指定不推荐使用此属性,请使用以下语法:

Property name As classname [ Deprecated ]; 

否则,请省略此关键字或将该词放在该关键字之前。

第九十九章 属性关键字 - Final

指定此属性是否为最终属性(不能在子类中重写)。

用法

要指定属性为最终属性,请使用以下语法:

Property name As classname [ Final ];

否则,请省略此关键字或将该词放在该关键字之前。

详解

标记为Final的类成员不能在子类中被重写。

默认

如果省略此关键字,则该属性不是最终属性。

第100章 属性关键字 - Identity

指定此属性是否对应于相应SQL表中的IDENTITY列。适用于持久类。

用法

要指定此属性对应于相应SQL表中的IDENTITY列,请使用以下语法:

Property name As %Integer [ Identity ];

注意:属性类型可以是任何整数类型,例如%BigInt%Integer%SmallInt%Ti

0
0 178
文章 Michael Lei · 八月 12, 2021 1m read

我最近看到一个客户问题,是使用 Caché 数据库上运行的病毒扫描程序导致应用程序间歇性变慢和用户响应时间不佳。

出乎意料的是,这是一个常见问题,所以本帖就是提个醒,要将主要 Caché 组件排除在病毒扫描之外。

通常,病毒扫描必须排除 CACHE.DAT 数据库文件和 Caché 二进制文件。 如果防病毒软件扫描 CACHE.DAT 和 InterSystems 文件,那么系统性能_将_受到较大影响。

具体来说,防病毒软件必须排除的 Caché 文件包括:

  • Caché 数据库 (CACHE.DAT)。
  • Ensemble/bin 或 cache/bin 目录中的 Caché 可执行文件。
  • 写入映像日志 (WIJ)。
  • 日志目录中的日志文件。

更多详细信息,请参见在线文档。

更多 Caché 文档

0
0 232
文章 姚 鑫 · 八月 12, 2021 3m read

第九十三章 属性关键字 - Aliases

指定此属性的其他名称,以便通过对象访问使用。

用法

要为属性指定其他名称,请使用以下语法:

Property name As classname [ Aliases=othernames ]; 

其中othernames是用逗号分隔的有效属性名列表,用大括号括起来。

详解

如果指定别名关键字,编译器会创建一个或多个给定的别名,这些别名指向原始属性所指向的同一基础数据。例如,重新定义Sample.PersonName属性,如下所示:

Property Name As %String(POPSPEC = "Name()") [ Aliases = {Alternate}, Required ];

然后,代码可以使用Name属性或等效的Alternate属性,如以下终端会话所示:

SAMPLES>set p=##class(Sample.Person).%OpenId(1)
 
SAMPLES>w p.Name
Fripp,Charles Z.
SAMPLES>w p.Alternate
Fripp,Charles Z.
SAMPLES>set p.Alternate="Anderson,Neville J."
 
SAMPLES>w p.Name
Anderson,Neville J.

还为每个别名属性定义了与原始属性关联的任何属性

0
0 127
文章 姚 鑫 · 八月 11, 2021 2m read

第八十九章 参数关键字 - Final

指定此参数是否为final(不能在子类中重写)

用法

要指定参数为final最终参数,请使用以下语法:

Parameter name As parameter_type  [ Final ] = value;

否则,请省略此关键字或将该词放在该关键字之前。

详解

标记为Final的类成员不能在子类中被重写。

默认

如果省略此关键字,则该参数不是最终参数。

第九十章 参数关键字 - Flags

修改此参数的用户接口类型(在Studio中)。

用法

要修改此参数的用户接口类型(在Studio中),请使用以下语法:

Parameter name As parameter_type  [ Flags = flags ] = value;

其中,flags 为以下值之一:

  • ENUM-该参数是由Constraint关键字(逗号分隔列表)指定的值之一。检查器将提供这些值的下拉列表。
  • LIST -参数值是由逗号分隔的项目列表组成的字符串。

请注意,不使用EDITEMPTYSYS

详解

修改参数的用户界面类型(在Studio中)。Studio使用此类型为检查器中的参数提供输入验证。类编译器忽略此关键字。

默认

如果省略此关键字,则Studio只允许该参数使用单个值(并且不提供选项下拉列表)。

第九十一章 映射关键字 - Internal

0
0 143
文章 姚 鑫 · 八月 10, 2021 3m read

第八十五章 方法关键字 - WebMethod

指定此方法是否为web method。仅适用于定义为web serviceweb客户端的类。

用法

要指定此方法是web方法,请使用以下语法:

Method name(formal_spec) As returnclass [ WebMethod ] 
{    //implementation }

否则,省略此关键字或将单词Not放在关键字的前面。

详解

此关键字指定此方法作为web方法可用,并且可以通过SOAP协议调用。

重要:在大多数情况下,web方法应该是实例方法,而不是类方法。

默认

如果省略此关键字,则该方法不能作为web method使用。

生成的类

当将此关键字添加到方法并编译类时,类编译器将生成一个额外的类:Package.OriginalClass.MethodNamePackage.OriginalClass是包含web方法的类,MethodNameweb方法的名称。

例如,从类ROBJDemo.DocLiteralWS开始。然后添加一个名为add的方法。当将WebMethod关键字添加到该方法并进行编译时,类编译器将生成类ROBJDemo.DocLiteralWS.Add

不要修改或直接使用这个生成的类; 仅供内部使用。

WSDL的关系

对于web服务,该关键字还会影响生成的WSDL,后者现在包含表

0
0 192
文章 姚 鑫 · 八月 9, 2021 6m read

第八十一章 方法关键字 - SoapRequestMessage

当多个web方法具有相同的SoapAction时使用此方法。 在默认场景中,该关键字指定请求消息的SOAP正文中的顶级元素的名称。 仅适用于定义为web服务web客户端的类。

用法

要在请求消息的SOAP体中指定顶级元素的名称,请使用以下语法:

Method name(formal_spec) As returnclass [ WebMethod, SoapAction = "MyAct", SoapRequestMessage="MyReqMessage" ] 
{    //implementation }

其中soaprequestmessage是有效的XML标识符。

详解

注意:此关键字仅对包装的文档/文字document/literal消息有效。

对于包装的文档/文字消息,该关键字指定请求消息的SOAP主体中的顶部元素的名称。(默认情况下,包装文档/文字消息。

如果对同一web服务中的多个web方法使用相同的SoapAction值,请指定此关键字。否则,一般不需要这个关键字。

与WSDL的关系

SoapRequestMessage关键字影响web服务WSDL<Message>部分。例如,考虑以下web方法:

Method Add(a as %Numeric,b as %Numeric) As %N
0
0 118
文章 姚 鑫 · 八月 8, 2021 7m read

第七十七章 方法关键字 - SoapBindingStyle

指定此方法用作web方法时使用的绑定样式或SOAP调用机制。仅适用于定义为web服务web客户端的类。

用法

若要重写方法使用的默认绑定样式(当它用作web方法时),请使用以下语法:

Method name(formal_spec) As returnclass [ WebMethod, SoapBindingStyle = soapbindingstyle ]  
{    //implementation }

其中soapbindingstyle是下列之一:

  • document文档(默认)—此web方法使用文档样式的调用。

使用这种绑定风格,SOAP消息被格式化为文档,并且通常只有一个部分。

SOAP消息中,<Body>元素通常包含一个子元素。<Body>元素的每个子元素对应于一个消息部分。

  • rpc —这个web方法使用rpc(远程过程调用)风格的调用。

使用这种绑定风格,SOAP消息被格式化为具有多个部分的消息。

SOAP消息中,<Body>元素包含一个子元素,其名称取自相应的操作名称。这个元素是一个生成的包装元素,它为方法的参数列表中的每个参数包含一个子元素。

重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。当使用SOAP向导从WSDL生成web客户端服务时,InterSyst

0
0 207
文章 姚 鑫 · 八月 7, 2021 6m read

第七十三章 方法关键字 - Requires

指定用户或进程调用此方法必须拥有的权限列表。

用法

要指定此方法应限于具有指定权限的用户或进程,请使用以下语法:

Method name(formal_spec) As returnclass [ Requires = privilegelist ] 
{    //implementation } 

其中,privilegelist 要么是单个特权,要么是用引号括起来的以逗号分隔的特权列表。 每个权限都采用resource:permission的形式,其中permissionUseReadWrite(或单字母缩写URW)。

若要为一个资源resource指定多个权限,请使用单字母缩写。

详情

用户或进程必须拥有权限列表中的所有权限才能调用该方法。 调用没有指定权限的方法会导致<PROTECT>错误。

如果方法从超类继承了Requires关键字,则可以通过设置关键字的新值将其添加到所需特权的列表中。 不能以这种方式删除所需的特权。

默认

如果忽略此关键字,则调用此方法不需要特殊权限。

示例

下面的方法需要对Sales数据库的读权限和对Marketing数据库的写权限。 (注意,如果一个数据库有写权限,它会自动有读权限。)

ClassMethod UpdateTotalSales() [ Requires = "%DB_SA
0
0 113
文章 姚 鑫 · 八月 6, 2021 3m read

第六十九章 方法关键字 - PlaceAfter

指定此方法在为类生成的例程中相对于其他方法的顺序。

用法

要指定类编译器应该将此方法放在它为类创建的例程中列出的方法之后,请使用以下语法:

Method name(formal_spec) As returnclass [ PlaceAfter = methodlist ] 
{    //implementation } 

其中methodlist是单个方法名或用逗号分隔的方法名列表,用括号括起来。

详解

此关键字指定类编译器应该将此方法放在它为类创建的例程中列出的方法之后。此关键字用于极少数需要控制类编译器为方法生成代码的顺序的情况。

默认

如果省略此关键字,类编译器将使用其正常逻辑来确定它生成的例程中方法的顺序。

第七十章 方法关键字 - Private

指定此方法是否为私有方法(只能由该类或其子类的方法调用)。

用法

要指定该方法为私有方法,请使用以下语法:

Method name(formal_spec) As returnclass [ Private ] 
{    //implementation }

否则,请省略此关键字或将该词放在该关键字之前。

详情

私有类成员只能由同一类(或其子类)的其他成员使用。请注意,其他语言经常使用protected这个词来描述这种可见性,使用private这个词来表示不可见子类

0
0 153
文章 TZ Zhuang · 八月 6, 2021 2m read

可以使用%SYS.Journal.File类中的ByTimeReverseOrder查询,以及%SYS.Journal.Record类中的List查询来实现。

下面是这两个查询的具体作用:

A) %SYS.Journal.File类中的ByTimeReverseOrder查询
这个查询会获取journal日志文件名并按降序排列

USER>set rs=##class(%ResultSet).%New("%SYS.Journal.File:ByTimeReverseOrder")
 
USER>do rs.Execute()
 
USER>while rs.Next() { write rs.Name,! }
c:\intersystems\cache\mgr\journal\20190620.003
c:\intersystems\cache\mgr\journal\20190620.002
c:\intersystems\cache\mgr\journal\20190620.001
c:\intersystems\cache\mgr\journal\20190610.001

B) %SYS.Journal.Record类中的List查询
这个查询可以从指定journal日志文件中获取日志记录

USER>set rs2=##class(%ResultSet).
0
1 331