文章 姚 鑫 · 八月 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 1523
文章 姚 鑫 · 八月 27, 2021 2m read

第153章 Storage关键字 - SqlRowIdProperty

指定SQL RowId属性。

大纲

<SqlRowIdProperty>prop</SqlRowIdProperty>

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

描述

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

默认值

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

第154章 Storage关键字 - SqlTableNumber

指定内部SQL表号。

大纲

<SqlTableNumber>123</SqlTableNumber>

该元素的值是一个表号。

描述

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

默认值

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

第155章 Storage关键字 - State

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

大纲

<State>state</State>

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

描述

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

默认值

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

第156章 Storage关键字 - StreamLocation

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

大纲

<StreamLocation>^Sample.PersonS</StreamLocation>

此元素的值是带有可选前导下标的全局名称。

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

第149章 Storage关键字 - IdFunction

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

大纲

<IdFunction>increment</IdFunction>

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

描述

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

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

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

默认值

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

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

第150章 Storage关键字 - IdLocation

指定ID计数器的位置。

大纲

<IdLocation>^Sample.
0
0 151
文章 Michael Lei · 八月 26, 2021 9m read

SAM - 设置和添加非 IRIS 目标指标的技巧和提示

SAM(系统警报和监视)以“功能齐全”的 docker-compose 容器集的形式提供,只要启动就可以开始以默认的仪表板监视 IRIS 实例。 使用初始配置就可以很好地了解 SAM 功能并开始对 IRIS 系统进行基本监视。 但是,当开始监视多个系统并收集大量指标数据时,需要更改一些默认设置。 为了从 SAM 获取更多价值,您还会想要添加来自其他数据源(目标)的指标。 以下技巧将帮助您在生产环境中部署 SAM,从多个目标收集指标并将这些指标组合到您自己的仪表板和图表中。 此外,您还将看到一些可能有助于探索 SAM 容器和应用程序的命令。

*注意:*我应该指出,其中一些技巧和提示可能不是最佳做法;这更像是一个日志,记录了我第一次如何配置 SAM 来监视相同系统上的多个服务器和非 IRIS 目标的基准。 如果您有建议,请在评论中指教 ;) 所以,记住本帖可能会随着时间的推移而有所变化,让我们开始吧;


在下面的技巧中,有重启 docker 以及启动和停止 SAM 的操作。 请通读这些技巧,确定哪些适合您,然后按照下面的相同顺序执行。

1. 确保有足够的空间用于 SAM 数据库

默认情况下,docker 容器将文件存储在根 (/) 文件系统。 SAM 不需要很多 CPU 或内存资源;但是,指标收集将占用空间。

0
0 257
文章 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


左括号([)是二进制包含运算符。

0
0 466
文章 姚 鑫 · 八月 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}(ChildData)

0
0 143
文章 Jingwei Wang · 八月 25, 2021 3m read

Object Script(一)


  • 概况

ObjectScript是一种用于在InterSystems IRIS数据平台上快速开发编程语言,它是面向对象的弱类型脚本语言,非常适用于各种应用,包括业务逻辑、应用集成和数据处理。

在这里,我将主要介绍ObjectScript的命令脚本,类,方法和Routine等使用方式和语法规范。如有任何疑问,可在InterSystems开发者社区进行深入讨论。

  • IDE选择

可以使用InterSystems IRIS内置的StudioVisual Studio Code(需要安装Object Script扩展)来查看和编辑代码。这里我们使用InterSystems IRIS内置Studio来做示例。

如果你已安装InterSystems IRIS或者InterSystems HS 等任何InterSystems产品,找到右下角的图标 ,单击鼠标右键,点击Studio,如下图所示:

输入用户名和密码(用户名:superuser 密码:安装时自己设置的密码),即可进入到Studio开发环境,如下图所示:

 


  • Terminal

可以直接打开InterSystems IRIS的终端尝试执行ObjectScript的简单指令。

0
1 797
文章 姚 鑫 · 八月 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类型。

0
0 132
文章 姚 鑫 · 八月 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名称。

0
0 114
文章 姚 鑫 · 八月 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 161
文章 姚 鑫 · 八月 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

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

0
0 148
文章 姚 鑫 · 八月 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视图。

0
0 168
文章 Michael Lei · 八月 20, 2021 4m read
这是一个IRIS 2020.2上的代码示例,并非InterSystems 官方支持!

本demo基于原始类描述 is based on the raw class descriptions.
使用的数据类是Address, Person, Employee, Company
如果要做更有吸引力的 demo, 可以添加 JSONtoString by ID的方法

用ZPM安装后从终端启动:After installation with ZPM just run from Terminal

USER>do ##class(rcc.ONAPI.demo).Run()
Adjust Parameters
host[127.0.0.1]:
port[51773]:
namespace[USER]:
user[_SYSTEM]:
pwd[SYS]:
timeout[5]:
****** connected ********

下一步, 你会得到一系列可能的Demo动作。you get a list of possible demo actions.
没有输入就意味着没有动作No input means no action.
菜单会一直循环直到退出The menu loops until you exit.

0
0 191
文章 Michael Lei · 八月 20, 2021 3m read

这些API虽然在IRIS 2020.1中已经实现了,但没有被放在官方文档里。

这都是直接从Class Reference中提取的,我只是收集了它来创建第一个概述。

ObjectScript的本地API遵循其他语言平台上使用的API。它从一个静态API开始,允许用户使用Iris Connection连接到IRIS命名空间,无论是本地还是远程。连接接口允许用户实例化IRIS本地API类(%Net.DB.Iris)。然后,该实例可用于访问IRIS全局数组,管理事务,调用例程或类中实现的函数和方法,以及实例化远程迭代器。

%Net.DB.DataSource

该类实现了IRIS Native API for Object Script DataSource接口。
目前,该接口仅包含 CreateConnection 方法

CreateConnection 方法接受 urlportnamespaceuser, 和 pwd 等参数. 这些参数的信息请参考 %Net.DB.Connection 。CreateConnection() 返回 %Net.DB.Connection的实例

host input The host name or address, defaults to 127.0.0.
0
0 187
问题 Michael Lei · 八月 19, 2021

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

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

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

1
0 225
文章 姚 鑫 · 八月 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 142
文章 姚 鑫 · 八月 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计算字段值。
0
0 143
文章 Claire Zheng · 八月 17, 2021 1m read

当前医院面临更多互联互通需求,如预约挂号与分级诊疗、检验结果共享、医联体信息化、监管数据上报、临床辅助决策支持等,都需要对多源数据进行集成与整合。医疗机构内部和跨机构数据交换与共享,对互联互通提出新的要求。HL7 FHIR是国际上医疗行业实现数据交换和信息共享的标准之一,正在快速得到医疗行业广泛关注。InterSystems中国技术总监乔鹏在视频中分享了FHIR标准与国际互联互通的一些实践经验。

0
0 309
文章 Claire Zheng · 八月 17, 2021 5m read

国际互联互通的需求是在不断增长,这跟咱们国内的情况是非常类似的。这些年美国在互联互通领域的政策跟实践还是不少的,比如大家可能听到过包括“有意义的使用(Meaningful Use)”,“21世纪治愈法案(21st Century Cures Act)”,还有更多的政策上的驱动。这里先介绍一下“有意义的使用(Meaningful Use)”。

0
0 471
文章 Claire Zheng · 八月 17, 2021 3m read

回过头来,业务场景都是千人千面的, FHIR怎么能够用一个标准涵盖尽可能多的用例?HL7吸收了V3的教训,在V3里面不成功的、或者说采纳度比较低的一个原因就V3试图穷举所有用例,由HL7组织自己来规范这些用例。这个是蛮沉重的教训,这也是V3的方法论虽然好,但是这套实施的路线在国际上有很大障碍的原因。

0
0 555
文章 Claire Zheng · 八月 17, 2021 4m read

FHIR是快速医疗互操作资源(Fast Healthcare Interoperability Resources)的缩写,所以FHIR的核心是资源模型。它的颗粒度和结构都优于之前的V2 、V3、CDA标准,而且能够灵活扩展。另外一个优势就是它的API,它不仅提供了针对于资源模型本身的原子化的CRUD(创建、读取、更新、删除的这样一些原子化操作),而且提供了查询这种更复杂操作的能力,同样API是可以扩展的。

0
1 670
文章 Claire Zheng · 八月 17, 2021 2m read

什么是互联互通?我们所说的互联互通其实就是国际上的互操作性,HIMSS对于互操作性定义的是:不同的信息系统、设备、应用系统之间、程序之间,在机构区域和国家边界之内,以及跨机构、区域和国家边界,以协调的方式来访问交换集成和协作使用数据的能力。

0
0 481
文章 姚 鑫 · 八月 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 151
文章 姚 鑫 · 八月 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 135