搜索​​​​

清除过滤器
文章
Lele Yang · 三月 31, 2023

Web Gateway系列(5)配置Web Gateway使用SSL/TLS连接到IRIS

《WebGateway系列(4): 配置HTTPS访问IRIS的Web服务》中介绍了在Web服务器中配置SSL/TLS以实现从客户端浏览器到Web服务器之间的安全连接,从Web服务器到IRIS之间是否也可以通过配置SSL/TLS建立起安全连接呢?尤其是在Web服务器与IRIS没有安装在同一台Server上的情况下,这段连接的安全性也是需要考虑的。答案是肯定的,接下来我们就来介绍下配置Web Gateway使用SSL/TLS连接到IRIS的基本步骤。 1.首先,我们先准备一下所需要的证书。通讯的双方为Web Gateway 和 IRIS Super Server, 双方都需要准备好各自的证书和key。IRIS自带的Public Key Infrastructure(PKI)功能内置了OpenSSL,可以用来生成服务器端及客户端的证书和key。在使用此功能时,IRIS可以同时作为CA Server和CA Client,作为CA Server时可以生成自签名的证书,可以批准CA Client的证书申请并将证书下发给CA Client。 1)配置本地证书颁发机构服务器,生成sever端的证书和key。 2)配置本地证书颁发机构客户端,如下 3)将证书签名请求提交到证书颁发机构服务器 4)进程未决证书签名请求 发放证书。 至此,Client以及Server端证书和key都已准备完成。 5) 从证书发放机构服务器获取证书。 以下证书和key将用于Web Gateway, /intersystems/irishealth/mgr/cac.cer /intersystems/irishealth/mgr/cac.key 以下证书和key将用于IRIS Super Server /intersystems/irishealth/dev/CAcerts/cas.cer /intersystems/irishealth/dev/CAcerts/cas.key 当然也可以去申请商用的证书,也可以不使用PKI直接使用OpenSSL自己去生成。 2. 配置SSL/TLS, 名为%SuperServer 3. Enable Superserver SSL/TLS Support, 4. 在Web Server中配置Web Gateway。 本示例中所使用的Web Server为Apache2.4.6,操作系统为Redhat7.9。注意以下Web Gateway管理页面打开端口为默认的80。另外,上面生成好的证书拷贝至了/tmp/下。 对应的CSP.ini中内容如下, [IRISHEALTH] Ip_Address=localhost TCP_Port=1972 Username=CSPSystem Password=]]]c3lz Minimum_Server_Connections=3 Maximum_Session_Connections=6 Connection_Security_Level=10 Product=2 SSLCC_Protocol=8@ SSLCC_Key_Type=2 SSLCC_Cipher_Suites=ALL:!aNULL:!eNULL:!EXP:!SSLv2 Env_Parameters=EV6 SSLCC_Certificate_File=/tmp/cac.cer SSLCC_Certificate_Key_File=/tmp/cac.key SSLCC_CA_Certificate_File=/tmp/cas.cer SSLCC_Private_Key_Password=]]]MTIz SSLCC_Verify_Peer=1 5. Web Gateway中Test Connection, 报错Server Unavailable。 CSP.log报错如下, >>> Time: Wed Mar 29 12:00:36 2023; RT Build: 2101.1776 (linux/apapi:srv=2.4.6/apr=1.4.8/apu=1.5.2/mpm=prefork); Log-Level: -1; Gateway-PID: 4315; Gateway-TID: 139634317305600; Connection-No: 0; Server: IRISHEALTH; InterSystems IRIS-PID: 0; Request-ID: 249b IRISCONNECT : Error Connecting to InterSystems IRIS : Unable to read SSL configuration Cannot read SSL certificate file: /tmp/cac.cer >>> Time: Wed Mar 29 12:00:36 2023; RT Build: 2101.1776 (linux/apapi:srv=2.4.6/apr=1.4.8/apu=1.5.2/mpm=prefork); Log-Level: 0; Gateway-PID: 4315; Gateway-TID: 139634317305600 Information: Terminate Connection Connection closed by Gateway: Connection-No=0:0; Server=IRISHEALTH; InterSystems IRIS PID=0; Context=205; >>> Time: Wed Mar 29 12:00:36 2023; RT Build: 2101.1776 (linux/apapi:srv=2.4.6/apr=1.4.8/apu=1.5.2/mpm=prefork); Log-Level: 0; Gateway-PID: 4315; Gateway-TID: 139634317305600; Connection-No: ; Request-ID: 249b; Session-ID: uoyakptQAD; Remote-Addr: ; Page: GET /csp/bin/RunTime/Module.cxw Diagnostic Failed to connect to 'IRISHEALTH' - Reason: -201 (SSL Configuration error) (No Retry) 解决办法, 将证书和key文件放置在Web Gateway安装路径下之后问题解决。 SSLCC_Certificate_File=/opt/webgateway/cac.cer SSLCC_Certificate_Key_File=/opt/webgateway/cac.key SSLCC_CA_Certificate_File=/opt/webgateway/cas.cer [root@BJSRHELSUP webgateway]# ll total 16 drwxr-xr-x. 2 root root 23 Sep 17 2021 apache drwxr-xr-x. 2 root root 4096 Sep 17 2021 bin -rwxr-xr-x 1 root root 1233 Mar 29 14:48 cac.cer -rwxr-xr-x 1 root root 1834 Mar 29 14:49 cac.key -rwxr-xr-x 1 root root 1164 Mar 29 14:49 cas.cer drwxrwxr-x. 2 apache root 56 Aug 30 2022 conf drwxrwxr-x. 2 apache root 57 Nov 4 2021 logs drwx------. 2 apache root 6 Mar 29 14:41 temp drwxr-xr-x. 2 root root 20 Sep 17 2021 util 6. Web Gateway中再次Test Connection,成功。 参考文档, InterSystems Public Key Infrastructure Configuring the Web Gateway to Connect to InterSystems IRIS Using TLS
文章
Qiao Peng · 三月 10, 2022

多语言字符集系列文章-- 第三篇 IRIS对多语言字符集的支持和常见问题

3.1 InterSystems IRIS内码与多语言支持 3.1.1 InterSystems IRIS内码与字符集转换 InterSystems IRIS的内码是UTF-16,因此它支持Unicode多语言字符集。对于其它字符编码,例如UTF-8、GB18030、Big 5,它会自动进行转码。例如对于简体中文,它将GB18030输入数据转换为UTF-16,或者将UTF-16数据转换为GB18030输出。 因为GB18030兼容GB2312,所以InterSystems IRIS也支持GB2312。 注意:在第一篇介绍过,GB18030与GBK并不完全兼容,因此InterSystems IRIS理论上不支持GBK。 InterSystems IRIS如何做字符集编码系统间的转换?它使用2种方式: 对于可以通过算法转换的,例如UTF-8与UTF-16的相互转换,InterSystems IRIS会使用算法转换; 对于无法通过算法转换的,例如与UTF-16的相互转换,InterSystems IRIS会使用I/O转换表转换,它其实是两个映射关系表,一个用于特定字符集转UTF-16、另一个用于UTF-16转特定字符集。 注意,大家可能会注意到,GB18030的I/O转换表里并没有所有的GB18030编码,这是为什么呢?回顾一下第一篇关于GB18030的介绍,它提到了GB18030编码中一部分与Unicode编码非连续相关,而另一部分与Unicode编码连续相关。在InterSystems IRIS的GB18030的I/O转换表,其实只有与Unicode编码非连续相关的那部分编码,就是需要通过对照表关联的部分;而连续相关的那部分,是通过算法转换的,因此不在I/O转换表里。这么做的目的是降低把GB18030这么大的代码表全部加载到内存里的硬件成本。 3.1.2 字符集相关的命令、函数和方法 InterSystems IRIS提供了一系列与字符集相关的命令、函数和方法。它们可以帮助我们理解InterSystems IRIS的字符集处理逻辑、帮忙在字符集相关问题出现时进行排错。 这里以汉字为例介绍这些命令、函数和方法。汉字的UTF-16编码的16进制值是9451、GB18030的16进制值是E861。 ZZDUMP:查看变量16进制编码的命令 例如:我们看一下变量x的16进制值 这里,可以看到变量x保存的是汉字,它的16进制的值是9451。9451就是汉字的UTF-16(Unicode)16进制码。 $ZCONVERT($ZCVT):转码函数 如果需要通过代码控制不同字符集编码间的转换,可以使用$ZCVT函数。例如,我们把上面变量x的字符转码为GB18030编码: 这个例子中,传递给$ZCVT的第一个参数是变量x;第二个参数是“O”,意思是将x的字符编码转码为目标码;第三个参数是要转换的目标编码,“GB18030”。现在变量y的值就是汉字的GB18030编码。 同样,你可以把变量y的GB18030编码再转为IRIS内码UTF-16。这时,第二个参数要设置为“I”,意思是设置源编码;而第三个参数还是“GB18030”: 现在变量z仍是汉字的UTF-16编码。 $ASCII、$WASCII :将字符转为10进制UTF-16码 这两个系统函数将所有字符转为其10进制的UTF-16码。名字有点迷惑,它们并不是获得字符的ASCII码,当然对于ASCII字符,ASCII码和UTF-16码是一样的。 其中$ASCII可以将UCS基本平面的字符转为UTF-16,也就是双字节UTF-16编码。例如汉字的就是这样的: 但那些超过双字节UTF-16的汉字就需要用$WASCII来获取其UTF-16的值了。例如汉字“”,它的UTF-16编码是4字节的D85FDFF9,获取它的UTF-16值,就需要用$WASCII($WA)。当然,也可以全用$WASCII来获取所有字符的UTF-16编码。 $CHAR、$WCHAR: 将10进制UTF-16码转为字符 这两个系统函数将10进制的UTF-16码转为字符。例如: 同样,$CHAR可以转双字节的UTF-16;$WCHAR可以转双字节或四字节的UTF-16。 $ZHEX:将16进制数转10进制数、10进制数转16进制数 上面有些函数处理16进制数、一些处理10进制数,可以用函数$ZHEX做10进制和16进制数的转换。例如: USER>w $ZHEX("E861") 59489 大家可能对这个函数比较迷惑:只有一个参数,那么怎么知道它是10进制数还是16进制数呢?例如9451,既可以表达一个10进制数,也可以表达一个16进制数。$ZHEX是这么判断的:是以字符串传入的参数(加了双引号的)就是16进制,而以数字传入的参数(没加双引号的)就是10进制。因此会得到这样的结果: USER>w $ZHEX(9451) 24EB USER>w $ZHEX("9451") 37969 3.2 常见字符集相关问题 既然InterSystems IRIS支持GB18030-2005,那么还会有中文字符集相关问题吗?还是会有,因为InterSystems IRIS不仅是一个数据库,它的互操作功能会和各种数据源和数据目标连接,接收和发送各种编码的数据。如果数据源/数据目标所声明使用的字符集与其实际使用的字符集不同,或者未声明使用的字符集并且实际字符集和IRIS默认的字符集不符,就会造成问题。这也是绝大多数的InterSystems IRIS相关字符集问题的根源。 所以在InterSystems IRIS中遇到字符乱码问题时,首先应该看一下数据声明的字符集是什么,实际收到数据的字符集是什么。数据声明的字符集信息,可以看上一篇《各种技术对字符集使用的声明》的介绍,而实际收到数据的字符集可以使用Wireshark等工具检查。 下面列举一些常见的字符集相关的问题处理方式: 3.2.1 文件 对于正确编码的文件,InterSystems IRIS都可以正常处理。但如果文件声明的字符集编码与实际的编码不同时,可以使用$ZCVT进行转码。 如果在使用文件(File)或FTP适配器,这2个适配器都会CHARSET设置项,可以使用这个设置项做InterSystems IRIS内码(UTF-16)和真实需要的字符编码间自动做相互转换。 InterSystems IRIS提供了好几个字符文件的操作类:%Library.File、%Library.FileCharacterStream、%Stream.FileCharacter。在使用它们创建文件时,需要注意指明文字字符集,否则默认为ANSI,从而造成生僻字异常。 InterSystems IRIS不同的字符文件操作类,对于字符集的声明稍有差异,如下: 对于%Library.File,在执行Open方法时设置字符集,例如设置为UTF8 Set tFile = ##class(%File).%New("c:\temp\test.txt") Do tFile.Open("WSN:/IOTABLE=""UTF8""") 对于%Library.FileCharacterStream,设置其TranslateTable属性,或调用TranslateTableSet方法设置 Set tStream=##class(%FileCharacterStream).%New() Set tStream.Filename="c:\temp\test.txt" Set tStream.TranslateTable="UTF8" 对于%Stream.FileCharacter,设置其TranslateTable属性,或调用TranslateTableSet方法设置 Set tStream = ##class(%Stream.FileCharacter).%New() Set tST=tStream.LinkToFile("C:\temp\test.txt") Set tStream.TranslateTable="UTF8" 另外,还要考虑BOM问题,有些文本编辑器打开没有BOM的UTF-8文件时会显示乱码、而另外一些有BOM反而显示乱码。 对于BOM,%Library.File无法在文件头插入BOM,%Library.FileCharacterStream、%Stream.FileCharacter可以通过设置其BOM属性,例如设置字符集为UTF8,且设置BOM为UTF8的EF BB BF(10进制239 187 191): Set tStream = ##class(%Stream.FileCharacter).%New() Set st= tStream.LinkToFile("C:\temp\test.txt") Set tStream.TranslateTable="UTF8" Set tStream.BOM=$char(239,187,191) Do tStream.Write($C(8224)) Do tStream.%Save() 从性能和功能角度,推荐使用%Stream.FileCharacter和%Library.FileCharacterStream,而不是%Library.File。 3.2.2 数据库 通过InterSystems IRIS连接到第三方数据库进行查询或更新数据操作而出现乱码是比较典型的字符集问题。 当遇到问题时,尤其是Oracle数据库时,首先检查一下数据源的内码设置。如果是其内码设置问题,那么通常需要通过$ZCVT来转码。 如果不是内码设置问题,查一下InterSystems IRIS使用什么方式连接到对方数据库:ODBC还是JDBC。如果是JDBC,看看连接字符串中的字符集设置是否正确;如果是ODBC,看看是不是生僻字乱码,如果是可能需要用$ZCVT转码,否则要检查ODBC驱动是否正确,尤其是是否在使用其ODBC3.5的驱动。 3.2.3 HTTP 遇到HTTP相关的字符乱码,首先查一下HTTP头Content-Type的参数charset设置。如果对方没有设置或设置不正确,且对方不能修稿,可以使用$ZCVT转码。 对于使用HTTP适配器的IRIS业务服务,可以通过其CHARSET设置项来配置字符集,并通过"FORCE CHARSET" 设置项强制跳过HTTP头Content-Type的参数charset设置。 3.2.4 SOAP/REST传递的XML字符流/字符串 首先检查下encoding属性的设置。如果它没有设置或设置错误,且不能修改,可以使用$ZCVT转码。 3.2.5 HL7 V2消息 HL7 V2是医疗行业常用的消息协议,InterSystems IRIS提供了大量的工具和特性以支持HL7 V2消息。 如果是HL7 V2传输中出现的中文乱码问题,首先查一下MSH-18的设置。如果数据源没有设置或设置错了,都可以使用InterSystems IRIS数据转换能力先将其修正为正确的值。当然有可能接收目标系统不按MSH-18设置的字符集解码数据,这时,可以按目标系统要求的字符集来编码数据,而忽略MSH-18。 InterSystems IRIS提供了很多工具,可以查看HL7 V2消息或文件的内容, 例如HL7查看器、消息追踪。InterSystems IRIS会按MSH-18设置的值进行数据的解码,当MSH-18值缺失时,默认值是Latin1。如果是因为MSH-18缺失而造成中文显示为乱码,且HL7 V2消息源无法修改时,可以考虑修改EnsLib.HL7.Util.IOFraming的DefCharEncoding(字符集编码默认值)为消息源使用的字符集。 注意,这种乱码情况不会影响HL7消息的接受接收和发送,仅影响显示。 3.2.6 其它 可能还会碰到一些的中文乱码其实是显示问题,尤其是那些仅生僻字显示有问题的情况。 出现这类显示问题的原因是并不是所有的操作系统和IT工具都支持完整的汉字字符集或汉字字形。 例如,常见的字符终端工具仅支持GB2312,所以对GB2312字符集之外的汉字就会显示为一个特定的符号,看起来就像乱码。 而MacOS的Safari浏览器、Pages文稿和很多应用都不能显示一些GB18030字符集的生僻字,例如: 这种情况下,数据本身没有问题,只是显示不正常而已,通常不需要担心。 这就是InterSystems IRIS多语言字符集的支持的主要内容内容。后面我会持续将客户遇到的与字符集相关的典型问题持续更新到文章的末尾,供大家参考。 附录1: 列表类型的中文数据显示乱码? 最近一个客户问了一个中文显示乱码问题。经过查看,发现乱码字段/属性的类型是list of %String,而且使用逻辑模式查看数据。换成ODBC模式或显示模式就没有问题了。原因是列表元素间是有特殊控制字符的,不同显示模式处理列表类型的数据方式不同,详见 显示模式 。对于列表类型的属性/字段,建议通过STORAGEDEFAULT="array" 将其映射为SQL子表,从而更容易通过SQL查看和操作数据,同时对象和global的访问不产生任何影响。例如: Property MyList as list of %String (STORAGEDEFAULT="array");
文章
jingqi LIu · 三月 3, 2021

酒店行业的第一个Iris应用

InterSystems IRIS中使用ObjectScript构建REST API。 开发的API可以遵循OPEN API规范,可以使用Docker和VSCode开发,可以部署为ZPM模块,同时也可用作酒店超售系统的Data API。 什么是酒店超售管理系统? 超售管理系统结合了酒店的独特条件,例如房价,订购渠道,客户需求等。系统使用机器学习算法(例如:KNN / ES-RNN ...)来准确预测酒店的每日未入住和入住率,并进一步与收益方程式结合以找到最佳的最大客房销售量,从而可以大大增加酒店的边际收益。 来看看我们的Repo! https://github.com/BroadCastAir/hotel_api 和 https://github.com/BroadCastAir/Hotel_OverBooking_Sys 投票支持我们的应用程序! InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。 InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。说的好! 了解了,行业的应用证明了系统的可用性 希望多支持! 这是应用在其他行业中的典型案例,很棒! 看到了酒店行业应用,棒👍
公告
Claire Zheng · 十月 9, 2022

如何为你喜欢的征文投票?来帮助你喜欢的作者赢得“开发者社区奖”!

2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是作者获得“开发者社区奖”的关键!如何为你喜欢的作品投票呢? 第一步,你需要成为开发者社区的活跃用户(Active User) 成功注册后,在社区发帖、点赞、回复问题等,接下来需要……等24小时。因为我们的系统会每天进行一次active user的更新。 成为Active user后,就可以给你心仪的项目投票啦! 第二步,点击进入参赛页面🏆InterSystems开发者社区中文版首届技术征文大赛🏆 第三步,在参赛页面查看所有文章,看到感兴趣的文章,就可以点赞点赞,你可以为你喜欢的每篇文章点赞一次。 10月24日,我们将宣布获奖名单! 欢迎大家积极投稿、点赞、分享、学习! 欢迎关注InterSystems开发者社区中文版首届技术征文大赛
文章
Hao Ma · 四月 18, 2021

IRIS Docker的安装

IRIS相比Caché在部署上的一个进步是支持docker。即便不是云部署, 使用docker也带来非常多的便利。 尤其是在开发测试环节,由于docker的使用更便捷,除非要模拟客户的环境或者做规定的性能测试,我在测试中基本已经不再使用本机的实例或者虚机。IRIS的联机文档有[详细的IRIS docker安装使用指导](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_compose),本文只是一个简单的,快速上手的**在测试环境**安装IRIS docker的简单步骤,尤其适合初学者。 注意Windows上docker可能会遇到这样那样的问题,因此通常还是推荐在Linux或者Mac OS上使用。正式的生产环境的IRIS docker container也是不支持Windows系统的。 > Referrence - [First Look: InterSystems Products in Docker Containers](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=AFL_containers) - [Running an InterSystems IRIS Container: Docker Run ExamplesRunning an InterSystems IRIS Container: Docker Run Examples](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_dockerrun) ##1. 在操作系统上安装Docker环境 [Docker官方文档的安装步骤](https://docs.docker.com/engine/install/)非常清晰,我按照上面的步骤在MAC和CentOS上安装docker从来没有出现过问题。恰恰是这个文档中没有的Redhat上的安装,过程中曾碰到过几个问题,在网上搜索了答案,也不算困难。 简单的复述一下步骤:root用户的最简单安装,没有权限问题, 没有docker网络修改等等: 1. 安装yum-util, 用于添加yum源,如果您的系统中已经有了yum-utils包这步可以省略 sudo yum install -y yum-utils 2. 添加docker的Repo到yum源并确认 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum repolist 3. 安装3个docker组件 sudo yum install docker-ce docker-ce-cli containerd.io 4. 启动Docker sudo systemctl start docker 5. 确认安装成功。'docker run'命令会去本地的库里找'hello-world',没有找到就去网上下一个"images",然后创建一个docker容器给你使用。 sudo docker run hello-world 安装结束您想要到注册一个账户,用来下载上传docker image。 下载命令使用'docker pull', 比如 ``` docker pull nginx ``` ## 2. 下载IRIS Docker image 在线文档[Container Images Available from InterSystems](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry#PAGE_containerregistry)中介绍了网站上可以下载的IRIS images的列表,其中community版本不需要license,其他的版本需要从InterSystems处获得IRIS docker版的专用license. 下面是登录并下载iris docker image的记录。从网页登录,您会得到docker的登录密码"使用的密码"jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb"。 [root@centos7 ~]# docker login -u="hma" -p="jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb" containers.intersystems.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@centos7 ~]# docker pull containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 2020.3.0.304.0: Pulling from intersystems/iris-ml 5c939e3a4d10: Pull complete c63719cdbe7a: Pull complete 19a861ea6baf: Pull complete 651c9d2d6c4f: Pull complete d21839215a64: Pull complete 7995f836674b: Pull complete 841ee3aaa7aa: Pull complete 739c318c2223: Pull complete d76886412dda: Pull complete Digest: sha256:4c62690f4d0391d801d3ac157dc4abbf47ab3d8f6b46144288e0234e68f8f10e Status: Downloaded newer image for containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 [root@centos7 ~]# 另外,您也可以从InterSystems的技术支持网站下载iris docker的压缩包"iris*.tar.gz",然后使用"docker load"安装, 比如: CNMBPHMA:~ hma$ docker load -i iris-2020.4.0.524.0-docker.tar.gz ## 3. 创建并运行IRIS Container ###简单的办法 如果是只是简单的测试,可以直接运行,但如果不是community版本的docker, 您还需要把license拷贝到container内部。 比如下面的步骤 CNMBPHMA:~ hma$ docker run -d -i -p 52773:52773 -p 51773:51773 --name iris20204 intersystems/irishealth:2020.2.0.211.0 CNMBPHMA:~ hma$ docker cp iris.key iris20204:/usr/irissys/mgr/iris.key 需要注意的是,不同版本的超级端口可能不同,有些是1972,有些是51773。为了省事,您也许可以使用"-P"把所有container内部的端口都映射出来。 除了要拷贝license到container内部,在做测试的时候,您可能还要经常的使用"docker cp"把各种测试文件拷入container。而且,当查看和修改container内部文件的使用,还需要使用下面的命令进入container内部: CNMBPHMA:~ hma$ docker exec -it iris20204 /bin/sh 因此,如果是您需要一个经常使用的iris container环境,我还是建议您使用下面的方法。 ### IRIS Container使用外部存储 简单的说,下面的命令 - 使用"--volume"参数为container创建外部存储,将host上的"/root/data/dur"文件夹和container内部的"/dur"文件夹链接起来。(/root/data/dur文件夹要在host上手工创建,这只是一个示意,您可以使用任何可用的目录) - ISC_DATA_DIRECTORY环境设置会在创建iris container时在/dur文件夹下创建一个子目录”/dur/irisepy",所有IRIS运行的日志,客户配置,mgr目录下的用户数据都会保存在这个目录。因为"/dur"是外部存储,即使docker container被删除数据也不会丢失。这对container的重新创建或者iris升级都带来很大的方便。在线文档上对如果覆盖或者升级带有外部存储的iris container有详细的介绍。 - “key"参数定义了在IRIS container创建时会把"/dur/license"目录下的iris.key拷贝到iris安装目录的mgr下并激活。也就是说,在运行命令前, 您需要在host上在"/root/data/dur"目录下创建"license"子目录并将iris.key拷贝进去。 docker run --name irisepy --init -d\ -p 9091:1972 -p 9092:52773\ -v /root/data/dur:/dur\ --env ISC_DATA_DIRECTORY=/dur/irisepy \ containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 \ --key /dur/license/iris.key 希望您喜欢使用docker
文章
王喆 👀 · 十一月 17, 2022

使用VSCode开发IRIS

经过一段时间的学习和使用本文总结了一些使用VsCode开发的使用方法,本文偏向于应用但会对少量的我知晓的原理进行一部分解释。 参考教程链接:https://cn.community.intersystems.com/node/488611 VSCode下载:https://code.visualstudio.com/ 使用VSCode开发的优劣: 1 优势: 跨平台(Windows|MAC|Linux)开发调试远程服务端代码,而且可以快速导出COS代码(M语言也可以)。 SQL辅助查询数据 快捷的代码调试方式,一种是直接在VSCode中调试,另一种是快速复制类名和方法名在Terminal中调试。 代码智能联想补全,类似其它语言,输入开头的前几个字符可以联想后面的。 快速跳转到方法定义(ctrl+鼠标左键 | F12) 主题图标多样化,可以使用默认的黑色,当然也可以使用和studio一样的样式,链接:https://cn.community.intersystems.com/node/516996 2 劣势: 无法导入导出XML文件 缺少一些Studio的常用功能: SOAP向导 Java网关 DT转换拖拽编写 BP流程拖拽编写 安装步骤 1官网安装Visual Studio Code编辑器 https://code.visualstudio.com/Download 安装直接下一步 - 下一步 2 汉化 如果安装为英文要切换为中文则可以通过Command Palette 中运行Configure Display Language,install another language, 选择中文,再根据提示安装相应的语言插件。 3 扩展安装 打开软件,侧边栏点击扩展按钮->搜索 "InterSystems" -> 安装扩展,如图所示: 前三个是IRIS官方推荐按安装的插件,其中InterSystems ObjectScript Extension Pack (集成好的InterSystems插件包),在此还推荐安装SQL Tools InterSystems IRIS(连接数据库插件,使用效果类似于SQLdbx) 4 配置 VSCode支持图形化的配置,但实测并不好用,而且容易保存失败,在此推荐使用settings.json 打开:设置 -> 扩展 -> InterSystems Server Manager -> settings.json { "intersystems.servers": { "loc": { "webServer": { "scheme": "http", "host": "127.0.0.1", "port": 52773 }, "askForPassword": false, "username": "Superuser", "password":"SYS", "description":"228" }, }, "terminal.integrated.detectLocale": "on", "intersystems.language-server.diagnostics.routines": true, "editor.renderControlCharacters": false, "editor.unicodeHighlight.ambiguousCharacters": false, "git.autorefresh": false, "git.autoRepositoryDetection": false, "git.confirmEmptyCommits": false, "git.confirmForcePush": false, "git.confirmNoVerifyCommit": false, "git.confirmSync": false, "git.countBadge": "off", "diffEditor.wordWrap": "on", "editor.wordWrap": "on", "workbench.colorTheme": "InterSystems Default Dark", "workbench.editor.enablePreview": false, "vsicons.dontShowNewVersionMessage": true, "git.enableSmartCommit": true, "explorer.confirmDelete": false, "editor.fontSize": 13, "objectscript.conn": { "host": "127.0.0.1", // 连接数据库IP "port": 57772, // 连接数据库端口 "username": "Superuser", // 用户名 "password": "SYS", // 密码 "ns": "BKlinik", // 命名空间 "active": true, // 是否开启 "https": true, "server": "bklinik" // intersystems.servers中设置的数据库服务器名 }, "sqltools.connections": [ { "namespace": "BKlinik", "connectionMethod": "Server and Port", "showSystem": false, "previewLimit": 50, "server": "localhost", "port": 52773, "askForPassword": false, "driver": "InterSystems IRIS", "name": "BKlinik", "username": "Superuser", "password": "SYS" } ], "intersystemsServerManager.credentialsProvider.deletePasswordOnSignout": "never", } 这是我目前使用的: intersystems.servers :指的是IRIS的服务器的设置,内部的服务器命名不可大写,相比较官方出具的设置,我增加了【"askForPassword": false, "password":"123456",】此处的增加是方便后面打开代码的时候不需要再输入密码。 5 打开代码 打开代码有两种方式:一种是直连代码打开,另一种是客户端方式连接,第一种相当于studio直接连着代码进行编辑,第二种是把代码下载到本地磁盘的对应目录进行编辑。第一种方式好处是完全无感的查看编辑代码,但是如果不小心删掉之后无法恢复。第二种方式删掉之后可以恢复,而且也可以用GIT等代码版本控制,但是如果多人同时编辑代码,可能会存在冲突覆盖的情况。 直连代码 Instersystems tools – All Servers – 【服务器名】– NameSpace – 命名空间 然后你就可以愉快的编辑代码了 客户端方式打开 首先,你得建立一个文件夹,如图:本文是在D://workspace建立的一个aaa文件 点击打开文件夹 – 选择对应文件 此时会出现一个IRIS的图标,ObjectScript,如图所示: 点击ObjectScript – Choose Server and Namespace – 选择对应的服务器 再选择你需要的命名空间 比如我这边选择的是【HSLIB】 选择你需要编辑的代码 - 右键 - 选择Export 输出的框里会显示导出详情,如下图所示: 等待导出完毕,回到代码编辑,你的代码会出现在src目录下,如图所示: 如果你了解过ZPM的话,你现在还可以在这边添加一个module.xml,方便你把这个代码导入到其它机器上,ZPM相关的知识可以去GitHub上看看,关键就两个命令 [zpm] [load -v 【路径】] 和一个文件的编写,特别好用的是导入发布订阅和查找表,导代码的话得保证你的代码一行都没有问题,如果你的代码在使用的时候跨命名空间做了一些操作的话ZPM也会报错。 如何配置GIT的话,可以通过命令行的方式在本地文件上配置,也可以在VSCode上处理,和其它代码的处理方式差不多。 如果你安装了【SQL Tools InterSystems IRIS】那么上述配置中的sqltools.connections就是你需要的连接配置,你可以尝试改成你自己的库,然后进行一些简单的SQL操作。当然个人还是推荐使用DBeaver,这个更好用。 总结 好了,以上就是如何进行VSCode开发的我的一些小分享,如果有纠正请联系!!! 非常棒的文章! 补充InterSystems使用VSCode开发的官方文档 Welcome to the VS Code InterSystems ObjectScript documentation - InterSystems ObjectScript for VS Code (intersystems-community.github.io) 可以通过下面网址直接打开SOAP 向导页: {serverurl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace={namespace} 比如:http://localhost:52779/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace=MyTest 也可以在VSCode里添加用户自定义的快捷键: "objectscript.conn": { "links": { "Portal Explorer": "${serverUrl}/csp/sys/exp/%25CSP.UI.Portal.ClassList.zen?$NAMESPACE=${ns}", "SOAP Wizard": "${serverUrl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?$NAMESPACE=${ns}" }, } 参考文档:https://intersystems-community.github.io/vscode-objectscript/configuration/#server-actions-menu 另:BPL,DTL一般直接在浏览器中进行编辑,完全不需要VSCode。 感谢 感谢 学到了
公告
Claire Zheng · 六月 13, 2022

2022 SUTA培训报名启动啦!

SUTA培训是InterSystems专为SUTA有效期客户提供的原厂产品技术服务,具体包括产品的基础管理、编程管理、高级管理和开发培训等。即日起2022 SUTA培训报名启动,本年度为针对InterSystems数据平台产品的线上培训,一共6期12个课程,其中每期两个课程,时间安排在周五下午半天(6月24日—8月5号),6期培训总时长共计三天。点击此处报名,或者扫描下图中的二维码报名,在您的报名信息经过审核后,我们会与您进一步沟通线上培训细节。快来报名吧! 点击下载,了解2022 SUTA培训课程安排详情。
文章
Hao Ma · 三月 25, 2021

使用DBeaver连接IRIS数据库

在Caché时代, 比较受欢迎的IRIS数据库客户端是Sqldbx和Winsql, 这两者的共同点是提供ODBC兼容的连接,而且免费。限制也差不多:只能用于Windows环境,只能用ODBC连接。 DBeaver是我最近使用的免费SQL客户端, 推荐给各位。它有几个好处: 1. 支持各种操作系统:Windows, Linux, Mac. 2. 内置Caché和IRIS的JDBC driver, 可以简单配置到Caché 或者IRIS的连接。 3. 免费 下面说说配置的一些小细节: - 连接IRIS 下图中的配置项都很简单,需要的信息无非是数据库IP地址, 端口,数据库的名称,以及账号密码。值得一说的是下面下拉栏里的InterSystems IRIS driver. 初始安装DBeaver时这个driver不是默认安装好的, 你需要到"Edit Driver Setting"的"Libraries"页面去下载,按钮是"Download/Update". 下载的地址是https://github.com/intersystems-community/iris-driver-distribution/raw/main/intersystems-jdbc-3.1.0.jar。 讨厌的是,这个页面的响应速度有点慢,因此您很可能会被timeout。我的解决方法是拷贝这个网址,从浏览器把这个包下来,然后放到DBeaver指定的路径去。上述地址和要放的文件路径都可以在”Driver Setting"的"information"页面得到。 -连接Caché 这个就容易多了。 虽然也有可能要下载driver, 但Caché的driver是已经存在Dbeaver网站的repo里面了,不会有下载和更新timeout的问题。 (我相信用不了多久IRIS的driver也会放进DBeaver的repo的) happy coding 马老师好,请教个问题,就是我按照步骤操作之后,连接还是提示Connection refused: connect,驱动我是从本地安装目录拷贝出来的(D:\IRIS-HealthConnect\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar),这个可能会是什么问题
公告
Claire Zheng · 五月 9, 2021

欢迎中文社区新版主@刘文艺

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@刘文艺。 @刘文艺在嘉和美康(北京)科技股份有限公司任职集成平台研发部产品经理。 以下是@刘文艺的自我介绍: 大家好,我带领团队主导了多家大型医院的信息平台开发、系统集成和互联互通项目,有丰富的基于InterSystems产品的开发、部署和项目经验,对医疗信息行业有很深的认识和独特的想法,熟悉医疗行业相关标准,并获得HL7认证证书,和InterSystems技术认证证书。 本人乐于参与组织各种活动,分享经验,协作能力强,善于与人交流,很荣幸在InterSystems开发者社区(中文版)与大家相识,今后希望通过与大家共同努力,不断完善开发者社区的内容建设,提高社区人气的活跃度和忠诚度。让社区更好地为开发者提供知识传播、在线学习等服务。 感谢@刘文艺,恭喜你成为新版主! 热烈欢迎! 欢迎欢迎! 欢迎刘文艺! 作为国内首位开发者大赛的获奖者,请多多和大家分享你的经验哈
公告
Claire Zheng · 十一月 14, 2021

大突破:全球开发者社区已有1万名成员! 中国开发者社区不到一年时间突破270人!增速全球第一!

亲爱的开发者们,我们很高兴地跟大家分享一个好消息! 我们的社区全球注册会员突破10000名!中国开发者社区不到一年时间突破270人!增速全球第一!这是一个了不起的成就!感谢大家的支持🎊 在InterSystems,我们相信社区的力量。所以我们非常感谢你们在过去六年里所做的贡献,并期待未来的道路! 我们希望与大家分享一些有趣的数据,全球社区: 2015年12月上线 总计发布 - 8,600篇 共计提问 - 5,500次 总计浏览 - 430万 中文社区 2021年1月上线 总计发布 - 748篇 共计提问 - 100+次 总计浏览 - 21000+ 不到一年的时间,能够有如此大的成绩,非常感谢所有人的参与和贡献,感谢你们的热情和分享!我们非常感谢大家的帮助,使我们的社区成为InterSystems乃至整个医疗信息化开发人员更好的地方。大家真的很棒! 请随时分享您成为InterSystems开发人员全球和中国大家庭一员的感受! 再次感谢大家,共同成就了这个可爱的大社区! 敬上,开发者社区团队 ❤️
公告
Claire Zheng · 七月 11, 2022

欢迎中文社区新版主@黄念刚

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@黄念刚。 让我们以热烈的掌声欢迎 @黄念刚! @黄念刚目前任职于东华医为(Mediway),担任技术支持中心开发工程师一职。 以下是@黄念刚的自我简介: 我从2012年入职东华后开始接触InterSystems 的集成平台。使用过 InterSystems早期的Caché版本, Ensemble,目前使用的最高版本是Ensemble2016。 本人有接近10年的医疗信息化经验,熟悉 HL7 V2/V3,有着丰富的领域知识。 InterSystems 平台是一个非常优秀的集成平台,借助该技术,给我们业务带来了非常大的便利。我希望这么优秀的技术,能给更多的兄弟单位和合作伙伴创造价值。我希望能够在社区与大家一起交流,分享自己的一些实践经验,此外希望借助社区这个平台,向大家学习一些优秀的实践。我们一起成长,共同进步! 再次欢迎我们的新版主@黄念刚👏🏼👏🏼👏🏼👏🏼👏🏼 期待你在DC成长为一名优秀版主! 热烈欢迎!!!
文章
Tingting Jiang · 三月 21, 2023

实习生招聘

注意:请投递时,发送英文简历! 工作概述 每年夏天InterSystems都会招聘实习生在中国办公室工作,从事专门围绕InterSystems产品设计的项目。我们信任实习生团队在导师的指导下可独立的工作。除了在项目中工作外,实习生还能融入我们的团队,与我们的全职员工一起解决所面对的工作问题。 InterSystems的带薪暑期实习项目可以让学生接触到在重要的职业生涯中出类拔萃所需的各种技术和软技能。 我们希望实习生可以累计工作时长4个月,预计于2023年6月份开始。 工作职责 参加必要的培训课程,成功完成实习期间分配的项目。 在导师和其他InterSytems员工的指导下,成功地完成分配给他们团队的项目。 向高层领导和InterSystems的员工展示他们的项目。 遵守实习计划的所有要求(包括出勤、着装、行为)。 遵守公司关于实习的合理指示。 在公司规定的时间内可以进行活动。 如果在实习期间有任何计划外的缺席,请及时通知人力资源部门。 遵守适合公司的职业行为标准。 遵守公司的政策和程序,包括那些与WHS和就业公平和多样性有关的政策和程序。 在任何时候都要适当地、负责任地使用公司的资源。 承担所有与实习有关的评估活动。 对在实习期间获得的有关公司、员工、客户和公司业务的信息进行保密。 公司可能不时地指示其他职责。 任职条件 优先有以下一种或多种编码经验:Python、InterSystems ObjectScript、Node.js、SQL、XSLT和AngularJS在敏捷团队中工作,或类似的经验。 技术上的好奇心。 对复杂的技术挑战有创造力。 协作的团队心态。 在不断变化的工作环境中表现出灵活的态度。 主动为自己的职业生涯打下技术基础。 专业要求 计算机等相关专业的本科生、硕士生或者博士在读学生。 薪资 本科生:RMB6,000/月;硕士生:RMB7,000/月;博士生:RMB8,000/月。 工作地点 北京市朝阳区建国门外大街1号银泰中心写字楼C座2701 如何申请 请点击链接InterSystems Careers, 或在2023年4月30日前发送邮件至recruitment.asiapacific@intersystems.com。 不知道我可不可以 你可以给实习生当老师 哈哈哈哈
文章
TZ Zhuang · 六月 2, 2021

FAQ 常见问题系列--系统管理篇 如何进行数据库备份

InterSystems产品有四种备份方法:(1) 外部备份(2) 在线备份(3) 冷备份(4) 传统的并行外部备份有关这些方法的细节请参考在线文档 https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_BACKUP 以下是对每种备份方法的简要描述: (1) 外部备份外部备份是InterSystems推荐的最佳备份方式。外部备份一般是对数据库文件所在的存储创建快照的方式来实现。创建快照可以在多个层面进行,例如存储层面,操作系统层面,等等,因此这些相关技术和工具一般由第三方来提供。在做快照前,一定要先停止对数据库文件的写入(InterSystems IRIS的IRIS.DAT,Caché/Ensemble的CACHE.DAT)。但是用户进程可以继续对内存进行更新,而不需要中断。InterSystems提供了停止对数据库文件写入的方法,用户可以把这个加入到快照工具的脚本里。外部备份一般包括以下几步:1. 使用Backup.General.ExternalFreeze()方法来停止对数据库文件的写入。2. 使用第三方快照工具来对文件系统创建快照。3. 使用Backup.General.ExternalThaw()方法来恢复对数据库文件的写入。4. 把快照拷贝到备份介质上(用于存储备份的磁盘,磁带,等等)。5. 删除快照。 (2) 在线备份在线备份是InterSystems自己特有的备份方式,可实现无宕机备份。但是,在线备份只能备份数据库文件(InterSystems IRIS的IRIS.DAT,Caché/Ensemble的CACHE.DAT),并且会把所有需要备份的数据库文件中的数据块写入到一个.cbk的备份文件。因此如果想要使用在线备份来备份整个系统环境,除了数据库文件外,还需要额外备份很多系统文件,例如InterSystems产品的安装目录,WIJ文件,主日志和备日志目录等等。在线备份包括3种类型:1. 全备份 -- 把所有使用的数据块写入到一个.cbk文件。2. 累积备份 -- 从上一次全备份起,所有变化过的数据块写入到一个.cbk文件。恢复时,需要和上一次全备份一起恢复。3. 增量备份 -- 从上一次备份起,所有变化过的数据块写入到一个.cbk文件。恢复时,需要和上一次全备份及中间所有备份一起恢复。在线备份的这些特性,并不适用于作为数据量大的生产系统的备份方案。 (3) 冷备份冷备份是在数据库系统正常停机状态下,所做的外部备份,即拷贝文件系统到存储介质。 (4) 传统的并行外部备份传统的并行外部备份是一种在特殊情况下才可行的备份方法。一般需要满足以下条件:1. 数据库在一个集群里,并且不能有宕机时间。2. 没有快照功能。3. 在线备份不能满足需求。并行外部备份结合了数据库文件(*.DAT)拷贝和在线备份里增量备份的功能。其步骤如下:1. 在数据库中设置备份启动标志。2. 拷贝数据库文件(*.DAT)。3. 对该拷贝时间内被修改的数据进行在线备份的增量备份。具体使用情况和详情也请参考在线文档 https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GCDI_backup#GCDI_backup_methods_ext_concurrent 最新版本InterSystems IRIS for Health示例:===============================================================1. 设置标志,开始备份数据库。Set ^ClearOK=$CLRINC^DBACK("QUIET")2. 拷贝操作系统上的数据库文件(*.DAT)。3. 运行下面的命令,表明你已经使用了一个外部备份工具。Set x=$$BACKUP^DBACK("","E","Dirty external backup","","","")4. 进行增量备份。Set x=$$BACKUP^DBACK("","I","incremental","test.cbk","Y","bck.log","QUIET","Y","Y")===============================================================InterSystems产品中的上述处理可以做成例程Routine或类方法,并与批处理相结合进行操作。关于传统并行外部备份中使用的^DBACK例程的更多信息,请参考以下文件https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GCDI_backup#GCDI_backup_util_DBACK_entry_backup
文章
Qiao Peng · 二月 18, 2022

SQL语句与数据模式(Select Mode)

InterSystems IRIS和InterSystems Caché 里,是否您遇到过执行一个SQL Insert/Update语句,明明给的是正确的日期值,但被告知“值‘2022-01-01’ 校验失败”的类似情况,并感到困惑? 如果有,那么您需要了解一下InterSystems IRIS和InterSystems Caché保存和显示数据的模式。 一 数据模式 InterSystems IRIS和InterSystems Caché里,数据有3种模式,称之为SELECT MODE:逻辑模式:这是数据被保存到InterSystems IRIS和InterSystems Cache'时的格式。例如,%Date类型的数据,在数据库里被保存为一个整数,即从1840年12月31号到这个日期的天数,而不是YYYY-MM-DD的格式。 ODBC模式:这是ODBC对数据定义的格式。在这个模式下,%Date类型的数据就会显示为YYYY-MM-DD的格式。 显示模式:这是数据在InterSystems IRIS和InterSystems Caché里默认的显示格式。例如在美国语言环境下,%Date的默认显示格式是DD/MM/YYYY格式。 InterSystems IRIS和InterSystems Caché只会使用逻辑模式保存数据,但可以以任何模式显示数据。 二 数据类型与数据模式 大多数数据类型在3种数据模式下的格式是一样的,例如%String、%Integer等。但有些情况下,数据在不同数据模式下的格式是不一样的: 时间、日期类型的数据 InterSystems提供多种时间、日期数据类型,包括%Date、%Time、%PosixTime、%TimeStamp 和%MV.Date。除了%TimeStamp,这些时间日期数据类型的3种数据模式下的格式都是不同的。 列表类型的数据 作为一个多模型数据库,可以指定数据为列表类型(%ListOfDataTypes)。列表类型数据的在不同数据模式下的格式也是不同的。例如一个定义为list of %String的属性/字段,中文数据以显示模式和ODBC模式看,数据显示是没问题的,但逻辑模式下看似乱码(其实并非乱码)。 指定了VALUELIST 和 DISPLAYLIST的数据 例如在建立患者模型时,我们指定其性别数据类型为%String,但通过VALUELIST限定它的值只可以是0、1、2、9,通过DISPLAYLIST设置这4个值的显示值为“未知的性别"、 "男性"、"女性"、"未说明的性别"。这样,数据被保存到数据库时,保存的是0、1、2、9,而显示值和ODBC值都是中文说明。 空字符串和空字符流数据 在逻辑模式下,空字符串和 空BLOB 由不可显示的字符 $CHAR(0) 表示。在显示模式下,它们由一个空字符串 ("") 表示。 三 SQL与数据模式 InterSystems提供很多种SQL操作的方式,而其当使用SQL操作数据的时候,很多操作和数据模式有关,例如数据排序。 SQL操作的方式 您是如何使用SQL的?是通过ODBC/JDBC,还是在Object Script里通过嵌入式SQL或动态SQL,抑或是通过Terminal或管理门户的SQL操作页面? 1. ODBC/JDBC 通过ODBC/JDBC连接到InterSystems数据库时,问题很简单:无论是插入或更新数据,还是查询数据,作为值、查询条件的数据和返回的数据显示结果都是按ODBC格式的。也就是说,这种情况下,您不需要关心数据模式。 2. 嵌入式SQL 如果您在使用嵌入式SQL(&SQL)操作数据,那么就需要留心数据模式了。可以通过#SQLCompile Select这个预处理器指令设置需要的数据模式,例如设置为ODBC模式: ClassMethod Test(pDocNo = "Doc123456") { #SQLCompile Select=ODBC &SQL(Insert into Test.Table( DocumentNo, DOB, name_Value) values( :pDocNo, '2001-10-10', '预防接种史描述') ) } #SQLCompile Select可以设置为逻辑模式(Logical)、显示模式(Display)、 ODBC模式(ODBC)或 运行时模式(RuntimeMode)。而RuntimeMode默认为逻辑模式。 3. 动态SQL 如果是使用动态SQL,对于%SQL.Statement,它有一个属性%SelectMode,可以用来设置数据模式。它的可选值为:0 (逻辑模式)、1 (ODBC模式) 、2(显示模式),0(逻辑模式)是默认值。 例如下面的例子将数据模式设置为逻辑模式: SET myquery = 3 SET myquery(1) = "SELECT {t '12:04:29'} AS time1," SET myquery(2) = "{t '12:4:29'} AS time2," SET myquery(3) = "{t '12:04:29.00000'} AS time3" SET tStatement = ##class(%SQL.Statement).%New() SET tStatement.%SelectMode=0 SET tStatus = tStatement.%Prepare(.myquery) SET rset = tStatement.%Execute() DO rset.%Display() 4. Terminal的SQL shell 当使用Do $System.SQL.Shell()进入Terminal的SQL操作环境时,可以使用SET SELECTMODE命令来查询和设置数据模式。 直接使用SET SELECTMODE命令,返回的是当前数据模式。要设置数据模式,使用SET SELECTMODE=odbc/logic/display,例如SET SELECTMODE=odbc将当前SQL操作环境的数据模式设置为ODBC模式。 注意:SET SELECTMODE=odbc,等号前后不能有空格! 5. 管理门户的SQL操作页面 在管理门户的SQL操作页面中,通过下拉列表来选择当前的数据模式。 例如下面的逻辑模式的数据显示结果: 这是相同的数据在显示模式下的数据显示结果: 6. 在同一个SQL语句中显示不同的数据模式 有可能出于某种原因,你希望在SQL语句中对不同的字段使用不同的数据模式。这时,可以使用SQL函数:%EXTERNAL、%INTERNAL和 %ODBCOUT 来控制输出模式。 %EXTERNAL:按显示模式输出表达式结果%INTERNAL:按逻辑模式输出表达式结果 %ODBCOUT :按ODBC模式输出表达式结果 例如对于相同的数据,我们采用不同的数据模式输出: 那么除了显示和赋值,哪些操作和数据模式相关呢? 和数据模式相关的操作 1. 比较谓语 在where子句中进行比较的谓语,包括=、>、<、BETWEEN和 IN,这些比较谓语操作时,都会用逻辑模式的值进行比较操作,但可以通过SQL函数做其他数据模式到逻辑模式的数据转换。 例如,我们做日期类型的比较,当前的数据模式是ODBC模式,mydate是ODBC模式,比较条件值也应该是ODBC模式,可以这样写: ... WHERE mydate > '2010-01-01' 而如果数据模式是逻辑数据模式,上面的SQL写法将不会得到你想要的结果,因为这时mydate是逻辑模式的值。你可以用SQL函数TO_DATE将ODBC格式的日期值转为逻辑值: ... WHERE mydate>TO_DATE('2010-01-01','YYYY-MM-DD') 2. 模式谓语在where子句中进行模式分析的谓语,包括%INLIST、 LIKE、 %MATCHES、 %PATTERN、 %STARTSWITH、 [ (包含操作符) 和 ] (跟随操作符),这些模式分析操作也是用逻辑值进行比较,但不能用SQL函数进行其他模式到逻辑模式的转换。 当然,你可以考虑用模式转换函数将数据转换为字符串进行模式分析,例如下面的SQL使用%ODBCOUT将mydate转为ODBC格式的字符串,并看其模式是否满足以“2010-”开头。 ...WHERE %ODBCOut(mydate) %STARTSWITH '2010-' 注意,这时SQL引擎不会使用mydate上的索引,有可能造成性能降低。 3. 排序操作 无论使用哪种数据模式,ORDER BY 都使用逻辑模式的值进行排序。
问题
洪玉 刘 · 二月 8, 2023

license

license和 cpf 文件的使用机制 这个问题有点大,建议先看我们的官方文档后: 有具体问题再继续讨论。 https://docs.intersystems.com/results.html?docs%5Bquery%5D=license, https://docs.intersystems.com/irislatest/csp/docbook/Doc.Results.cls?docs%5Bquery%5D=CPF&docs%5BrefinementList%5D%5Bproduct%5D%5B0%5D=InterSystems%20IRIS&docs%5BrefinementList%5D%5Bversion%5D%5B0%5D=2022.3