搜索​​​​

清除过滤器
公告
Claire Zheng · 十月 20, 2022

【最新排名(按点赞)】投票倒计时三天:继续为你喜欢的征文作品投票吧!

2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是优秀作品获得“开发者社区奖”的关键!我们先来看看目前作品排名情况吧!距离投票截止还有三天(截止至10月23日),我们暂时无法获得专家评审分数,以下根据作品“点赞”进行排名(排名截至10月21日10时)。 N Author 标题 点赞⬇ 1 Meng Cao Caché数据库私有apache版本升级 42 2 Zhe Wang IRIS如何进行CRUD操作 37 3 sun yao 前端操作自动生成BS、BP、BO 26 4 John Pan 论集成标准的选择对医院信息集成平台建设的影响 23 5 lizw lizw 关于%Dictionary.CompiledClass类在实际业务中的一些应用 23 6 聆严 周 使用Prometheus监控Cache集群 21 7 Chang Liu 在国产系统上安装Healthconnect2021 19 8 Zhe Wang IRIS快速查询服务思路分享 18 9 Zhe Wang 使用Global进行数据可视化---商业智能(BI) 18 10 John Pan 如何调用Ensemble/IRIS内置的HL7 V2 webservice - Java,PB9,Delphi7样例 17 11 zhanglianzhu zhanglianzhu Cache死循环检测和申明式事务 16 12 Zhe Wang Rest实现Post、Get、Put、Delete几种操作方式 15 13 shaosheng shengshao HEALTHSHARE2018版如何实现AES(CBC)的HEX输出,并可以实现加密和解密 15 14 姚 鑫 IRIS与Caché的23种设计模式 15 15 water huang 对 %XML.PropertyParameters类的探索 15 16 Zhe Wang 小工具:IRIS管理页打开显示查询功能 15 17 聆严 周 Cache / IRIS 操作数据的3种基本方式 14 18 he hf 10分钟快速开发一个连接到InterSystems IRIS数据库的C#应用 14 19 shaosheng shengshao windows下处理IIS在未安装但Healthshare已安装的时候,部署IIS服务并代理Healthshare 11 20 water huang Ens.Util.JSON类的启发 11 21 bai hongtao 第三方HA软件结合MIRROR使用方法探讨 11 22 li wang HealthConnect访问HTTPS开头地址 10 23 Liu Tangh 在Cache系统中使用负载均衡服务的探讨 9 24 yaoguai wan IRIS架构的浅显理解以及windows10、docker安装IRIS Health详解流程及部分问题浅析 7 25 li dong 实现Cache/IRIS中zip文件的下载、解压及读取 7 26 姚 鑫 CORS请求Request携带Cookie失败占用License解决方案 5 27 Zhe Wang COS的基本语法 5 *奖励项目详见参赛规则:点击阅读 我们此次征文大赛计分规则如下: 🥇【专家提名奖】评选规则,由经验丰富的专家评审团进行评选打分,与其他加分项综合后进行排名。 🥇【开发者社区奖】评选规则,每个点赞计分为1分,与其他加分项综合后进行排名。 🥇【入围奖】评选规则,成功参赛的其余用户都将获得特别奖励。 每位作者只可以获得一个奖项(即:您只可以获得一次专家提名奖/开发者社区奖/入围奖); 当出现票数相当的平手情况时,将以专家评选投票数作为最终票数高低的判断标准。 那么,抓住最后五天的投票时间,为你喜欢的作品“点赞”投票吧!你的点赞是优秀作品获得【开发者社区奖】的关键! 10月24日晚19:30-20:30,我们将举办“InterSystems首届技术征文大赛线上分享会”,发布获奖名单,敬请留意后续参会信息! 欢迎关注InterSystems开发者社区中文版首届技术征文大赛
文章
Hao Ma · 十一月 26, 2022

ZPM介绍(3)

## 建立私服(Porxy-Registry) 这张图解释了您的私服是怎么工作的, 整篇文章在这里: [Proxy-Registry](https://community.intersystems.com/post/new-zpm-registry-feature-%E2%80%93-proxy-registry) ![](https://community.intersystems.com/sites/default/files/inline/images/proxy.png) ### 搭建私服 您需要有一台自己的的服务器, 在上面安装IRIS, zpm, 然后用zpm去下载另一个软件包“zpm-registry"。象这样 ```sh zpm:DEMO>search -r zpm-registry registry https://pm.community.intersystems.com: zpm-registry 1.1.11Repository: https://github.com/intersystems-community/zpm-registry/ zpm:DEMO>install zpm-registry [DEMO|zpm-registry] Reload START (/usr/irissys/mgr/.modules/DEMO/zpm-registry/1.1.11/) [DEMO|zpm-registry] Reload SUCCESS [zpm-registry] Module object refreshed. [DEMO|zpm-registry] Validate START [DEMO|zpm-registry] Validate SUCCESS [DEMO|zpm-registry] Compile START [DEMO|zpm-registry] Compile SUCCESS [DEMO|zpm-registry] Activate START [DEMO|zpm-registry] Configure START [DEMO|zpm-registry] Configure SUCCESS [DEMO|zpm-registry] Activate SUCCESS zpm:DEMO> ``` 到github页面, https://github.com/intersystems-community/zpm-registry/, 你可以得到更详细的软件信息。 配置私服连接公服, 需要在私服的IRIS的安装目录添加一个yaml文件, 定义uplink: ```yaml uplinks: pm: url: https://pm.community.intersystems.com/ allow_packages: dsw,zpm*,?u* ``` 几点说明: - uplinks的项目可以有多个,pm是intersystems的默认公共registry - allow_packages: - a comma-separated list of allowed packages, you can use the exact package name or mask: * - any sequence of characters, ? - any charac - registry 提供的rest 接口描述: https://pm.community.intersystems.com/_spec ### 设置zpm client连接私服 通过repo命令将您的zpm client切换到刚刚配置的私服。`repo -n registry`里面的 - user, - pass是你搭建的私服的账号密码。您也可以在私服上修改/registryWeb应用不做用户验证。 ```sh zpm:DEMO>repo -list registry Source: https://pm.community.intersystems.com Enabled? Yes Available? Yes Use for Snapshots? Yes Use for Prereleases? Yes Is Read-Only? No Deployment Enabled? No zpm:DEMO>repo -n registry -r -url http://localhost:52773/registry/ -user superuser -pass demo registry Source: http://localhost:52773/registry/ Enabled? Yes Available? Yes Use for Snapshots? Yes Use for Prereleases? Yes Is Read-Only? No Deployment Enabled? No Username: superuser Password: zpm:DEMO> ``` 这时的私服时没有连接公服。 ### 发布软件包到私服 **发布一个 GitHub 的包** 先把软件存在github, 然后用curl命令把包发布在私服的地址。 ```sh $ curl -i -X POST -H "Content-Type:application/json" -u superuser:1104 -d '{"repository":"https://github.com/psteiwer/ObjectScript-Math"}' 'http://localhost:52773/registry/package’ ``` **使用zpm 客户端先在本地load,然后使用publish 命令** 大概像这个样子: ```sh zpm:USER>help load ... ■ Examples ∙ load C:\module\root\path\ load C:\module\root\path\module-0.0.1.tgz Loads the module described in C:\module\root\path\module.xml ∙ load -dev -verbose C:\module\root\path\ load -dev -verbose C:\module\root\path\module-0.0.1.tgz Loads the module described in C:\module\root\path\module.xml in developer mode and with verbose output. ∙ load https://github.com/user/repository.git load https://github.com/user/repository.git -b branch-name Loads the module described in C:\module\root\path\module.xml in developer mode and with verbose output. zpm:USER> load https://github.com/user/repository.git zpm: USER> publish ``` ## 其他的Feature 在使用中您还会有各种各样的需求, 但我相信看到现在您应该对怎么寻找答案非常清楚了。这里简单的说两个feautre ### 1. 发布为Delopyed模式 如果您要隐藏自己的代码,只发布编译后的软件, 可以简单的修改Module.xml, 设置““, zpm会自动完成。 ### 2. 包的依赖 因为有朋友问,所以说一些包依赖的功能。是的, zpm是设计了包依赖的功能的,在module.xml里添加Dependencies节点, 可以定被依赖的包的列表。 具体的写法请参见这个例子:[module.xml example](https://github.com/intersystems/ipm/wiki/03.-Module.xml#modulexml-example)。 虽然但是,对ObjectScript程序来说,定义包依赖的机会并不多。我能想到的应用场景就是, 当您的软件中想用社区其他包,比如上面的bitmap-adoption的包的话,您可以包"bitmap-adoption"打包到module.xml里面。 我对当前发布的200多软件包随便挑了一些,还没有发现有哪个使用了包依赖, 象这样: ```sh zpm:USER>list-dependents yaml-utils zpm:USER>list-dependents terminal-multiline-editor zpm:USER>list-dependents bitmap-adoption zpm:USER>list-dependents global-dump-sql ... ```
文章
Claire Zheng · 八月 17, 2021

【视频】FHIR标准和国际基于FHIR的互联互通实践

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

有没有办法导出与Production相关的所有内容?

您好,有没有一种简单的方法可以导出与Production相关的所有内容并在另一个实例中导入? 例如导出Production保存的 db、ns、映射、webapp 相关、资源、角色等 您可以使用InterSystems Package Manager(IPM)列出生产的所有成员,并通过IPM注册表或使用zpmhub将其分发到另一台机器(例如您的客户端)。 例如,您可以将多个EnsDemo产品安装为一个包: 用户>zpm“安装irishealth-ensdemo” 或者最近我发布了一个非常简单的CSV数据转换生产示例,您可以将其安装为一行: USER>zpm "install esh-i14y-csv" 下面是如何在module.xml中描述生产的所有模块。
问题
water huang · 四月 24, 2021

RSAEncrypt加密 只能用证书吗

最近尝试使用 Set Ciphertext=##class(%SYSTEM.Encryption).RSAEncrypt(Plaintext,PublicKeyStr)来加密数据,但是加密失败,参考了以下资料https://community.intersystems.com/post/format-public-key-when-using-rsaencrypt-method-systemencryption-or-systemencryptionrsaencrypt https://blog.ndpar.com/2017/04/17/p1-p8/ 生成的公钥为 -----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvl8YRMOJMUOyK5NzWo+8FD8dGR3DuPwn7M13If+rwYp18TEL58NneFdCL+Jjytx4axq+uhPuup5HtmEm22+PQTzFlXuAhXf3oUm4LQl4zgSb14D6gfqac9DqbVhm+aUjDfItFapM35/DH2cvc+rbBhu4Q5Y6kJwcUK0UbRv3swQIDAQAB-----END PUBLIC KEY----- 转换为pkcs1后的内容为 -----BEGIN RSA PUBLIC KEY-----MIGJAoGBANHPwS9+rVB1TJZM1UGLCBan3CY8TIDPkDAftkI504l68vdUWdPlmcN1YZzCGDK4+LvtzdqLXb/XSA3SxsUrA5toWSh45K7/jDzXRcb0AYiUTWGfpeMrHdcGNL07gVT11FM8M+0Jc5Sw6dvMKVXE9wzAxwgaJo0d8zW8Crbx6iI3AgMBAAE=-----END RSA PUBLIC KEY----- 文件保存为utf-8和ansi格式都不行。错误信息为 error:0906D06C:PEM routines:PEM_read_bio:no start line; 2016之后的版本,RSAEncrypt可以接收X.509证书或RSA公钥,而2016中RSAEncrypt接收证书参数。Ensemble2016上使用RSAEncrypt,如果拿不到证书,仅用公钥,请联系InterSystems 销售工程师。 好的,谢谢
文章
Weiwei Gu · 八月 7, 2023

如何自定义 Web 网关错误消息

InterSystems 常见问题解答标题 您可以为以下 Web Gateway 错误消息/系统响应设置单独的错误页面: 服务器错误 服务器繁忙 服务器无法使用 服务器超时 连接关闭 在 Web Gateway 管理界面上进行设置([Management Portal] > [System Administration] > [Configuration] > [Web Gateway Management] > [Configuration] > [Default Parameters])。 在“默认参数”(Default Parameters )菜单的“错误页面”部分中,设置要显示的 html 页面的文件名或发生错误时要重定向到的 URL。 ※Web网关管理界面也可以从以下URL访问。 http://<web server address>:<port>/csp/bin/Systems/Module.cxw 详细信息请参考以下文档自定义错误页面 [IRIS]
公告
Michael Lei · 十月 24, 2023

官宣对 CentOS 的支持终止

终止对 CentOS 的支持 自 InterSystems IRIS 2023.3 发布起,CentOS 将不再是受支持的开发平台。 CentOS 一直是一个受支持的开发平台,为开发人员提供了相当于 Red Hat Enterprise Linux (RHEL) 的免费版本,用于 IRIS 开发。您可能知道,Red Hat 对 CentOS 进行了重大更改,CentOS 已成为 RHEL 的“上游”。这意味着它具有 RHEL 中尚未包含的错误和功能,这可能会给在该平台上构建的开发人员带来问题。 我们鼓励使用 CentOS 的开发人员利用 Red Hat 的免费开发人员计划来获得 RHEL 的免费开发许可证。 CentOS 继续支持 IRIS 2023.2(及更早版本)。
文章
Jingwei Wang · 六月 20, 2022

IRIS/HealthConnect 高可用机制 Mirror 的配置

安装Arbiter 为了将自动故障转移扩展到尽可能广泛的故障情况,InterSystems建议你为每个镜像配置一个仲裁机。 要充当仲裁者,系统必须有一个正在运行的ISCAgent进程。由于ISCAgent是与InterSystems IRIS一起安装的,任何承载一个或多个InterSystems IRIS实例的系统都符合这一要求,可以被配置为仲裁者而无需进一步准备;但是,承载一个或多个故障转移或DR异步镜像成员的系统不应该被配置为该镜像的仲裁者。 没有托管InterSystems IRIS实例的系统可以通过安装Arbiter方式的作为仲裁者。请从InterSystems公司下载适合你的仲裁者系统平台的ISCAgent安装包,然后,安装ISCAgent。 注意:Arbiter的版本要和InterSystems IRIS安装版本保持一致。 在Windows上安装Arbiter 在Windows系统上,只需执行安装文件,例如ISCAgent-2020.1.0.540.0-win_x64.exe。 在Linux上安装Arbiter [root@arbiterhost home]# gunzip ISCAgent-2020.1.0.540.0-lnxrhx64.tar.gz [root@arbiterhost home]# tar -xf ISCAgent-2020.1.0.540.0-lnxrhx64.tar [root@arbiterhost home]# ./ISCAgent/agentinstall 启动、停止、检查ISCAgent状态 systemctl start ISCAgent.service systemctl stop ISCAgent.service systemctl status ISCAgent.service 设置、终止开机自动启动ISCAgent sudo systemctl enable ISCAgent.service sudo systemctl disable ISCAgent.service 启动 ISCAgent 服务 在所有的服务器中(主机,备机,仲裁机),ISCAgent必须被配置为在系统启动时自动启动。 a. 进入管理工具——服务,选择ISCAgent,将启动类型改为自动。点启动ISCAgent。 b. Windows防火墙中允许ISCAgent TCP端口2188,同时新建出站、进站规则。允许web端口 52773,超级端口1972。 入站规则中运行文件和打印机共享(回显请求 - ICMPv4-In) 配置主failover成员(Primary failover成员) a. 进入Management Portal界面,选择菜单 系统管理 – 配置 – 镜像配置 – 创建镜像。如果选项为灰不可选,先点击 启动镜像服务,再选择 '服务已启用'。 b. 创建Mirror,输入相关信息并保存。 镜像信息部分 : 镜像名称(Mirror Name) : 有效的名称必须是1至15个字母数字字符;小写字母会自动替换为大写字母的对应物。 要求SSL/TLS (Use SSL/TLS): 指定是否要为镜像内的所有通信要求SSL/TLS安全(建议)。如果你选择了 "需要SSL/TLS",而实例还没有一个有效的SSL/TLS配置用于镜像,在完成这个程序之前,你可以直接点击设置SSL/TLS链接,在这个成员上创建所需的SSL/TLS配置。你也可以取消创建镜像程序,并浏览到SSL/TLS配置页面(系统>安全管理>SSL/TLS配置)。 使用仲裁器(Use Arbiter): 指定你是否要配置一个仲裁器(建议)。如果你选择使用仲裁器,你必须提供你想配置为仲裁器的系统的主机名或IP地址以及其ISCAgent进程使用的端口(默认为2188)。 使用虚拟IP(User Virtual IP):如果你选择使用虚拟IP,系统会提示你提供一个IP地址、无类别域间路由(CIDR)掩码和网络接口。 故障转移成员的压缩模式,异步成员的压缩模式 : 分别指定在从主站向备份和异步成员传输之前是否压缩日志数据,以及对每个成员使用哪种压缩类型;两者的默认设置都是 "系统选择",它优化了故障转移成员之间的响应时间以及主站和异步站之间的网络利用率。 一般使用默认设置。 Allow Paralle Dejournaling :确定哪种类型的镜像成员可以运行并行的Dejournal。Paralle Dejournaling允许多个作业在单个数据库中处理独立的globals,而不是只限于并行处理独立的数据库。 镜像故障转移成员信息: 镜像成员名:为你在这个系统上配置的故障转移成员指定一个名称(默认为系统主机名称和InterSystems IRIS实例名称的组合)。镜像成员名称不能包含空格、制表符或以这些标点符号 : [ ] # ; / * = ^ ~ ,字母字符在保存前会转换为大写字母。镜像成员名称的最大长度是32个字符。 超级服务器地址: 输入外部系统可用于与该故障转移成员通信的 IP 地址或主机名称。 代理端口: 输入此故障转移成员上 ISCAgent 的端口号,接受提示中提供的已安装代理的端口。 配置备failover成员(backup failover成员) 进入Management Portal界面,选择菜单 系统管理 – 配置 – 镜像配置 – 加入为故障转移。如果选项为灰不可选,先点击 启动镜像服务,再选择 '服务已启用'。 镜像名称:创建的镜像名称 其他系统上的代理地址: 输入您在配置第一个故障转移成员时指定的超级服务器地址。 代理端口 :输入您在配置第一个故障转移成员时指定的 ISCAgent 的端口。 InterSystems IRIS 实例名称 : 输入配置为第一个故障转移成员的InterSystems IRIS实例的名称。 配置异步镜像成员 选择 系统管理 – 配置 – 镜像设置 – 加入为异步。如果选项为灰不可选,先点击 启动镜像服务,再选择 '服务已启用'。 在‘加入为异步’页面填入创建的第一个镜像成员名称、地址、实例名称。 镜像名称:创建的镜像名称 故障转移系统的代理地址 :输入您在配置所选故障转移成员时指定的超级服务器地址。 代理端口 - 输入您为所选故障转移成员指定的 ISCAgent 端口。 InterSystems IRIS 实例名称 - 输入您配置为选定故障转移成员的 InterSystems IRIS 实例的名称。 选择合适的Async镜像成员类型 修改镜像设置 进入菜单 系统管理 – 配置 – 镜像配置 – 编辑镜像 可以修改设置的各个参数: 添加镜像数据库 创建一个镜像数据库 在主failover成员服务器上,选择系统管理– 配置 – 系统配置– 本地数据库 选择 新建数据库,按照提示输入数据库名称、存放数据库文件位置。注意在输入关于数据库的详情页面,镜像数据库? 选择 是。 在每一个failover成员服务器以及异步成员服务器按照上面步骤同样创建本地数据库。注意在输入关于数据库的详情中确保每一个成员的Mirror DB Name相同(本地的数据库名称可以不同)。 将已有数据库配置为镜像数据库 将主机已有数据库加入镜像 在主failover成员management port中,从菜单中选择 配置数据库 选中需要镜像的数据库,点击 添加到镜像 来添加需要mirror 的数据库 选择需要添加进入Mirror 的数据库并点击添加 此时从镜像监视器 中可以看到 镜像数据库 增加了我们刚才添加的数据库 数据库备份 对此主服务器的需要mirror 的数据库进行备份并获取备份文件,并拷贝至备机。执行备份可以通过management portal 运行实现。 management portal -> 系统管理 -> 配置-> 数据库备份 ->备份数据库列表 系统操作-> 备份 -> 完全备份列表 注意:这里需要关注主机本身journal 的保存时间,因为mirror 的同步机制是主机推journal 给备机,所以如果备份的时间为1月1 日零点,主机journal 保存时间为1天,备份需要2天,则中间1天的时间差所产生的数据是没有办法恢复的。 数据库备份恢复 在备Failover成员的%SYS 命名空间下使用^BACKUP routine, 将备份文件恢复至备机,则可在备机中看到恢复的数据库已只读方式被挂载 caught up 数据库 在备机上进入 系统操作 - 镜像监视器 ,可见备机的镜像有need activation 状态,点击Activate,结束后,下一步点击 catchup。 最终可见备机为 active,caught up 状态。 删除镜像配置 删除镜像配置必须按照下面顺序执行:删除异步成员,然后删除备份failover成员,最后删除主failover成员。 删除异步成员 进入菜单 系统管理 – 配置 – 镜像设置 – 编辑异步: 如果想要移除报表服务的异步成员,使用Leave mirror链接。 如果想要移除所有的链接异步成员以及相关配置,使用Remove Mirror Configuration按钮: 移除备failover成员 想要移除failover成员必须在%SYS命名空间下 执行^MIRROR routine。 a. 在 Terminal中切换到%SYS命名空间,执行d ^MIRROR b. 选择Mirror Configuration c. 选择Remove This Failover Member(如果在主failover服务器上操作则选择Remove Other Mirror Member) d. 按照提示操作,最后重启实例. 移除主failover成员 想要移除failover主成员必须在%SYS命名空间下 执行^MIRROR routine。 a. 在 Terminal中切换到%SYS命名空间,执行d ^MIRROR b. 选择Mirror Configuration c. 选择Remove This Failover Member d. 按照提示操作,最后重启实例. e. 选择Remove This Failover Member f. 按照提示操作,最后重启实例. 移除镜像数据库 从Async成员中移除数据库不会对failover成员的数据库有任何影响,但是如果从failover成员中移除数据库,也必须从其他failover成员以及Async成员中移除相应的数据库。想要从镜像配置中整体移除数据库需要遵循下面的顺序:主Primary failover成员 -> 备份Backup failover成员 -> Async成员。 a. 进入菜单 系统操作 – 镜像监视器 b. 在镜像数据库中点击 移除 断开连接/开始连接镜像成员 可以临时断开备failover镜像成员或者Async镜像成员。 进入菜单 系统操作 – 镜像监视器 选择 在这个成员上终止镜像 在虚拟环境下配置镜像操作 在虚拟环境下进行镜像配置,同时建议进行下面配置以提高可靠性: · 应该为每一个failover成员进行虚拟主机(virtual host)的配置,保证每一个failover成员不会指向同一个物理上的host。 · 为了避免单一指向存储的损坏,每一个failover成员上Caché实例使用的存储应该固定分配到相互隔离的磁盘阵列或者磁盘组中。 · 有些虚拟架构下自动执行的操作,比如虚拟主机迁移到备用存储,可能造成failover成员间的短暂连接中断。如果在记录中竟让发现类似这样的中断警告,可以进入修改镜像配置的页面,在Advanced Mirror Settings下适当提高QoS Timeout设置的时间。 · 当进行计划维护操作(比如快照snapshot管理)时,会引起镜像成员中的连接中断,可以在备机的Mirror Monitor页面选择Stop Mirror on this server,临时断开备份backup成员,以避免相应的mirror警告信息。 · 在配置Mirror主备服务器中,不建议使用systemctl 设置开机自动启动IRIS。因为在主备切换过程中,如果使用systemd启动关闭IRIS不是成对出现,或者使用iris start/stop instance 不是成对出现,则有可能出现不可预知错误。 配置成功状态 主机状态: 备机状态:
文章
姚 鑫 · 五月 19, 2021

IRIS 单元测试

# IRIS 单元测试 # [第一章 单元测试概述☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/116884316) # [第二章 使用%UnitTest进行单元测试☆☆☆☆](https://yaoxin.blog.csdn.net/article/details/116906659) # [第三章 执行测试☆☆☆](https://yaoxin.blog.csdn.net/article/details/116974672) # [第四章 使用Setup和tear Down方法执行测试☆☆☆](https://yaoxin.blog.csdn.net/article/details/117014533) # 前言 IRIS提供了用于对应用程序进行单元测试的类的%UnitTest包。该包为快速开发单元测试类、执行测试和创建报告提供了便利。可以直接使用该包,也可以扩展其类来自定义单元测试工具。%UnitTest在结构上与用于单元测试的xUnit框架非常相似。熟悉这些框架的开发人员使用%UnitTest会特别容易。 本教程提供对%UnitTest包的快速实践介绍。本教程的第一部分和第二部分是相互独立的,可以按任何顺序完成。 - 完成本教程的第一部分,了解单元测试和集成测试之间的区别、xUnit框架和%UnitTest之间的结构相似性,以及单元测试在敏捷应用程序开发方法中的作用。 - 完成本教程的第二部分,学习如何使用%UnitTest中的类为InterSystems IRIS应用程序创建和执行单元测试。 注意:本教程假定基本熟悉ObjectScript和InterSystems IRIS的面向对象开发。 # 预告 下一期系列将用一个月的时间连载,**《Caché 网络实用工具》**,敬请期待。 # 交流群 - QQ群号:410039091 - 笔者QQ:454115408 - 公众号:技术理科直男 - [intersys版主:姚鑫](https://cn.community.intersystems.com/user/236891/posts) ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9VqwzNP-1608850948003)(3E1D939266954ED48BDAEA9B8086B11E)\]](https://img-blog.csdnimg.cn/20201225070433434.png)
文章
Shanshan Yu · 七月 5, 2023

基于IntegratedML及Dashboard的数据分析应用

基于InterSystems的集成ML技术和Dashboard,根据上传的CSV文件自动生成相关预测和BI页面。前端和后端在Vue和Iris中完成,使用户可以通过简单的操作生成所需的数据预测和分析页面,并根据这些页面做出决策。 # ZPM 安装 zpm:USER>install IntegratedMLandDashboardSample # 部署流程 使用或创建新的命名空间 将代码导入相应的命名空间 在终端中执行: Do # # class (customizemashinelerningandaanalysis. Util. Tool) Deployment() 前端是Vue文件夹下的dist文件夹。在使用它之前,请打开dist-static config.js并修改后端服务器要使用的IP和端口。然后您需要将iframeUrl的测试修改为“Analysis”+后端使用的命名空间,例如“AnalysisUSER” 然后启动前端文件(可以将dist文件夹放在tomcat中开始使用) 访问地址为: Ip: port/dist # 如何使用 以women.csv为例 1.选择要上传的CSV文件,CSV文件名和数据列名不得包含空格等其他符号 2.填写需要预测的列名,如“高度” 3.单击“确定”按钮,等待界面返回 成功返回后,刷新当前页面,然后单击“模型列表”下的辅助选项。新生成的项目将出现 ① 填写完其他值后,点击②确定,在③处生成预测值 ④ 嵌入式虹膜仪表板显示以前导入CSV的一些数据 # 其他 CSV 展示 # 单元测试 Set ^UnitTestRoot=your modules dir +"\src"+namespace+"\integratedmlanddashboardsample\src" (such C:\InterSystems\HealthConnect\mgr\.modules\USER\integratedmlanddashboardsample\src) do ##class(%UnitTest.Manager).RunTest("UnitTests") #注意 由于页面上嵌入了iris的仪表板,如果您遇到无法正确显示的跨域问题,可以访问iris查看图表 非常棒的应用!那csv中的数据能不能是非数字呢?
文章
Louis Lu · 九月 2, 2024

如何定位临时global在IRISTEMP数据库中占用的空间

当进程中的数据不需要持久化保存,但又需要用到global的高性能特性时,我们常常将数据保存在临时global中,也就是保存在IRISTEMP/CACHETEMP数据库中。 系统使用 IRISTEMP/CACHETEMP 数据库保存临时的数据,用户也可以进行同样的操作。 关于临时global以及IRISTEMP数据库的更多内容,可以参见文档 Temporary Globals and the IRISTEMP Database 以下情况global作为临时使用: 系统临时global (^IRIS.Temp*, ^%cspSession, ^CacheTemp*, ^Mtemp*, 等) 用户定义的 globals 映射至 IRISTEMP/CACHETEMP 处理私有globals (^||name, ^|"^"|name, ^["^"]name,^["^",""]name,等) GLOBAL TEMPORARY 表 1和2的大小可以通过使用 ^%GSIZE 获取 USER>do ^%GSIZE Directory name: c:\intersystems\iris\mgr\user\ => c:\intersystems\iris\mgr\iristemp\ // 指明iristemp 数据库的位置 All Globals? No => yes // Yes 为显示所有globals: 34 项被选中 34 available globals Show details?? No => No // No 为不显示更多信息 Device: Right margin: 80 => : 3和4 进程私有global 可以通过使用 ^GETPPGINFO 查看。 更多关于 ^GETPPGINFO 的信息请查阅文档 这里 下面的例子列出了当前进程下所有的私有globals: set ^||flintstones(1)="Fred" set ^||flintstones(2)="Wilma" znspace "%SYS" do ^GETPPGINFO("*") 另一个方法用于输出单个进程使用较大数量的私有global: set ns=$namespace znspace "%SYS" // Only processes with more PPG blocks than the total number of processes are included set st=##class(%SQL.Statement).%New() set status=st.%PrepareClassQuery("%SYS.ProcessQuery","AllFields") set rs=st.%Execute() while rs.%Next() { set pid=rs.%Get("Pid") // Process ID set cnt=rs.%Get("PrivateGlobalBlockCount") // Number of PPG blocks // When the number of PPG blocks per process is 0 or more, the contents are output (the following example shows 20 or more blocks). if cnt > 20 { set rs2=##class(%ResultSet).%New("%SYS.ProcessQuery:PPG") // "N" Do not return subscripts of a PPG, just return the root name // "B" Return the number of blocks used by the PPG (needs the "N" option) do rs2.Execute("*",pid,"NB") for { quit:'rs2.Next() write cnt_" PID:"_pid_", PPG name "_rs2.GetData(1)_" is using "_rs2.GetData(3)_" disc blocks",! } } } znspace ns
文章
Hao Ma · 十月 28, 2024

配置IRIS Container - CPF merge

## CPF merge(合并) [Automating Configuration of InterSystems IRIS with Configuration Merge](https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ACMF) CPF merge通过合并一个人工编辑的merge file, 自动的配置新创建的iris instance, 或者修改已有的iris instance。适用于: - 修改iris的系统配置(cpf文件中的内容),比如系统参数,创建或者配置用户,角色,权限, 创建或者配置命名空间,数据库; 配置mirror, ECP连接等等。 - 操作不在cpf文件中的内容,比如 [CreateApplication](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RACS_createapplication), [CreateSSLConfig](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RACS_createsslconfig) 等等, 一般是在 [Action]部分实现 > Caché 和早期的IRIS版本提供了manifest功能,用来做IRIS实例的配置。 Manifest很繁琐,而且各个版本的配置中有细微的区别,非常难以管理。 如今有了CPF merge, maifest的所有功能都可以在CPF merge实现, 因此manifest在新版IRIS中也就完全被替代了。 ![figure](https://docs.intersystems.com/iris20231/csp/docbook/images/adock_merge_example.png) ### 执行merge 执行merge可以在操作系统命令行下执行, 如下面的例子 ```bash # 第2个参数可选,如果为空,自动使用系统当前的iris.cpf $ iris merge iris /external/irismerge.conf /usr/irissys/iris.cpf ``` 然而, 在执行`docker run`命令或者`docker-compose`里不用这么麻烦。 IRIS镜像提供了一个功能, 通过加入ISC_CPF_MERGE_FILE环境变量,IRIS会自动实现CPF合并。 比如下面的compose配置: ```bash iris2024: image: containers.intersystems.com/intersystems/irishealth-arm64:2024.1 container_name: iris-a volumes: - ./iris2024:/external environment: - TZ=CST-8 - ISC_CPF_MERGE_FILE=/external/merge.cpf ``` > **IMPORTANT:** > > 当使用配置合并部署容器时(如 [使用合并文件部署 InterSystems IRIS 容器](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ACMF#ACMF_deploy_container) 中所述),只要容器在运行,**ISC_CPF_MERGE_FILE**(它在容器中是持久的)指定的合并文件就会持续受到更新监控,更新发生时,iris 合并命令会立即对其进行合并。这意味着您可以随时通过更新合并文件来更新容器化实例的配置,从而更容易自动重新配置容器化实例和群集。 ### merge文件的Example #### 配置IRIS参数 ```zsh [config] bbsiz=-1 globals=0,0,1024,0,0,0 routines=512 gmheap=256000 [SQL] DefaultSchema=user TimePrecision=6 [SqlSysDatatypes] TIMESTAMP=%Library.PosixTime ``` #### 创建用户和权限 ```zsh CreateUser:Name=SQLAdmin,PasswordHash=fce110ae1f79b9d7e20367a3352efeb48ef22cc8810c4598791f3fb752eabcfe7b2d9ce75099e626b03a62fc6a146f1ca772789ebbcea276674c558c63af4f7b,9ffbbc8ef25086e4d4da87e20c6ea43e8ebb6d1ab64815aef3b1f7e8964dbd87efe68c8464a6b40865efc7d0d568c601e2a49917326dfd78197b68f1bde59db2,10000,SHA512 GrantAdminPrivilege:Grantee=SQLAdmin,Namespace=USER,AdminPriv="%DB_OBJECT_DEFINITION,%BUILD_INDEX" CreateUser:Name=CCHUser,Password=Demo1234 GrantAdminPrivilege:Grantee=SQLAdmin,Namespace=HCC,AdminPriv="%DB_HCC,%BUILD_INDEX" ``` #### 创建命名空间 ```zsh # part of merge.cpf [Actions] CreateResource:Name=%DB_DEMO,Description="The DEMO database" CreateDatabase:Name=DEMO,Directory=/usr/irissys/mgr/demo,Resource=%DB_DEMO, CreateNamespace:Name=DEMO,Globals=DEMO,Interop=1 ``` #### 创建Web Application ```zsh [Actions] CreateApplication:Name=/csp/demo, InboundWebServicesEnabled=1, AutheEnabled=1, DispatchClass=HCC.Interface.RestHandler, NameSpace=DEMO CreateApplication:Name=/csp/demo,NameSpace=HCC,AutheEnabled=36,DispatchClass=HCC.Interface.RestHandler, CreateApplication:Name=/test2,NameSpace=HCC,AutheEnabled=$$$AuthePassword+$$$AutheUnauthenticated,Enabled=1,Description="test2" ModifyApplication:Name=/test2,MatchRoles=":%DB_HSCUSTOM:%DB_HSLIB:%DB_IRISSYS:%HS_DB_HCC:%HS_DB_HSSYS",ErrorPage=%CSP.Error ``` #### System Security Setting System > Security Management > Authentication/Web Session Options - (security settings) - Allow Unauthentication access - Allow O/S authentication ```zsh # example ModifyService:Name=%Service_Monitor,Enabled=1,ClientSystems=192.168.1.1 ModifyService:Name=%Service_DocDB,Enabled=1,AutheEnabled=$$$AuthePassword ModifyService:Name=%Service_Terminal,AutheEnabled=$$$AuthePassword+$$$AutheUnauthenticated+$$$AutheOS ModifyService:Name=%Service_Mirror,Enabled=1 ``` 其他还有更多的用法,请参见在线文档。
文章
Claire Zheng · 三月 1, 2021

欢迎为中文社区参赛者投票!

本周进入 InterSystems 编程大奖赛 的投票时间! 此次中国有多位参赛者,我们将其项目罗列在此,欢迎投票! 项目一: Dictionary comparison scheme of cache database Author: Weiwei Yang 概述:现场需要将各个科室部门内的数据统一汇总到医院总部,但是汇总后发现各个科室使用的字典并不统一,需要将表中的现存的字典统一更换为医院制定字典。例如:A科室中人员的性别字典使用0/1/2表示各种性别,B科室中性别字典使用F/M/O表示各种性别,但是现在医院要求所有性别字典保存Female/Male/Other性别信息,此时就需要替换原有的性别字典为新用字典。当初,此处只是列举了一个使用场景,未来有多个需要对照字典的工作都可以考虑此项目的设计和实现思想。 点击投票 项目二: HealthInfoQueryLayer Author: Botai Zhang 基于Intersystems IRIS平台整合医院信息查询业务解决方案 概述:随着医院信息化建设的逐步完善,医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们基于Intersystems IRIS数据平台整合医院信息查询业务解决方案。该应用程序可通过配置完成查询业务接口实现,大大缩小开发、维护、实施等项目关键运转周期。 点击投票 项目三: Integration scheme for heterogeneous messages in heterogeneous systems Author: Deming Xu 异构系统和异构消息的集成方案 概述:随着现代医院建设的信息化程度越来越高,对接的子系统数量也越来越多,系统的架构、接口类型、消息结构越来越复杂,对医院系统之间的信息传递造成很大不便。为了解决该问题,我们采用HL7、XML等标准,使用Ensemble内置的数据转换工具(DT),将异构系统的接口进行标准化(通常引用Soap、REST、TCP/IP等标准协议),使得不同架构的系统,即时接口类型不同、消息模型不同,也能进行数据的传输。 关键词:HL7、XML、Settings、DataTransform、JDBC、SQL 点击投票 项目四: Create a unified hospital data extraction scheme based on IRIS for Health Author: Deming Xu 基于 IRIS for Health 创建医院数据统一提取方案 概述:随着医院信息化建设内容不断丰富,业务面覆盖越来越广,相关科研项目的数据需求也越来越多,医院对各个业务系统的数据管理提出了新的要求。由于科研项目背景多样,需求中的数据模型也不尽相同,各个系统的接口开发、接口管理、代码维护工作也变得越来越繁杂。针对这一困境,我们采用IRIS创建医院数据统一提取方案 。该应用程序提供一个公共的数据提取服务(BS),可通过配置完成获取多个不同数据源的接口开发(多个BO),大大缩小开发、维护、实施等成本。 点击投票 项目五: RESTFUL_API_For_Hotel_OverBooking_System Author: jingqi LIu Develop RESTFUL Data API in InterSystems IRIS Data Platform Development for Hotel Overbooking Management System. PS:The overbooking management system combines the unique conditions of the hotel, such as room prices, order channels, customer needs (etc...). System uses machine learning algorithms (such as: KNN/ES-RNN...) to accurately predict the daily no-show and occupancy rate of the hotel, and further combines with the revenue equation to find the best largest room sales volume, which can significantly increase the hotel marginal revenue. 这是一个在InterSystems IRIS中用ObjectScript构建的REST API应用的演示。它也有OPEN API规范,可以用Docker和VSCode开发,可以作为ZPM模块部署,可以作为Overbooking系统数据的REST api使用。 点击投票 Useful! 新用户投票前必读哦:如何成为社区活跃用户(Active user) 这几个医疗行业应用都非常不错,学习到很多! 欢迎为您喜欢的选手投票! 欢迎新加入的朋友们发言、评论、回复成为活跃用户后为中国参赛选手投票,每人可以投3票! @Hao.Wang @z.c @Zhaoying.Li @Neal.Wu @liu.yaquan @qu.qu @wang.wei @guo.meiya @yajing.xu @yue.li @权权.苏 @xiaohu.xiong @yadong.zhao @Yi.Han @Wen.Zhou @jie.zhang @张.恒 @guo.wenheng @Jing.Li3826 @迪.文 这个贴子很棒!完美的解决了我的问题! 欢迎新朋友,请大家发表内容时尽量在中文社区发表,多发表高质量内容,为中文社区多做贡献, 包括但不限于回答问题,撰写文章,贡献软件库、代码、工具等等,多谢支持! @young.zheng @an.xingqi2532 @jinhui.hu @wenyang.zhang @guoguo.wang @shikai.ren @chaolong.huang @yabin.duan @鹏飞.楚 @智辉.李 @shan.hu @Wendy.Wu 好的,谢谢 马上投票 发布完还要等24小时 你好,第一次发帖24小时后就可以投票吗 准备投票 是的 原来是这样,明白了 期望多一些应用,多多学习! 能够学习到具体的应用,很棒!👍 学习IRIS在国内多行业应用,棒👍 好的,谢谢! 感谢提醒,👍
文章
Veerarajan Karunanithi · 二月 28, 2024

使用 SQL 文本搜索从非结构化数据中获取见解

什么是非结构化数据?非结构化数据是指缺乏预定义数据模型或组织的信息。与数据库中具有清晰结构(例如表和字段)的结构化数据相比,非结构化数据缺乏固定的模式。此类数据包括文本、图像、视频、音频文件、社交媒体帖子、电子邮件等。 为什么来自非结构化数据的见解很重要?根据 IDC(国际数据公司)的报告,预计到 2025 年,全球 80% 的数据将是非结构化的,这将成为 95% 企业的重大担忧。 福布斯文章 人工智能世界如何解决这个问题?在人工智能领域,生成式人工智能在为非结构化数据提供解决方案方面发挥着至关重要的作用。它擅长从文本/图像/视频中提取有价值的信息、文本摘要和处理文档等任务。 Intersystems 非结构化数据解决方案Intersystems IRIS 提供了一种称为“SQL 文本搜索”的特殊解决方案,用于搜索非结构化数据。此功能有助于对多种语言的非结构化文本数据进行语义上下文搜索。 使用 SQL 文本搜索有什么优点? 快速搜索: InterSystems IRIS SQL 搜索利用优化的索引生成快速导航大量数据,避免对数据本身进行顺序搜索。 单词感知搜索:与基本字符串搜索不同,SQL 搜索依赖于文本中的语义结构,以单词为基本单位。这种方法最大限度地减少了嵌入字符串或跨越两个单词的字符串引起的误报。 实体感知搜索: SQL 搜索考虑语义关系以将多个单词分组为实体。它可以搜索指定的单词序列、邻近的单词(无论顺序如何)以及实体开头或结尾的单词,从而实现精确的上下文搜索。 语言感知搜索:识别语义关系是特定于语言的,SQL 搜索合并了十种自然语言的语言模型。它还支持其他语言,无需创建词典或本体。 模式匹配: SQL 搜索为字符模式提供通配符和正则表达式 (RegEx) 匹配。 模糊匹配: SQL 搜索包括近似匹配的模糊搜索功能,考虑到搜索字符串的计算变异程度。即使出现拼写错误,这也有助于匹配。 派生匹配: SQL 搜索采用分解来匹配根词和组成词,并利用同义词表来匹配同义词和短语。 如何使用非结构化数据实现 SQL 文本搜索:MIND 的实际示例 为了演示 SQL 文本搜索对非结构化数据的实现,我们将使用 Microsoft 新闻数据集 (MIND) 作为示例,重点关注小型训练集。 注意:提供的示例使用 User 命名空间,但您可以将其替换为您选择的任何合适的命名空间,确保所有操作都发生在同一命名空间内。 第 1 步:下载并提取训练数据从 MIND 下载 MIND 训练数据集MIND (msnews.github.io)并从存档中提取 news.tsv 文件。该文件以制表符分隔,我们将主要关注“类别”、“标题”和“描述”字段。 第 2 步:创建持久类创建一个名为“Test.JSON”的持久类,其属性为“Title”(字符串)、“Category”(字符串)和“Description”(字符串)。专门为“Description”属性创建 %IFind.Basic 索引,以增强文本搜索性能。创建索引后,编译该类。 第 3 步:加载 MIND 数据集将 MIND 数据集加载到新创建的类中。您可以使用类和对象方法或 SQL 来填充该表。以下代码演示了使用类和对象方法加载数据集。 第 4 步:验证数据集加载加载数据集后,查询表以确保它准确包含预期的行。您可以使用终端中的 SQL 管理门户或 SQL Shell 进行此验证。 第 5 步:利用索引进行查询现在,利用特定索引来设计查询并提取见解。例如,您可以使用以下查询: 检索微软公司新闻: SELECT %iFind.Highlight(Description, '"microsoft*"' ) FROM Test.JSON WHERE % ID %FIND search_index(DescriptionIdx, '"microsoft*"' , 0 , 'en' ) 检索Google公司新闻: SELECT %iFind.Highlight(Description, '"google*"' ) FROM Test.JSON WHERE % ID %FIND search_index(DescriptionIdx, '"google*"' , 0 , 'en' ) 检索 Google 和 Microsoft 的合并新闻: SELECT %iFind.Highlight(Description, '"microsoft*" "google*"' ) FROM Test.JSON WHERE % ID %FIND search_index(DescriptionIdx, '"microsoft*" "google*"' , 0 , 'en' ) 免责声明:请务必注意,语义和分析 SQL 搜索索引使用 InterSystems IRIS 自然语言处理 (NLP),而 InterSystems 已弃用该技术。截至最新社区版版本(2023.3.0),该功能仍然有效,但在未来版本中可能会被删除。使用 SQL 文本搜索的风险由您自行承担。 我将使用已弃用的 SQL 文本搜索的替代选项来撰写本文的续篇。如果您喜欢我的文章,请在下面投票并提出您的宝贵建议。谢谢你! 解说视频 Thank you and looking fwd to more posting in CN !
文章
姚 鑫 · 四月 7, 2021

第十九章 存储和使用流数据(BLOBs和CLOBs)

# 第十九章 存储和使用流数据(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。 ## 定义流数据字段 Intersystems SQL支持流字段的各种数据类型名称。这些Intersystems数据类型名称是与以下内容对应的同义词: - 字符流:数据类型`LONGVARCHAR`,映射到`%stream.globalcharacter`类和ODBC / JDBC数据类型`-1`。 - 字符流:数据类型`LONGVARBINARY`,映射到`%Stream.GlobalBinary`类和ODBC / JDBC数据类型`-4`。 某些Intersystems流数据类型允许指定数据精度值。此值是no-op,对流数据的允许大小没有影响。提供它以允许用户记录预期的未来数据大小。 以下示例定义包含两个流字段的表: ```sql CREATE TABLE Sample.MyTable ( Name VARCHAR(50) NOT NULL, Notes LONGVARCHAR, Photo LONGVARBINARY) ``` 分片表不能包含流数据类型字段。 ### 流字段约束 Stream字段的定义符合以下字段数据约束: 流字段可以定义为 `NOT NULL`。 流字段可以占用默认值,更新值或计算码值。 流字段不能定义为唯一,主键字段或`idkey`。试图这样做导致`SQLCode -400`致命错误,其中%MSG如下:` ERROR #5414: Invalid index attribute: Sample.MyTable::MYTABLEUNIQUE2::Notes, Stream property is not allowed in a unique/primary key/idkey index > ERROR #5030: An error occurred while compiling class 'Sample.MyTable'.` 无法使用指定的`COLLATE` 值定义流字段。试图这样做导致`SQLCode -400`致命错误,其中`%MSG`如下:` ERROR #5480: Property parameter not declared: Sample.MyTable:Photo:COLLATION > ERROR #5030: An error occurred while compiling class 'Sample.MyTable'.` ## 将数据插入流数据字段 将数据插入流字段有三种方法: - `%Stream.Globalcharacter`字段:可以直接插入字符流数据。例如, ```sql INSERT INTO Sample.MyTable (Name,Notes) VALUES ('Fred','These are extensive notes about Fred') ``` ![image](/sites/default/files/inline/images/1_31.png) ```java Class Sample.MyTable Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {yx}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = MyTable ] { Property Name As %Library.String(MAXLEN = 50) [ Required, SqlColumnNumber = 2 ]; Property Notes As %Stream.GlobalCharacter [ SqlColumnNumber = 3 ]; Property Photo As %Stream.GlobalBinary [ SqlColumnNumber = 4 ]; /// Bitmap Extent Index auto-generated by DDL CREATE TABLE statement. Do not edit the SqlName of this index. Index DDLBEIndex [ Extent, SqlName = "%%DDLBEIndex", Type = bitmap ]; Storage Default { Name Notes Photo ^Sample.MyTableD MyTableDefaultData sequence ^Sample.MyTableD ^Sample.MyTableI ^Sample.MyTableS %Library.CacheStorage } } ``` - `%stream.globalcharacter`和`%stream.globalbinary`字段:可以使用oref插入流数据。可以使用`Write()`方法将字符串附加到字符流,或者写入的方法,以将具有行终结器的字符串附加到字符流。默认情况下,行终结器是`$CHAR(13,10)`(回车返回/线路);可以通过设置`LineTerminator` 属性来更改行终结器。在以下示例中,示例的第一部分创建由两个字符串和其终端组组成的字符流,然后使用嵌入的SQL将其插入流字段。示例的第二部分返回字符流长度,并显示显示终结器的字符流数据: ```java /// d ##class(PHA.TEST.SQL).StreamField() ClassMethod StreamField() { CreateAndInsertCharacterStream SET gcoref=##class(%Stream.GlobalCharacter).%New() DO gcoref.WriteLine("First Line") DO gcoref.WriteLine("Second Line") &sql(INSERT INTO Sample.MyTable (Name,Notes) VALUES ('Fred',:gcoref)) IF SQLCODEd ##class(PHA.TEST.SQL).StreamField() 插入成功 1 ^CacheStream=1 ^CacheStream(1)=1 ^CacheStream(1,0)=25 ^CacheStream(1,1)="First Line"_$c(13,10)_"Second Line"_$c(13,10) ``` ![image](/sites/default/files/inline/images/2_19.png) - `%stream.globalcharacter`和`%stream.globalbinary`字段:可以通过从文件读取它来插入流数据。例如, ```java /// d ##class(PHA.TEST.SQL).StreamField1() ClassMethod StreamField1() { SET myf="E:\temp\game.jpg" OPEN myf:("RF"):10 USE myf:0 READ x(1):10 &sql(INSERT INTO Sample.MyTable (Name,Photo) VALUES ('George',:x(1))) IF SQLCODEd ##class(PHA.TEST.SQL).StreamField1() WRITE "插入成功",! ^ zStreamField1+11^PHA.TEST.SQL.1 DHC-APP 2d0>g WRITE "插入成功",! ^ zStreamField1+11^PHA.TEST.SQL.1 DHC-APP 2d0>g DHC-APP> ``` ![image](/sites/default/files/inline/images/3_14.png) 作为默认值或计算值插入的字符串数据以适合于流字段的格式存储。 ## 查询流字段数据 选择流字段的查询选择项返回流对象的完全形成的OID(对象ID)值,如下例所示: ```sql SELECT Name,Photo,Notes FROM Sample.MyTable WHERE Photo IS NOT NULL ``` ![image](/sites/default/files/inline/images/4_11.png) OID是一个 `%List` 格式化数据地址,如以下内容:`$lb("1","%Stream.GlobalCharacter","^EW3K.Cn9X.S")`。 - OID的第一个元素是一个连续的正整数(从1开始),它被分配给每个插入到表中的流数据值。 例如,如果第1行插入流字段`Photo`和`Notes`的值,则将它们赋值为1和2。 如果第2行插入了一个`Notes`值,则将该值赋给3。 如果用`Photo`和`Notes`的值插入第3行,则将它们赋值为4和5。 分配顺序是表定义中列出字段的顺序,而不是`INSERT`命令中指定字段的顺序。 默认情况下,使用单个整数序列,它对应于流位置全局计数器。 然而,一个表可能有多个流计数器,如下所述。 - 更新操作不会改变初始整数值。 `DELETE`操作可以在整型序列中创建空白,但不会改变这些整型值。 使用`DELETE`删除所有记录不会重置此整数计数器。 如果所有表流字段都使用默认的`StreamLocation`值,则使用`TRUNCATE TABLE`删除所有记录将重置此整数计数器。 不能使用`TRUNCATE`表为嵌入式对象(`%SerialObject`)类重置流整数计数器。 - OID的第二个元素是流数据类型,可以是`%Stream.GlobalCharacter` 或`%Stream.GlobalBinary`。 - OID的第三个元素是一个全局变量。 默认情况下,它的名称是从与表对应的包名和持久类名生成的。 一个`“S”`(用于流)被追加。 - 如果表是使用SQL `CREATE TABLE`命令创建的,这些包和持久化类名称将被散列为每个4个字符(例如,`^EW3K.Cn9X.S`)。 这个全局变量包含流数据插入计数器最近分配的值。 如果没有插入流字段数据,或者使用`TRUNCATE TABLE`删除所有表数据,那么这个全局变量是未定义的。 - 如果表是作为一个持久化类创建的,那么这些包和持久化类名不会被散列(例如`^Sample.MyTableS`)。 默认情况下,这是`StreamLocation`存储关键字`^Sample.MyTableS` 价值。 默认流位置是全局位置,如`^Sample.MyTableS`。此全局变量用于计算插入到没有自定义位置的所有流属性(字段)的次数。例如,如果`Sample.MyTable`中的所有流属性都使用默认流位置,则在`Sample.MyTable`的流属性中插入了10个流数据值时,`^Sample.MyTableS`全局变量包含值10。此全局变量包含最近分配的流数据插入计数器的值。如果没有插入流字段数据,或者使用截断表删除了所有表数据,则此全局变量未定义。 定义流字段属性时,可以定义自定义位置,如下所示:`Property Note2 As %Stream.GlobalCharacter (LOCATION="^MyCustomGlobalS")`;。在这种情况下,`^MyCustomGlobalS`全局用作指定此位置的流属性(或多个属性)的流数据插入计数器;未指定位置的流属性使用默认流位置全局(`^Sample.MyTableS`)作为流数据插入计数器。每个全局计数与该位置相关联的流属性的插入。如果没有插入流场数据,则位置`GLOBAL`是未定义的。如果一个或多个流属性定义了位置,则截断表不重置流计数器。 这些流位置全局变量的下标包含每个流字段的数据。例如,`^EW3K.Cn9X.S(3)`表示第三个插入的流数据项。`^EW3K.Cn9X.S(3,0)`是数据的长度。`^EW3K.Cn9X.S(3,1)`是实际的流数据值。 注意:流字段的`OID`与`RowID`或`Reference`字段返回的`OID`不同。`%OID`函数返回`RowID`或引用字段的`OID`;`%OID`不能与流字段一起使用。试图将流字段用作`%OID`的参数会导致`SQLCODE-37`错误。 在查询的`WHERE`子句或`HAVING`子句中使用流字段受到严格限制。不能将相等条件或其他关系运算符(`=, !=, `)或包含运算符(`]`)或跟随运算符(`[`)与流字段一起使用。尝试将这些运算符与流字段一起使用会导致`SQLCODE-313`错误。 ### Result Set Display - 从程序执行的动态SQL以`$lb("6","%Stream.GlobalCharacter","^EW3K.Cn9X.S")`.格式返回`OID`。 - SQL Shell作为动态SQL执行,并以`$lb("6","%Stream.GlobalCharacter","^EW3K.Cn9X.S")`格式返回`OID`。 - 嵌入式SQL返回相同的`OID`,但以编码`%LIST`的形式返回。可以使用`$LISTTOSTRING`函数将`OID`显示为元素以逗号分隔的字符串:`6,%Stream.GlobalBinary,^EW3K.Cn9X.S`。 从管理门户SQL执行界面运行查询时,不返回`OID`。取而代之的是: - 字符流字段返回字符流数据的前100个字符。如果字符流数据超过100个字符,则用省略号(`...`)表示。在第100个字符之后。这等效于`SUBSTRING(cstream field,1,100)`。 - 二进制流字段返回字符串``。 在表数据的管理门户SQL界面打开表显示中显示相同的值。 要从管理门户SQL执行界面显示`OID`值,请将空字符串连接到流值,如下所示:`SELECT Name, ''||Photo, ''||Notes FROM Sample.MyTable`。 ![image](/sites/default/files/inline/images/5_5.png) ## `DISTINCT`, `GROUP BY`, and `ORDER BY` 每个流数据字段的`OID`值是唯一的,即使数据本身包含重复。 这些`SELECT`子句操作的是流的`OID`值,而不是数据值。 因此,当应用到查询中的流字段时: - 不同的子句对重复的流数据值没有影响。 `DISTINCT`子句将流字段为`NULL`的记录数减少为一个`NULL`记录。 - `GROUP BY`子句对重复的流数据值没有影响。 `GROUP BY`子句将流字段为空的记录数量减少为一个空记录。 - `ORDER BY`子句根据数据流的`OID`值来排序数据,而不是数据值。 `ORDER BY`子句列出流字段为空的记录,然后列出带有流字段数据值的记录。 ## 谓词条件和流 `IS [NOT] NULL`谓词可以应用于流字段的数据值,示例如下: ```sql SELECT Name,Notes FROM Sample.MyTable WHERE Notes IS NOT NULL ``` `BETWEEN`, `EXISTS`, `IN`, `%INLIST`, `LIKE`, `%MATCHES`, and `%PATTERN` 谓词可以应用于流对象的`OID`值,示例如下: ```sql SELECT Name,Notes FROM Sample.MyTable WHERE Notes %MATCHES '*1[0-9]*GlobalChar*' ``` 尝试在流字段上使用任何其他谓词条件会导致`SQLCODE -313`错误。 ## 聚合函数和流 `COUNT`聚合函数接受一个流字段,并对该字段中包含非空值的行进行计数,示例如下: ```sql SELECT COUNT(Photo) AS PicRows,COUNT(Notes) AS NoteRows FROM Sample.MyTable ``` ![image](/sites/default/files/inline/images/6_4.png) 但是,流字段不支持`COUNT`(`DISTINCT`)。 对于流字段不支持其他聚合函数。 尝试将流字段与任何其他聚合函数一起使用会导致`SQLCODE -37`错误。 ## 标量函数和流 除了`%OBJECT`、`CHARACTER_LENGTH`(或`CHAR_LENGTH或DATALENGTH`)、`SUBSTRING`、`CONVERT`、`XMLCONCAT`、`XMLELEMENT`、`XMLFOREST`和`%INTERNAL`函数外,InterSystems SQL不能对流字段应用任何函数。 尝试使用流字段作为任何其他SQL函数的参数会导致`SQLCODE -37`错误。 尝试使用流字段作为任何其他SQL函数的参数会导致`SQLCODE -37`错误。 - `%OBJECT`函数打开一个流对象(接受一个`OID`)并返回oref(对象引用),示例如下: ```sql SELECT Name,Notes,%OBJECT(Notes) AS NotesOref FROM Sample.MyTable WHERE Notes IS NOT NULL ``` ![image](/sites/default/files/inline/images/7_1.png) - `CHARACTER_LENGTH`、`CHAR_LENGTH`和`DATALENGTH`函数接受流字段并返回实际的数据长度,如下面的示例所示: ```sql SELECT Name,DATALENGTH(Notes) AS NotesNumChars,DATALENGTH(Photo) AS PhotoNumChars FROM Sample.MyTable ``` ![image](/sites/default/files/inline/images/8_2.png) `SUBSTRING`函数接受一个流字段,并返回流字段的实际数据值的指定子字符串,如下面的示例所示: ```sql SELECT Name,SUBSTRING(Notes,1,10) AS Notes1st10Chars FROM Sample.MyTable WHERE Notes IS NOT NULL ``` ![image](/sites/default/files/inline/images/9_1.png) 当从管理门户SQL Execute接口发出时,子字符串函数返回流字段数据最多100个字符的子字符串。 如果流数据的指定子字符串大于100个字符,则在第100个字符后用省略号(`…`)表示。 - `CONVERT`函数可用于将流数据类型转换为`VARCHAR`,示例如下: ```sql SELECT Name,CONVERT(VARCHAR(100),Notes) AS NotesTextAsStr FROM Sample.MyTable WHERE Notes IS NOT NULL ``` ![image](/sites/default/files/inline/images/111.png) `CONVERT(datatype,expression)`语法支持流数据转换。 如果`VARCHAR`精度小于实际流数据的长度,则将返回值截断为`VARCHAR`精度。 如果`VARCHAR`精度大于实际流数据的长度,则返回值为实际流数据的长度。 不执行填充。 `{fn CONVERT(expression,datatype)}`语法不支持流数据转换; 它发出一个`SQLCODE -37`错误。 - `%INTERNAL`函数可以用于流字段,但不执行任何操作。 # 流字段并发锁 InterSystems IRIS通过取出流数据上的锁来保护流数据值不被另一个进程并发操作。 InterSystems IRIS在执行写操作之前取出一个排他锁。 排他锁在写操作完成后立即释放。 当第一个读操作发生时,InterSystems IRIS取出共享锁。 只有当流实际被读取时才会获取共享锁,并且在整个流从磁盘读取到内部临时输入缓冲区后立即释放共享锁。 # 在Intersystems中使用流字段IRIS方法 不能在Intersystems Iris方法中直接使用嵌入式SQL或动态SQL使用`BLOB`或`CLOB`值;相反,使用SQL来查找`Blob`或`Clob`的流标识符,然后创建`%AbstractStream`对象的实例以访问数据。 # 使用来自ODBC的流字段 ODBC规范不提供对`BLOB`和`CLOB`字段的任何识别或特殊处理。 InterSystems SQL将ODBC中的`CLOB`字段表示为具有`LONGVARCHAR(-1)`类型。 BLOB字段表示为类型为`LONGVARBINARY(-4)`。 对于流数据类型的ODBC/JDBC数据类型映射,请参考InterSystems SQL reference中的数据类型引用页中的数据类型整数代码。 ODBC驱动程序/服务器使用一种特殊协议来访问`BLOB`和`CLOB`字段。 通常,必须在ODBC应用程序中编写特殊的代码来使用`CLOB`和`BLOB`字段; 标准的报告工具通常不支持它们。 # 使用来自JDBC的流字段 在Java程序中,可以使用标准的JDBC `BLOB`和`CLOB`接口从`BLOB`或`CLOB`检索或设置数据。 例如: ```java Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("SELECT MyCLOB,MyBLOB FROM MyTable"); rs.next(); // fetch the Blob/Clob java.sql.Clob clob = rs.getClob(1); java.sql.Blob blob = rs.getBlob(2); // Length System.out.println("Clob length = " + clob.length()); System.out.println("Blob length = " + blob.length()); // ... ``` 注意:当使用`BLOB`或`CLOB`结束时,必须显式调用`free()`方法来关闭Java中的对象,并向服务器发送消息以释放流资源(对象和锁)。 仅仅让Java对象超出范围并不会发送清理服务器资源的消息。