第十三章 使用动态SQL(五)
从结果集中返回特定的值
要从查询结果集中返回特定的值,必须一次一行遍历结果集。
要遍历结果集,请使用%Next()实例方法。
(对于单一值,结果对象中没有行,因此%Next()返回0,而不是错误。)
然后,可以使用%Print()方法显示整个当前行的结果,或者检索当前行的指定列的值。
%Next()方法获取查询结果中下一行的数据,并将该数据放入结果集对象的data属性中。
%Next()返回1,表示它位于查询结果中的某一行上。
%Next()返回0,表示它位于最后一行(结果集的末尾)之后。
每次调用%Next()返回1个增量%ROWCOUNT;
如果游标定位在最后一行之后(%Next()返回0),%ROWCOUNT表示结果集中的行数。
如果SELECT查询只返回聚合函数,每个%Next()设置%ROWCOUNT=1。
第一个%Next()返回1并设置%SQLCODE=0和%ROWCOUNT=1,即使表中没有数据;
任何随后的%Next()返回0,并设置%SQLCODE=100和%ROWCOUNT=1。
从结果集中获取一行后,可以使用以下任何一种方式显示该行的数据:
第二十一章 导入和导出SQL数据
在InterSystems IRIS®Data Platform Management Portal中,有用于导入和导出数据的工具:
- 从文本文件导入数据
- 将数据导出到文本文件
这些工具使用动态SQL,这意味着查询是在运行时准备和执行的。可以导入或导出的行的最大大小为3,641,144个字符。
还可以使用%SQL.Import.Mgr类导入数据,使用%SQL.Export.Mgr类导出数据。
从文本文件导入数据
可以将数据从文本文件导入到合适的InterSystems IRIS类中。执行此操作时,系统将在表中为该类创建并保存新行。该类必须已经存在并且必须编译。要将数据导入到此类中,请执行以下操作:
如果看了前一篇InterSystems IRIS医疗行业版创建FHIR服务器,应该您已经搭建好了FHIR服务器和FHIR资源仓库。除了使用FHIR REST API来操作这个FHIR服务器,您还可以更直观地看看它的价值 - 使用SMART on FHIR应用。这次,基于上次建好的FHIR服务器,我们用10分钟把一个SMART on FHIR运行起来。
SMART on FHIR背景
SMART是Substitutable Medical Applications and Reusable Technology的缩写,它的目标是创建可以被替换、可以复用的医疗应用,简单说就是希望医疗应用可以像我们的手机应用一样:不喜欢当前的天气应用,那么就换一个。SMART,这个起于2011年的哈佛和波士顿儿童医院的合作项目,在2013年注意到并快速采用了FHIR,成就了今天的SMART on FHIR。
InterSystems IRIS,IRIS for Health和IRIS Studio的2020.4版本现已正式发布。
InterSystems IRIS Data Platform 2020.4使开发、部署和管理增强型应用和业务流程变得更加容易,从而弥合了数据和应用孤岛。它具有许多新功能,包括
增强了应用程序和接口开发人员的能力,包括:
- 支持Java SE 11 LTS,在使用Oracle OpenJDK和AdoptOpenJDK时均可支持
- 支持JDBC的连接池
- 分段式虚拟文档路由规则中新的 "foreach "组件
增强了数据库和系统管理员的能力,包括:
- ICM现在支持部署系统警报和监测(SAM)和InterSystems API Manager(IAM)
- 对常见管理任务的SQL语法的扩展
- 简化InterSystems报表的部署
InterSystems IRIS for Health 2020.4包含了InterSystems IRIS 2020.4的所有增强功能。此外,这个版本还包
- 增强对FHIR的支持,包括对FHIR配置文件的支持
- 支持RMD IHE 的Profile
- HL7迁移工具中的DataGate支持
关于这些功能的更多细节可以在产品文档中找到:
2021年4月18日,Caché 系统运维培训线上实操课,此次培训的主题包括, Intersystems Caché 架构,Intersystems Caché 备份与恢复,Intersystems Caché 高可用与数据库镜像,Intersystems Caché 安全,Intersystems Caché 监控和性能采集。 欢迎大家报名参加!
第十九章 存储和使用流数据(BLOBs和CLOBs)
Intersystems SQL支持将流数据存储为Intersystems Iris ®DataPlatform数据库中的 BLOBs(二进制大对象)或 CLOBs(字符大对象)的功能。
流字段和SQL
Intersystems SQL支持两种流字段:
- 字符流
Character streams,用于大量文本。 - 二进制流
Binary streams,用于图像,音频或视频。
BLOBs and CLOBs
Intersystems SQL支持将BLOBs(二进制大对象)和CLOBs(字符大对象)存储为流对象的功能。 BLOBs用于存储二进制信息,例如图像,而CLOBs用于存储字符信息。 BLOBs和CLOBs可以存储多达4千兆字节的数据(JDBC和ODBC规范所强加的限制)。
在各种方面,诸多方面的操作在通过ODBC或JDBC客户端访问时处理字符编码转换(例如Unicode到多字节):BLOB中的数据被视为二进制数据,从未转换为二进制数据另一个编码,而CLOB中的数据被视为字符数据并根据需要转换。
如果二进制流文件(BLOB)包含单个非打印字符$CHAR(0),则被认为是空二进制流。它相当于""空二进制流程值:它存在(不是null),但长度为0。
定义流数据字段
在linux服务器上如何建立ODBC连接IRIS来进行查询数据库的操作
第十八章 定义和使用存储过程
本章介绍如何在IntersystemsIRIS®数据平台上定义和使用Intersystems SQL中的存储过程。它讨论了以下内容:
- 存储过程类型的概述
- 如何定义存储过程
- 如何使用存储过程如
- 何列出存储过程及其参数。
概述
SQL例程是可执行的代码单元,可以由SQL查询处理器调用。 SQL例程有两种类型:功能和存储过程。从支持FunctionName()语法的任何SQL语句中调用函数。存储过程只能由CALL语句调用。函数接受某些输入定向参数并返回单个结果值。存储过程接受某些输入,输入输出和输出参数。存储过程可以是用户定义的函数,返回单个值。 CALL语句也可以调用函数。
与大多数关系数据库系统一样,Intersystems Iris允许创建SQL存储过程。存储过程(SP)提供存储在数据库中的可调用可调用的程序,并且可以在SQL上下文中调用(例如,通过使用呼叫语句或通过ODBC或JDBC)。
与关系数据库不同,Intersystems Iris使可以将存储过程定义为类的方法。实际上,存储过程只不过是SQL可用的类方法。在存储过程中,可以使用基于对象的全系列Intersystems的功能。
HealthShare中RSA加密以及解密如何实现,我尝试了使用##class(%SYSTEM.Encryption).RSAEncrypt(Text,pubKey)这个函数,但是无法成功
第十七章 使用触发器
本章介绍如何在Intersystems SQL中定义触发器。触发器是响应某些SQL事件执行的代码行。本章包括以下主题:
定义触发器
有几种方法可以为特定表定义触发器:
- 在将投影到SQL表的持久性类定义中包含触发定义。例如,
MyApp.person类的此定义包括Loggevent触发器的定义,在每个成功的数据插入到MyApp.person表之后,将在每个成功的数据插入后调用:
Class MyApp.Person Extends %Persistent [DdlAllowed]
{
// ... Class Property Definitions
Trigger LogEvent [ Event = INSERT, Time = AFTER ]
{
// Trigger code to log an event
}
}
- 使用SQL创建触发命令创建触发器。这在相应的持久性类中生成触发对象定义。 SQL触发器名称按照标识符命名约定进行操作。 IntersystemsIris®数据平台使用SQL触发名称生成相应的触发类实体名称。
必须拥有%create_trigger管理级别权限来创建触发器。必须具有删除触发器的%drop_trigger管理级别权限。
类的最大用户定义触发器数为200。
第十六章 导入SQL Code
本章介绍如何将SQL代码从文本文件导入Intersystems SQL。导入SQL代码时,IntersystemsIris®数据平台使用动态SQL准备并执行每行SQL。如果遇到无法解析的代码行,则SQL导入跳过该行代码并继续准备和执行后续行,直到它到达文件的末尾。所有SQL代码导入操作导入到当前名称空间。
SQL导入主要用于导入数据定义语言(DDL)命令(例如Create Table),并使用Insert,Update和Delete命令填充表。 SQL导入确实准备并执行SELECT查询,但不创建结果集。
SQL导入可用于导入Intersystems SQL代码。它也可以用于代码迁移,从其他供应商导入SQL代码(FDBMS,Informix,Interbase,MSSQLServer,MySQL,Oracle,Sybase)。来自其他供应商的代码被转换为Intersystems SQL代码并执行。 SQL导入无法将所有SQL命令导入Intersystems SQL。它导入与SQL标准的Intersystems Iris实现兼容的那些命令和条款。不兼容的功能通常被解析,但忽略了。
SQL导入可以成功准备一个SQL查询 - 在适当的情况下创建相应的缓存查询 - 但它不会执行查询。
第十五章 使用管理门户SQL接口(二)
过滤模式内容
Management Portal SQL界面的左侧允许查看模式(或匹配筛选器模式的多个模式)的内容
- 通过单击SQL interface页面顶部的Switch选项,指定希望使用的名称空间。 这将显示可用名称空间的列表,可以从中进行选择。
- 应用筛选器或从模式下拉列表中选择模式。
可以使用Filter字段通过输入搜索模式来筛选列表。
可以在一个模式或多个模式中筛选模式,或筛选表/视图/过程名(项)。
搜索模式由模式名、点(.)和项目名组成——每个名称由文字和通配符的某种组合组成。字面值不区分大小写。
通配符是:
- 星号(
*)表示0个或多个任意类型的字符。 - 下划线(
_)表示任意类型的单个字符。 - 撇号(
')倒装前缀,意为“不”(除了)。 - 反斜杠(
\)转义字符:\_表示字面上的下划线字符。
例如,S*返回所有以S S*开头的模式。
Person返回所有以S. *开头的模式中的所有Person项。
Person*返回所有模式中以Person开头的所有项。
可以使用逗号分隔的搜索模式列表来选择满足所列模式(或逻辑)中的任何一种的所有项。
例如,* .Person * *。
Employee*选择所有模式中的所有Person和Employee项。
若要应用筛选器搜索模式,请单击refresh按钮或按Tab键。
第十五章 使用管理门户SQL接口(一)
本章介绍如何在InterSystems IRIS®数据平台管理门户上执行SQL操作。 管理门户界面使用动态SQL,这意味着在运行时准备和执行查询。 Management Portal界面旨在帮助针对小型数据集开发和测试SQL代码。 它不打算用作在生产环境中执行SQL的接口。
管理门户还提供了各种配置SQL的选项。
有关使用管理门户的一般信息,请选择左上角的Help按钮。 通过使用左上角的Contact按钮,可以从管理门户向InterSystems Worldwide Response Center (WRC)报告有关InterSystems软件的问题。
管理门户SQL工具
InterSystems IRIS允许使用SQL工具从InterSystems IRIS管理门户检查和操作数据。 此操作的起点是Management Portal System Explorer选项。 从这里选择SQL选项。 这将显示SQL接口,它允许:
着手书写“数据应用方案分享”系列文章的初衷是,希望从终端用户的视角阐述我们所期待的数据应用方式及其可能为医疗领域带来的获益,为医学信息工作者提供参考。在这个系列中,笔者会以临床常见疾病和流程为例,用真实的数据录入、获取、展现和使用场景说明需求;尤其是如何细致、精准的构建数据源头,以确保现代医学信息技术“有数可用”、“数用必达”。其中肯定有思虑不周全或逻辑不严谨之处,望各位读者按需审阅,取其精华、弃其糟粕。此外,本系列更多在于探讨数据应用的“可能性”,而非“可行性”。文中部分图片尚处于设想模拟阶段,并非真实系统图片,请知悉。
第十四章 使用SQL Shell界面(三)
SQL元数据、查询计划和性能指标
显示元数据
SQL Shell支持M或Metadata命令以显示有关当前查询的元数据信息。
对于每个结果集项目,此命令列出以下元数据:列名称(SQL字段名称),键入(ODBC数据类型整数代码),PRE(精度或最大长度),比例(最大分数数字),NULL(BOOLEAN:1 = NULL允许,0 =不允许空值),标签(标题标签,请参阅列别名),表(SQL表名称),架构(架构名称),CTYPE(客户端数据类型,请参阅%SQL.statementColumn ClientType属性)。
SHOW STATEMENT
可以执行查询,然后发出show语句或显示st以显示准备好的SQL语句。默认情况下,必须执行查询。可以避免通过设置executemode =延迟执行查询,从而发出查询,然后发出show语句sql shell命令。
显示声明信息包含实现类(缓存查询名称),参数(一个以逗号分隔的实际参数值,如上面条款和WHERE子句文字值),和语句文本(文字文本的SQL命令,包括字母大小写和参数值)。
EXPLAIN and Show Plan
有两种方式显示SQL查询的查询计划; 如果需要,两者都可以显示备用的查询计划。
- EXPLAIN:前言用解释命令选择SELECT查询。例如:
第十四章 使用SQL Shell界面(二)
存储和调用SQL语句
通过数据回调
SQL Shell自动将在终端会话期间发出的每个成功的SQL语句存储在本地缓存中,并为其分配一个顺序号。这些数字用于在当前Terminal过程中重新调用以前的SQL语句。 SQL Shell仅将数字分配给成功的SQL语句。如果在准备SQL语句期间发生错误,则不会分配任何编号。这些数字分配不是特定于名称空间的。以下是可用的数字调用命令:
#:可以使用#列出所有先前缓存的SQL语句及其分配的编号。#n:可以通过在SQL Shell提示符下指定#n来调用并执行先前的SQL语句,其中n是SQL Shell分配给该语句的整数。#0:可以通过在SQL Shell提示符下指定#0来调用并执行最近准备的SQL语句。#0调用最近准备的SQL语句,而不必调用最近执行的SQL语句。因此,调用和执行SQL语句对#0调用哪个SQL语句没有影响。
通过数字调用SQL语句不会为该语句分配新的数字。 SQL Shell在终端会话的持续时间内顺序分配数字;退出并重新进入SQL Shell或更改名称空间不会影响数字分配或先前分配的数字的有效性。
要删除所有号码分配,请使用#CLEAR并在显示的提示符下确认此操作。这将删除所有先前的号码分配,并从1重新开始号码分配。
通过名字回调
第十四章 使用SQL Shell界面(一)
执行SQL的其他方式
可以使用$SYSTEM.SQL.Execute() 方法从Terminal命令行执行一行SQL代码,而无需调用SQL Shell。以下示例显示如何在终端提示下使用此方法:
DHC-APP>SET result=$SYSTEM.SQL.Execute("SELECT TOP 5 name,dob,ssn FROM Sample.Person")
DHC-APP>DO result.%Display()
Name DOB SSN
yaoxin 54536 111-11-1117
xiaoli 111-11-1111
姚鑫 63189 111-11-1112
姚鑫 63189 111-11-1113
姚鑫 50066 111-11-1114
5 Rows(s) Affected
如果SQL语句包含错误,则Execute()方法成功完成;否则,该方法无效。 %Display()方法返回错误信息,例如:
大家好,我想咨询下如何实现用HealthShare开发socket的接口,例如开发socket对外的BS,以及socket调用的BO
现已推出三套新的维护版本:
- Caché 2018.1.5, Ensemble 2018.1.5, and HSAP 2018.1.5
- InterSystems IRIS 2019.1.2, IRIS for Health 2019.1.2, and HealthShare Health Connect 2019.1.2
- InterSystems IRIS 2020.1.1, IRIS for Health 2020.1.1, and HealthShare Health Connect 2020.1.1
安装包和容器版本可从以下网站下载 WRC Software Distribution site。
这些都是维护版本,在广泛的领域内有许多更新。 有关这些版本中的修正信息,请参考该版本的文档,其中包括发行说明和升级检查表、发行变更列表,以及类参考资料和全套指南、参考资料、教程和文章。所有的文档都可以通过以下方式获得 docs.intersystems.com 。
在这些版本中也加入了新的平台支持。 特别是,Ubuntu 20.04 LTS的支持已经添加到所有版本中,IBM AIX 7.1和7.2对System p-64的支持已经添加到2019.1.2中(并且已经在2020.1中),而对Linux的ARM64支持已经添加到2020.1.1中。 详情请参见各版本的支持平台文档。
第十三章 使用动态SQL(七)
SQL元数据
动态SQL提供以下类型的元数据:
- 在“准备”之后,描述查询类型的元数据。
- 在“准备”之后,描述查询中选择项的元数据(“列”和“扩展列信息”)。
- 在准备之后,描述查询参数的元数据:参数,
:var参数和常量。 (语句参数,形式参数和对象) - 执行之后,描述查询结果集的元数据。在执行Prepare操作(
%Prepare(),%PrepareClassQuery()或%ExecDirect())之后,可以使用%SQL.StatementMetadata属性值。 - 可以直接为最新的
%Prepare()返回%SQL.Statement元数据属性。 - 可以返回包含
%SQL.StatementMetadata属性的oref的%SQL.Statement%Metadata属性。这使可以返回多个准备操作的元数据。
SELECT或CALL语句返回所有这些元数据。 INSERT,UPDATE或DELETE返回语句类型元数据和形式参数。
语句类型元数据
使用%SQL.Statement类进行Prepare之后,可以使用%SQL.StatementMetadata statementType属性来确定准备哪种类型的SQL语句,如以下示例所示。本示例使用%SQL.Statement%Metadata属性来保存和比较两个Prepare操作的元数据:
亲爱的社区开发者们,大家好!
我们很高兴地宣布,新一轮InterSystems开发者竞赛开启了!
请提交具有如下特性的应用程序——能够加速开发、贡献更多高质量代码、帮助用户测试、部署、支持或监控基于InterSystems IRIS的解决方案。
时间: 2021年3月29日- 4月25日
Total prize: $8,500
前面介绍了通过mirroring或shadow,使用journal日志过滤器的方式,在不改动数据模型的情况下实现InterSystems IRIS/Caché上的CDC能力。
但如果你可以修改InterSystems IRIS/Caché上的数据模型,也可以考虑使用DSTIME特性实现变更数据捕获。
DSTIME特性
DSTIME特性是InterSystems IRIS/Caché的嵌入式实时BI工具DeepSee用于跟踪数据变更的。
InterSystems IRIS和2011版之后的Caché,都支持DSTIME特性。它会自动记录数据库中SQL表记录或持久化对象的变更,并将变更记录写入持久化的多维数组^OBJ.DSTIME中。
DSTIME特性是针对于SQL表/持久化类的,因此需要为每个需要记录变化的表/持久化类开启。
当开启了DSTIME的表/持久化类,有记录插入、更新、删除时,InterSystems IRIS/Caché引擎会自动在^OBJ.DSTIME中记录这些操作。其格式为:
^OBJ.DSTIME(类名,DSTIME,对象ID) = 执行的操作代码
DSTIME:
当SQL表/持久化类的参数DSINTERVAL未被设置时,DSTIME=0;
当SQL表/持久化类的参数DSINTERVAL被设置时,DSTIME=1840/12/31午夜12点到记录发生时的秒数。
执行的操作代码:
一些熟悉SQL的用户希望用SQL表的方式获取InterSystems IRIS/Caché的变更数据。知道了Global和SQL表的对应关系,就可以知道是哪一张SQL表数据变化了,甚至通过SQL查询获取变更的数据。
下面介绍如何实现这种方式,和注意事项。
获取Global和SQL表的对应关系
通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系;而持久化的对象模型和Global之间也有一一对应关系。建立Global和SQL表的对应关系,通常可以使用以下的SQL查询特定SQL schema下所有表对应的Global:
SELECT CC.SqlQualifiedNameQ SQLTable, CS.parent Class, CS.DataLocation
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC
WHERE CS.parent = CC.ID
AND CC.SqlSchemaName= <schemaname>
其中<schemaname>是SQL的Schema名称; 返回字段SQLTable是SQL表名、Class是对象类名、DataLocation是保存数据的Global名称。
多种建模方式Global和SQL表的对应关系的影响
Caché Shadow
上次介绍了使用InterSystems IRIS/Caché的Reporting类型的异步镜像成员获取数据变更。但早期的Caché并不支持镜像,例如Caché 2008,它只支持Shadow。
在这些早期版本上是否也可以实利用Journal实现类似CDC的功能呢?答案是肯定的,就是利用Shadow服务器的Dejournaling filter routine (Dejournaling过滤器routine)。
Dejournaling filter routine
InterSystems Caché的 Dejournaling过滤器routine是一个用户自定义的routine,用于在Shadow服务器上过滤Journal记录。当配置了Dejournaling 过滤器后,Shadow服务器在redo journal前会自动调用Dejournaling过滤器routine。该routine传入参数以下:
- pid:记录进程ID;
- dir:源数据库目录;
- glo:Global节点(包括下标);
- type: 操作类型,为S (Set)、K (Kill)、s (BITSET)、k (ZKILL);
- addr:Journal记录在Journal文件中的偏移量;
- time:记录的时间戳。
第十三章 使用动态SQL(六)
用%ObjectSelectMode = 1 Swizzling字段名称属性
下面的示例使用%ObjectSelectMode = 1进行准备,当使用字段名称属性返回值时,其类型类别为可Swizzle类型的字段(持久性类,序列类或流类)将自动发生Swizzle。转换字段值的结果是相应的对象参考(oref)。使用%Get()或%GetData()方法访问字段时,InterSystems IRIS不会执行此筛选操作。在此示例中,rset.Home处于Swizzle状态,而引用同一字段的rset.%GetData(2)处于not swizzled状态:
如果您正打算学习FHIR、或者正在基于FHIR开发,最佳的学习和开发环境需要一个完备的FHIR 服务器,帮助您理解FHIR标准和调试FHIR应用。使用InterSystems IRIS医疗行业版可以快速配置出FHIR服务器和FHIR资源仓库。这篇文章介绍如何在5分钟内在InterSystems IRIS医疗行业版上配置FHIR服务器和FHIR资源仓库;同时对初学者介绍FHIR测试数据生成与加载的方法,和基本的FHIR REST API操作。
软件准备
1. InterSystems IRIS医疗行业版
您可以使用已有的2020.1及以上的InterSystems IRIS医疗行业版。如果您还没有,那么就在社区里下载一个最新的、免费的社区版吧。
2. 测试用的FHIR数据
如果您正在做FHIR开发,应该有很多FHIR测试数据。如果您正在学习FHIR,那么Synthea是一个不错的FHIR测试数据生成器选项。
3. REST测试工具
您或许已经有趁手的REST测试工具了。如果还没有,POSTMAN是个不错的选择。我的例子里用到的就是POSTMAN。
FHIR服务器配置
1. 安装InterSystems IRIS医疗行业版或社区版
如果您还没有安装过InterSystems IRIS医疗行业版或社区版,社区里有很多很好的介绍文章。
2. 配置FHIR服务器
第十三章 使用动态SQL(四)
返回完整结果集
使用%Execute()或%ExecDirect()执行语句将返回一个实现%SQL.StatementResult接口的对象。该对象可以是单一值,结果集或从CALL语句返回的上下文对象。
%Display()方法
可以通过调用%SQL.StatementResult类的%Display()实例方法来显示整个结果集(结果对象的内容),如以下示例所示:
DO rset.%Display()
请注意,%Display()方法不会返回%Status值。
显示查询结果集时,%Display()通过显示行数来结束:“受影响的5行”。 (这是%Display()遍历结果集之后的%ROWCOUNT值。)请注意,%Display()不会在此行计数语句之后发出行返回。
%Display()有两个可选参数:
- 分隔符:在数据列和数据标题之间插入的字符串。它出现在结果集列之间,紧靠标题或数据值之前。默认为无定界符。如果省略,请在“列对齐”标志之前指定一个占位符逗号。
- 列对齐:整数标志,指定如何计算数据列和数据标题之间的空格。可用的选项有:
- 0:结果集标题/数据列将根据标准定界符(选项卡)对齐。这是默认值。
- 1:结果集标题/数据列将根据列标题和标准定界符(标签)的长度对齐。
- 2:结果集标题/数据列将根据列数据属性的精度/长度和标准定界符(选项卡)进行对齐。



