搜索​​​​

清除过滤器
问题
Michael Lei · 七月 8, 2022

Intersystems IRIS 上使用JAVA

我现在在使用object script。如果把代码从 objectscript转成 Java 我需要做些什么? 可以参考官方文档:https://gettingstarted.intersystems.com/language-quickstarts/java-quickstart/
公告
Claire Zheng · 三月 14, 2022

InterSystems开发者竞赛:Globals

亲爱的社区开发者们,大家好! 欢迎积极参与新一轮InterSystems开发者竞赛! 🏆 InterSystems开发者竞赛:Globals 🏆 竞赛时间: 2022年3月21日-4月10日 奖金总额: $10,000 主题 Globals或者直接数据访问(direct data access)——这是InterSystems IRIS 持久性引擎的核心。所有可以通过SQL、REST-API、ObjectScript、DocDB或Native API访问的IRIS数据都存储在globals中。 Globals引擎 负责InterSystems IRIS的性能、可靠性和可扩展性。 在这次竞赛中,我们邀请每个人贡献开源应用程序,该程序可使用InterSystems IRIS Globals来读取、存储和更改数据。我们邀请您使用Globals的强大功能,来实现对数据摄取和读取性能的利用,同时兼备存储模式的灵活性(存储模式允许引入任意数据模型实现)。 一般要求: 有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 该应用可以在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition上运行。 该应用需开源并在GitHub上发布。 该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 奖品: 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $4,000 🥈 第二名 - $2,000 🥉 第三名 - $1,000 🌟 第四名-第十五名 - $100 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $1,000 🥈 第二名 - $750 🥉 第三名 - $500 ✨ 所有获奖者都将获得Global Masters徽章! 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金。 关键参赛节点 🛠 应用开发、提交阶段 3月21日, 2022 (00:00 EDT): 竞赛启动 4月3日, 2022 (23:59 EDT): 提交截止 ✅ 投票阶段: 4月4日, 2022 (00:00 EDT): 投票启动 4月10日, 2022 (23:59 EDT): 投票截止 注意:在整个参赛期间(开发与投票期间),开发者可持续编辑、提升其应用 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile 资源助力 1. 文档 Globals 2. IRIS初学者 Build a Server-Side Application with InterSystems IRIS Learning Path for beginners 3. ObjectScript Package Manager (ZPM) 初学者: How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS Package First Development Approach with InterSystems IRIS and ZPM 4. 如何将您的APP提交给大赛: 如何在InterSystems Open Exchange上发布应用程序 如何把参赛APP提交给大赛 需要帮助? 加入InterSystems' Discord server频道,或跟帖评论提出您的问题! 期待您的精彩提交!祝好运 👍 参与此次竞赛,您同意 遵守相关条款,请认真阅读。 参赛三部曲: 1. 注册社区用户; 2. 在InterSystems Open Exchange上发布应用程序; 3. 把参赛APP提交给大赛;
公告
Michael Lei · 五月 11, 2022

InterSystems Kubernetes Operator 3.3 发布!

InterSystems Kubernetes Operation(IKO)3.3版现已通过WRC下载页面和InterSystems容器注册中心提供。IKO通过提供一个易于使用的irisCluster资源定义,简化了在Kubernetes中使用InterSystems IRIS或InterSystems IRIS for Health的工作。完整的功能清单见IKO文档,包括轻松的分片、镜像和ECP的配置。 IKO 3.3 亮点: 支持InterSystems IRIS和InterSystems IRIS for Health 2021.2 以及 2022.1版本 支持 Kuberentes 1.21 将常见的系统警报和监控(SAM)配置作为irisCluster的一部分进行部署 InterSystems API Manager(IAM)现在也可以作为 irisCluster的一部分进行部署和管理 自动标记Mirror对的活跃端,因此服务可以始终指向激活的镜像成员
公告
Claire Zheng · 十一月 11, 2021

InterSystems开发者竞赛:安全

亲爱的社区开发者们,大家好! 欢迎积极参与新一轮InterSystems开发者竞赛! 🏆 InterSystems开发者竞赛:安全 🏆 竞赛时间: 2021年11月15日-12月5日 奖金总额: $9,450! 奖项设置 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $4,000 🥈 第二名 - $2,000 🥉 第三名 - $1,000 🌟 第四名-第十名 - $100 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $1,000 🥈 第二名 - $500 🥉 第三名 - $250 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile 参赛时间安排 🛠 11月15日 - 28日: 应用开发、提交阶段 ✅ 11月29日 - 12月05日: 投票阶段 注意:在整个参赛期间(开发与投票期间),开发者可持续编辑、提升其应用 主题 在这次安全竞赛中,我们鼓励开发人员分享展示如何执行与InterSystems IRIS和InterSystems医疗版相关的安全任务的解决方案。我们邀请您贡献一些应用程序,这些应用程序将揭示与InterSystems安全模型(Security Model)的认证和授权部分相关的任务。 这些任务可以是: OAuth与OpenID SAML / LDAP身份验证实现。​ PKI 的实现 REST API某些部分的访问管理:应用程序级安全、角色/用户级安全。 对数据的访问管理:对数据库、表、列或行级别的访问。 对互操作性组件的访问 访问IRIS BI组件:cubes,枢轴,仪表板等。 授权(用户、角色、资源)和认证(OAuth)设置的DevOps问题。 与身份验证和授权相关的开发人员和支持工具。 你的奇思妙想! 要求: 有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 该应用可以在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition 上运行。 该应用需开源并在GitHub上发布。 该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 资源助力 1. InterSystems IRIS初学者: Build a Server-Side Application with InterSystems IRIS Learning Path for beginners 2. ObjectScript Package Manager (ZPM)的初学者: How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS Package First Development Approach with InterSystems IRIS and ZPM 3. 如何将您的APP提交给大赛 如何在InterSystems Open Exchange上发布应用程序 如何把参赛APP提交给大赛 4. 文档、课程和视频: Security Documentation Course: InterSystems Security Basics Video: Active Directory Integration with LDAP Video: Configuring a Web Server for IIS for Better Performance and Security Video: Webinar: Securing the Management Portal Video: Advances in Security Article: Building an FHIR Repository + OAuth2 Authorization Server/Resource Server Configuration on IRIS for Health Part 1 Article: InterSystems IRIS Open Authorization Framework (OAuth 2.0) implementation - part 1 Article: Protect your REST API applying OWASP Top Ten 参赛评比 投票规则即将发布,敬请期待! So! 期待您的精彩提交!加入我们的编程马拉松,赢取大奖。 ❗️ 点击此处,查看 官方竞赛条款解读.❗️
文章
Hao Ma · 一月 10, 2021

InterSystems 最佳实践系列---APM – 监控 SQL 查询性能

自 Caché 2017 以后,SQL 引擎包含了一些新的统计信息。 这些统计信息记录了执行查询的次数以及运行查询所花费的时间。 对于想要对包含许多 SQL 语句的应用程序的性能进行监控和尝试优化的人来说,这是一座宝库,但访问数据并不像一些人希望的那么容易。 本文和相关的示例代码说明了如何使用这些信息,以及如何例行提取每日统计信息的摘要,并保存应用程序的 SQL 性能的历史记录。 记录了什么? 每次执行 SQL 语句时,都记录花费的时间。 这是非常轻量的操作,无法关闭。 为了最大程度地降低开销,统计信息保留在内存中并定期写入磁盘。 数据包括一天中执行查询的次数以及所花费的平均时间和总时间。 数据不会立即写入磁盘,并且在写入之后,统计信息将由“更新 SQL 查询统计信息”任务更新,该任务通常计划为每小时运行一次。 该任务可以手动触发,但是如果你希望在测试查询时实时查看统计信息,则整个过程需要一点耐心。 警告:在 InterSystems IRIS 2019 及更早版本中,不会针对已使用 %Studio.Project:Deploy 机制部署的类或例程中的嵌入式 SQL 收集这些统计信息。 示例代码不会有任何中断,但这可能会使你产生误导(我被误导过),让你以为一切正常,因为没有查询显示为高开销。 如何查看信息? 你可以在管理门户中查看查询列表。 转到 SQL 页面,点击“SQL 语句”选项卡。 对于你正在运行并查看的新查询,这种方式很好;但是如果有数千条查询正在运行,则可能变得难以管理。 另一种方法是使用 SQL 搜索查询。 信息存储在 INFORMATION_SCHEMA 模式的表中。 该模式含有大量表,我在本文的最后附上了一些 SQL 查询示例。 何时删除统计信息? 每次重新编辑查询时会删除其数据。 因此对于动态查询,这可能意味着清除缓存的查询时。 对于嵌入式 SQL,则意味着重新编译在其中嵌入 SQL 的类或例程时。 在活跃的站点上,可以合理预期统计信息将保存超过一天,但是存放统计信息的表不能用作运行报告或长期分析的长期参考源。 如何汇总信息? 我建议每天晚上将数据提取到永久表中,这些表在生成性能报告时更易于使用。 如果在白天编译类,可能会丢失一些信息,但这不太可能对慢速查询的分析产生任何实际影响。 下面的代码示例说明了如何将每个查询的统计信息提取到每日汇总中。 它包括三个简短的类: * 一个应在每晚运行的任务。 * DRL.MonitorSQL 是主类,用于从 INFORMATION_SCHEMA 表提取数据并存储。 第三个类 DRL.MonitorSQLText 是一个优化类,它存储一次(可能很长的)查询文本,并且只将查询的哈希存储在每天的统计信息中。 示例说明 该任务提取前一天的信息,因此应安排在午夜后不久执行。 你可以导出更多历史数据,只要其存在。 要提取过去 120 天的数据 Do ##class(DRL.MonitorSQL).Capture($h-120,$h-1) 该示例代码直接读取全局 ^rIndex,因为最早版本的统计信息未将日期公开给 SQL。 我所包括的变体将循环实例中的所有命名空间,但这并不总是合适的。 如何查询已提取的数据 提取数据后,您可以通过运行以下语句查找最繁重的查询 SELECT top 20 S.RunDate,S.RoutineName,S.TotalHits,S.SumpTIme,S.Hash,t.QueryText from DRL.MonitorSQL S left join DRL.MonitorSQLText T on S.Hash=T.Hash where RunDate='08/25/2019' order by SumpTime desc   此外,如果选择了开销大的查询的哈希,可以通过以下语句查看该查询的历史记录   SELECT S.RunDate,S.RoutineName,S.TotalHits,S.SumpTIme,S.Hash,t.QueryText from DRL.MonitorSQL S left join DRL.MonitorSQLText T on S.Hash=T.Hash where S.Hash='CgOlfRw7pGL4tYbiijYznQ84kmQ=' order by RunDate   今年早些时候,我获取了一个活跃站点的数据,然后查看了开销最大的查询。 有一个查询的平均时间不到 6 秒,但每天被调用 14000 次,加起来每天消耗的时间将近 24 小时。 实际上,一个核心完全被这个查询占用。 更糟糕的是,第二个查询要花一个小时,它是第一个查询的变体。   运行日期 例程名称 总命中次数 总时间 哈希 查询文本(有节略) 03/16/2019   14,576 85,094 5xDSguu4PvK04se2pPiOexeh6aE= DECLARE C CURSOR FOR SELECT * INTO :%col(1) , :%col(2) , :%col(3) , :%col(4)  … 03/16/2019   15,552 3,326 rCQX+CKPwFR9zOplmtMhxVnQxyw= DECLARE C CURSOR FOR SELECT * INTO :%col(1) , :%col(2) , :%col(3) , :%col(4) , … 03/16/2019   16,892 597 yW3catzQzC0KE9euvIJ+o4mDwKc= DECLARE C CURSOR FOR SELECT * INTO :%col(1) , :%col(2) , :%col(3) , :%col(4) , :%col(5) , :%col(6) , :%col(7) , 03/16/2019   16,664 436 giShyiqNR3K6pZEt7RWAcen55rs= DECLARE C CURSOR FOR SELECT * , TKGROUP INTO :%col(1) , :%col(2) , :%col(3) , .. 03/16/2019   74,550 342 4ZClMPqMfyje4m9Wed0NJzxz9qw= DECLARE C CURSOR FOR SELECT … 表 1:客户站点的实际结果   INFORMATION_SCHEMA 模式中的表 除了统计信息外,此模式中的表还会跟踪查询、列、索引等的使用位置。 通常,SQL 语句是起始表,它的连接方式类似于“Statements.Hash=OtherTable.Statement”。 直接访问这些表以查找一天中开销最大的查询,这一操作的等效查询是...   SELECT DS.Day,Loc.Location,DS.StatCount,DS.StatTotal,S.Statement,S.Hash FROM INFORMATION_SCHEMA.STATEMENT_DAILY_STATS DS left join INFORMATION_SCHEMA.STATEMENTS S on S.Hash=DS.Statement left join INFORMATION_SCHEMA.STATEMENT_LOCATIONS Loc on S.Hash=Loc.Statement where Day='08/26/2019' order by DS.stattotal desc   无论你是否考虑建立一个更系统的过程,我都建议每个使用 SQL 处理大型应用程序的人今天都运行这个查询。 如果某个特定查询显示为高开销,则可以通过运行以下语句获取历史记录 SELECT DS.Day,Loc.Location,DS.StatCount,DS.StatTotal,S.Statement,S.Hash FROM INFORMATION_SCHEMA.STATEMENT_DAILY_STATS DS left join INFORMATION_SCHEMA.STATEMENTS S on S.Hash=DS.Statement left join INFORMATION_SCHEMA.STATEMENT_LOCATIONS Loc on S.Hash=Loc.Statement where S.Hash='jDqCKaksff/4up7Ob0UXlkT2xKY=' order by DS.Day     每日提取统计信息的代码示例 标准免责声明 - 此示例仅用于说明。 不对其提供支持,也不保证其有效。 Class DRL.MonitorSQLTask Extends %SYS.Task.Definition{Parameter TaskName = "SQL Statistics Summary";Method OnTask() As %Status{              set tSC=$$$OK              TRY {                             do ##class(DRL.MonitorSQL).Run()              }              CATCH exp {                            set tSC=$SYSTEM.Status.Error("Error in SQL Monitor Summary Task")              }              quit tSC }}   Class DRL.MonitorSQLText Extends %Persistent{/// Hash of query textProperty Hash As %String;  /// query text for hashProperty QueryText As %String(MAXLEN = 9999);Index IndHash On Hash [ IdKey, Unique ];} /// Summary of very low cost SQL query statistics collected in Cache 2017.1 and later. /// Refer to documentation on "SQL Statement Details" for information on the source data. /// Data is stored by date and time to support queries over time. /// Typically run to summarise the SQL query data from the previous day.Class DRL.MonitorSQL Extends %Persistent{/// RunDate and RunTime uniquely identify a runProperty RunDate As %Date;/// Time the capture was started/// RunDate and RunTime uniquely identify a runProperty RunTime As %Time;/// Count of total hits for the time period for Property TotalHits As %Integer;/// Sum of pTimeProperty SumPTime As %Numeric(SCALE = 4);/// Routine where SQL is foundProperty RoutineName As %String(MAXLEN = 1024);/// Hash of query textProperty Hash As %String;Property Variance As %Numeric(SCALE = 4);/// Namespace where queries are runProperty Namespace As %String;/// Default run will process the previous days data for a single day./// Other date range combinations can be achieved using the Capture method.ClassMethod Run(){              //Each run is identified by the start date / time to keep related items together                           set h=$h-1              do ..Capture(+h,+h)}/// Captures historic statistics for a range of datesClassMethod Capture(dfrom, dto){              set oldstatsvalue=$system.SQL.SetSQLStatsJob(-1)                             set currNS=$znspace                set tSC=##class(%SYS.Namespace).ListAll(.nsArray)                set ns=""      set time=$piece($h,",",2)      kill ^||TMP.MonitorSQL                do {                               set ns=$o(nsArray(ns))                               quit:ns=""                               use 0 write !,"processing namespace ",ns                               zn ns                                           for dateh=dfrom:1:dto {                                                          set hash=""                                                          set purgedun=0                                                          do {                                                                        set hash=$order(^rINDEXSQL("sqlidx",1,hash))                                                                        continue:hash=""                                                                        set stats=$get(^rINDEXSQL("sqlidx",1,hash,"stat",dateh))                                                                        continue:stats=""                                                                        set ^||TMP.MonitorSQL(dateh,ns,hash)=stats                                                                                                                                 &SQL(SELECT  Location into :tLocation FROM INFORMATION_SCHEMA.STATEMENT_LOCATIONS WHERE Statement=:hash)                                                                        if SQLCODE'=0 set Location=""                                                                        set ^||TMP.MonitorSQL(dateh,ns,hash,"Location")=tLocation                                                                                                                                 &SQL(SELECT  Statement INTO :Statement FROM INFORMATION_SCHEMA.STATEMENTS WHERE Hash=:hash)                                                                        if SQLCODE'=0 set Statement=""                                                                        set ^||TMP.MonitorSQL(dateh,ns,hash,"QueryText")=Statement                                                          } while hash'=""                                                                                                    }                } while ns'=""                zn currNS                set dateh=""                do {                               set dateh=$o(^||TMP.MonitorSQL(dateh))                               quit:dateh=""                               set ns=""                               do {                                             set ns=$o(^||TMP.MonitorSQL(dateh,ns))                                             quit:ns=""                                             set hash=""                                             do {                                                         set hash=$o(^||TMP.MonitorSQL(dateh,ns,hash))                                                          quit:hash=""                                                         set stats=$g(^||TMP.MonitorSQL(dateh,ns,hash))                                                          continue:stats=""                                                          // The first time through the loop delete all statistics for the day so it is re-runnable                                                          // But if we run for a day after the raw data has been purged, it will wreck eveything                                                          // so do it here, where we already know there are results to insert in their place.                                                          if purgedun=0 {                                                                        &SQL(DELETE FROM websys.MonitorSQL WHERE RunDate=:dateh )                                                                        set purgedun=1                                                          }                                                                                                                   set tObj=##class(DRL.MonitorSQL).%New()                                                          set tObj.Namespace=ns                                                          set tObj.RunDate=dateh                                                          set tObj.RunTime=time                                                          set tObj.Hash=hash                                                          set tObj.TotalHits=$listget(stats,1)                                                          set tObj.SumPTime=$listget(stats,2)                                                          set tObj.Variance=$listget(stats,3)                                                          set tObj.Variance=$listget(stats,3)                                                                                                                  set queryText=^||TMP.MonitorSQL(dateh,ns,hash,"QueryText")                                                         set tObj.RoutineName=^||TMP.MonitorSQL(dateh,ns,hash,"Location")                                                                                                             &SQL(Select ID into :TextID from DRL.MonitorSQLText where Hash=:hash)                                                          if SQLCODE'=0 {                                                                        set textref=##class(DRL.MonitorSQLText).%New()                                                                        set textref.Hash=tObj.Hash                                                                        set textref.QueryText=queryText                                                                        set sc=textref.%Save()                                                          }                                                                                                                  set tSc=tObj.%Save()                                                                                                                   //avoid dupicating the query text in each record because it can be very long. Use a lookup                                                          //table keyed on the hash. If it doesn't exist add it.                                                          if $$$ISERR(tSc) do $system.OBJ.DisplayError(tSc)                                                                                                                   if $$$ISERR(tSc) do $system.OBJ.DisplayError(tSc)                                             } while hash'=""                               } while ns'=""                                                                         } while dateh'=""                                                           do $system.SQL.SetSQLStatsJob(0)}Query Export(RunDateH1 As %Date, RunDateH2 As %Date) As %SQLQuery{SELECT S.Hash,RoutineName,RunDate,RunTime,SumPTime,TotalHits,Variance,RoutineName,T.QueryText              FROM DRL.MonitorSQL S LEFT JOIN DRL.MonitorSQLText T on S.Hash=T.Hash              WHERE RunDate>=:RunDateH1 AND RunDate
文章
jieliang liu · 三月 1, 2021

大数据的 5 个V 与 InterSystems IRIS

大数据的 5 个 V 与 InterSystems IRIS 参见下表: Velocity(速度):水平和垂直节点扩展传递出的弹性速度 实现者:分布式内存缓存、分布式处理、分片和多模型架构 https://www.intersystems.com/isc-resources/wp-content/uploads/sites/24/ESG_Technical_Review-InterSystems-IRIS.pdf 和 https://learning.intersystems.com/course/view.php?id=1254&ssoPass=1 Value(价值):Analytics 和 AI产生的指数数据价值实现:BI、NLP、ML、AutoML 和多模型架构 https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=SETAnalytics 和 https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GIML_AUTOML Veracity(真实性):在公司层面统一的单一真实数据源--实现者:连接器、数据总线、数据集成的 BPL 以及 API 管理 https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=PAGE_interoperability 和 https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_iam Volume(容量):多个性能出色的 TB/PB 级数据存储库 实现者:分布式内存缓存、分布式处理、分片和多模型架构 https://www.intersystems.com/isc-resources/wp-content/uploads/sites/24/ESG_Technical_Review-InterSystems-IRIS.pdf 和 https://learning.intersystems.com/course/view.php?id=1254&ssoPass=1 Variety(多样性):同一位置多种数据格式(XML、JSON、SQL、对象)实现者:Repositório e Arquitetura Multimodelohttps://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=PAGE_multimodel
公告
Claire Zheng · 二月 13, 2023

技术奖励结果公布 | 2023 InterSystems 开发者竞赛:工具(Tool)

Hi,开发者们! 以下是2023 年 InterSystems 开发者竞赛:工具(Tool)参赛者应用的技术奖励分数! Project Idea Implementation Python Docker ZPM Online Demo Code Quality First Article on DC Second Article on DC Video on YouTube First Time Contribution Total Bonus Nominal 3 3 2 2 2 1 2 1 3 3 22 gateway-sql 3 2 2 2 1 10 xml-to-udl 2 1 2 3 3 11 iris-persistent-class-audit 2 2 1 2 3 3 13 GlobalStreams-to-SQL 2 2 2 1 2 1 3 13 DX Jetpack for VS Code 2 2 2 1 3 10 JSONfile-to-Global 2 2 2 1 2 1 3 13 apptools-admin 3 2 5 irissqlcli 3 2 2 7 OpenAPI-Suite 3 2 2 2 1 2 1 13 iris-connections 2 2 1 2 1 3 11 Intersystems IRIS platform queue trend monitoring component 2 2 3 7 message_key_query 2 2 3 7 iris-log-viewer 3 2 2 2 1 2 1 3 16 iris-tripleslash 3 2 2 1 2 1 3 14 iris_log_analytics 3 3 iris-deploy-tools 2 2 2 6 blockchain - [ IRIS python ] 3 3 cos-url-shortener 3 2 2 1 2 3 3 16 iris-geo-map 3 2 2 2 1 2 1 3 16 ISC DEV 0 IRIS Data Migration Manager 3 3 奖金可能会有更新变化。 请在下面的评论或Discord 聊天中跟帖。
文章
Kelly Huang · 二月 27, 2023

物联网 (IOT) 在 InterSystems IRIS 平台上的应用

物联网( IoT ,Internet of things )即“万物相连的互联网”,是互联网基础上的延伸和扩展的网络,将各种信息传感设备与网络结合起来而形成的一个巨大网络,实现任何时间、任何地点,人、机、物的互联互通 物联网是新一代信息技术的重要组成部分,IT行业又叫:泛互联,意指物物相连,万物万联。由此,“物联网就是物物相连的互联网”。这有两层意思:第一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;第二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信。因此,物联网(Internet of Things,简称IoT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。在https://baike.baidu.com/item/物联网/7306589?fromtitle=IoT&fromid=552548&fr=aladdin 查看更多信息 IoT(物联网)作为一个互连事物的网络,包括车辆、机器、建筑物、家用设备或任何其他具有嵌入式 TCP/IP 远程连接可用的事物,允许其接收和发送执行指令和数据。每个事物都为物联网网络提供一项或多项服务。例如,智能灯泡提供关灯和开灯服务;智能空调维持环境温度;智能相机在捕捉运动时发送通知。然而,所有这些设备都可以一起运行以提供建筑物安全性,例如。当摄像头检测到运动时,灯就会亮起。那些可以提供业务和集成服务(例如构建安全性)的流程的编排由服务器软件控制器完成。它可以从十几个智能设备接收数据和指令并将其发送到 TCP/IP 网络(如 Internet),以将这些东西作为主要服务进行操作。 事物和服务器软件使用两种协议来互操作数据和指令:MQTT(消息队列遥测传输)和 REST(表述性状态传输)API。第一个更常见,因为它的结构更简单。某些设备的内存和处理器功能有限,没有足够的资源来使用 REST。因此,本文将详细介绍如何使用 MQTT 实现服务器端软件以与物联网进行互操作。 关于 MQTT MQTT 是一种用于消息队列/消息队列服务的轻量级、发布-订阅、机器对机器网络协议。它专为连接具有资源限制或网络带宽有限的设备的远程位置而设计。它必须在提供有序、无损、双向连接的传输协议上运行——通常是 TCP/IP。它是一个开放的 OASIS 标准和 ISO 推荐标准 (ISO/IEC 20922)。在https://baike.baidu.com/item/MQTT/3618851?fr=aladdin 上查看更多信息。 MQTT 协议有两个角色来在事物之间互操作数据:消息代理和客户端。第一个角色是服务器软件,用于接收和发布由一个或多个客户端生成或使用的消息。另外一个角色是智能设备和服务器软件,用于使用物的服务提供主要服务,例如提供楼宇自动化服务的服务器软件,或使用智能信号量和公共摄像头服务控制城市交通的软件。 MQTT 代理 市场上有各种 MQTT 消息代理,比较受欢迎的是 Eclipse Mosquitto (https://mosquitto.org/),因此我们将在示例中使用它。MQTT 代理类似于 JMS 或 MQ 代理。它是一种用于接收消息并将其发布到主题中的中间体。因此,连接的客户端可以订阅一个或多个主题以生成或使用来自这些主题的消息。这些主题允许客户端(软件和设备)以一种非耦合和异步的方式完成他们的工作。这意味着每个客户端都会观察一条消息并在必要时采取行动。他们也可以自己发布新消息。例如,如果恒温器在主题“A 楼”中发送一条指示高温的消息,则安装在该建筑物中并列在主题“A 楼”中的空调可以从那里获取此消息并自行打开以降低温度.但是,通常会看到带有业务规则的服务器端软件在温度达到特定值时自动打开空调。如果将 MQTT 代理配置为在关闭时保留消息并在再次打开时恢复它们,则它还可以保证消息传递。 MQTT Broker 的其他优点包括(来自维基百科): 消除易受攻击和不安全的客户端连接(如果配置为这样做)。 能够轻松地从单个设备扩展到数千个小工具。 管理和跟踪所有客户端连接状态,包括安全凭证和证书(如果配置为这样做)。 在不影响安全性的情况下减少网络压力,如果配置为这样做(使用蜂窝或卫星网络时)。 MQTT消息 有 3 种类型的消息: 连接:在 TCP/IP 会话中建立代理和客户端之间的连接。 断开连接:断开服务器和客户端与 TCP/IP 会话的连接。 发布:将消息放入主题并将该消息的副本发送给订阅该主题的每个客户端。 查看正在运行的消息示例: InterSystems IRIS 支持物联网和 MQTT 协议 根据 InterSystems IRIS 文档,目前支持的版本是 MQTT 3.1。此 MQTT 规范被定义为 OASIS 标准, MQTT 版本 3.1.1 。 IRIS 的互操作性模块定义了一个入站(用于使用 MQTT 消息)和一个出站(用于生成 MQTT 消息)MQTT 适配器。可以使用这些适配器开发自定义业务服务和操作,或者您可以分别使用内置业务服务和操作EnsLib.MQTT.Service.Passthrough和EnsLib.MQTT.Operation.Passthrough 。 如果您想在互操作性生产之外使用 MQTT 协议,您可以使用较低级别的 %Net.MQTT 类。 MQTT 类使用Eclipse Paho MQTT C 客户端库。 创建业务服务以使用 MQTT 消息 Class packagename.NewService1 Extends Ens.BusinessService { Parameter ADAPTER = "EnsLib.MQTT.Adapter.Inbound" ; Method OnProcessInput(pInput As EnsLib.MQTT.Message, pOutput As %RegisteredObject ) As %Status { set tsc= $$$OK set messageContent = pInput.StringValue …. Quit tsc } } 创建业务操作以生成/发送 MQTT 消息 Class packagename.NewOperation1 Extends Ens.BusinessOperation { Parameter ADAPTER = "EnsLib.MQTT.Adapter.Outbound" ; Parameter SETTINGS = "-SendSuperSession" ; Method OnMessage(pRequest As packagename.Request, Output pResponse As packagename.Response) As %Status { #dim tSC As %Status = $$$OK #dim e As %Exception.AbstractException Try { Set message = ##class (EnsLib.MQTT.Message). %New () Set message.Topic = ..Adapter .Topic Set jsonValue = {} Set jsonValue.message = "Response message” Set message.StringValue = jsonValue.%ToJSON() Set tSC=..Adapter.Send(message.Topic,message.StringValue) Set pResponse = ##class(packagename.Response).%New() Set pResponse.message = “Message response” } Catch e { Set tSC=e.AsStatus() } Quit tSC } 入站和出站 MQTT 适配器的设置 业务服务和业务运营都可以配置以下参数(来源:https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=EMQTT_reference): 客户 ID:这是向经纪人标识此客户的字符串。它必须是 ASCII 编码的并且包含 1 到 23 个字符。 连接超时:这是连接超时。连接到繁忙的服务器可能需要一些时间,因此可以使用此超时来避免过早的连接失败。它指定在连接尝试失败之前等待的秒数。 凭据名称:这是用于访问 MQTT 代理的一组凭据值的 ID 名称。 Credentials 项中定义的用户名和密码必须是 ASCII 编码的。如果代理不需要登录凭据,则不需要。 Keep Alive:指定在客户端发送给代理的消息之间传递的最大秒数。 QOS:这决定了所需的服务质量。它可以有以下两个值之一:0 - QOSFireAndForget:不等待来自代理的响应和 1 - QOSWaitForDelivery:等待来自代理的响应,如果代理没有响应则发出错误。 保留:这是向代理指示消息是否应保留的标志。 主题:这是您希望发布或订阅的主题的名称。主题必须是 ASCII 编码的。主题通常是一个层次结构字符串,其子主题级别由 /(正斜杠)分隔。在订阅中,主题可以使用通配符作为主题级别。 URL:这是您希望与之通信的经纪人的 URL。该方案是“tcp”或“ssl”,后跟域名和以“:”分隔的端口,例如“tcp://BIGBADAPPLE.local:1883”。通常启用 TLS 的端点配置有 8883 端口,但这不是强制性的。 下载并安装示例应用程序 IRIS IoT 示例是一个简单的应用程序,向您展示如何使用互操作性生产来使用(接收)和生成(发送)MQTT 消息。要获取它,请访问 https://openexchange.intersystems.com/package/IoT-Sample。现在,执行后续步骤。 1. clone/git pull repo 到任何本地目录 -----0----- 2、在该目录下打开终端,运行: -----1----- 3. 使用您的项目运行 IRIS 容器: -----2----- 如果要使用 ZPM 安装它,请按照以下步骤操作: 1. 打开启用了互操作性的 IRIS 命名空间。2. 打开终端并调用: -----3----- 运行示例应用程序。 1.打开制作,开始制作。它将开始观察 MQTT 主题 /DeviceStatusInputTopic 并生成对 MQTT 主题 /DeviceStatusOutputTopic 的响应。查看: 2. 使用MQTT 客户端发送消息并测试生产。为此,请在您的 Google Chrome 浏览器上访问https://chrome.google.com/webstore/detail/mqttbox/kaajoficamnjijhkeomgfljpicifbkaf 。它是 Chrome 插件 MQTTBox。只需点击添加到 Chrome,然后点击添加应用程序。 3. 在您的 Google Chrome 浏览器中,转到 chrome://apps/ 并选择 MQTTBox(如果需要,单击仍然打开)。 4. 单击创建 MQTT 客户端按钮。 5. 使用以下设置配置 MQTT 连接: 客户名称:本地 协议:mqtt/tcp 主机:本地主机:1883 用户名:admin 密码:管理员 所有其他设置保留默认值。 6. 配置 MQTT 主题以发送和接收 MQTT 消息: 要发布的主题:/DeviceStatusInputTopic 订阅主题:/DeviceStatusOutputTopic 有效载荷: { "deviceId" : "Air Conditioner Level 1" , "statusDate" : "2023-01-07 14:03:00" , "status" : 0 } 7. 单击按钮订阅以检查关于主题 /DeviceStatusOutputTopic 的消息。 8. 单击按钮 Publish 将消息发送到 /DeviceStatusInputTopic,并在 /DeviceStatusOutputTopic 上查看 IRIS 生产产生的结果。 9. 检查 IRIS 管理门户 Visual Trace 上的消息处理会话 示例应用程序源代码 Dockerfile ARG IMAGE=intersystemsdc/irishealth-community ARG IMAGE=intersystemsdc/iris-community FROM $IMAGE WORKDIR /home/irisowner/irisbuild ARG TESTS= 0 ARG MODULE= "iris-iot-sample" ARG NAMESPACE= "USER" RUN --mount= type = bind ,src=.,dst=. \ iris start IRIS && \ iris session IRIS < iris.script && \ ([ $TESTS -eq 0 ] || iris session iris -U $NAMESPACE "##class(%ZPM.PackageManager).Shell(\"test $MODULE -v -only\",1,1)" ) && \ iris stop IRIS quietly 最新版本的 InterSystems IRIS Community 用于创建 InterSystems IRIS 的 docker 实例,其命名空间名为 USER。 docker-compose 文件 version: '3.6' services: mosquitto: image: eclipse-mosquitto: 2 container_name: mosquitto user : root volumes: - ./mosquitto/config/:/mosquitto/config/ - ./mosquitto/log/:/mosquitto/log/ - ./mosquitto/data/:/mosquitto/data/ ports: - 1883 : 1883 - 9001 : 9001 iris: build: context: . dockerfile: Dockerfile restart: always command: --check-caps false ports: - 1972 - 52795 : 52773 - 53773 volumes: - ./:/irisdev/app 现在创建了两个 docker 容器实例,并且启动并运行。第一个是基于 Eclipse Mosquitto 产品的 MQTT 代理(mosquitto 服务),第二个是 MQTT 服务器端软件,负责消费和生产 MQTT 消息以提供设备监控服务。mosquitto docker 实例在文件 /mosquitto/config/mosquitto.conf 中配置。在那里定义了端口、消息持久性、安全和日志问题。文件 /mosquitto/config/password.txt 也将用户确定为 admin,密码也是 admin。但是,它是通过命令 mosquitto_passwd -U password.txt 加密的(您可以在https://mosquitto.org/man/mosquitto_passwd-1.html阅读更多相关信息)。 虹膜脚本文件 zn "%SYS" Do ##class (Security.Users).UnExpireUserPasswords( "*" ) zn "USER" Do ##class (EnsPortal.Credentials).SaveItem( 0 , "mosquitto_cred" , "mosquitto_cred" , "admin" , "admin" , "" ) zpm "load /home/irisowner/irisbuild/ -v" : 1 : 1 halt 该文件为业务服务和业务操作创建凭证。登录到 MQTT Broker 并运行 ZPM 文件 module.xml。 模块.xml 该文件用于在服务器上编译源代码以及在使用 ZPM 时安装示例应用程序。 <?xml version= "1.0" encoding= "UTF-8" ?> <Export generator= "Cache" version= "25" > <Document name= "iris-iot-sample.ZPM" > <Module> <Name>iris-iot-sample</Name> <Description>A simple IRIS interoperability application - for IoT using MQTT.</Description> <Version> 1.0 .8</Version> <Packaging> module </Packaging> <Dependencies> <ModuleReference> <Name>sslclient</Name> <Version> 1.0 .1</Version> </ModuleReference> </Dependencies> <SourcesRoot>src</SourcesRoot> <Resource Name= "dc.irisiotsample.PKG" /> <SystemRequirements Version= ">=2020.1" Interoperability= "enabled" /> </Module> </Document> </Export> 在 SourceRoot 标签上有要编译的源包。 DeviceStatus 持久类 Class dc.irisiotsample.DeviceStatus Extends %Persistent { Property deviceId As %String ; Property statusDate As %TimeStamp ; Property status As %Boolean ; Storage Default { <Data name= "DeviceStatusDefaultData" > <Value name= "1" > <Value>% %CLASSNAME </Value> </Value> <Value name= "2" > <Value>deviceId</Value> </Value> <Value name= "3" > <Value>statusDate</Value> </Value> <Value name= "4" > <Value>status</Value> </Value> </Data> <DataLocation> ^dc .irisiotsample.DeviceStatusD</DataLocation> <DefaultData>DeviceStatusDefaultData</DefaultData> <IdLocation> ^dc .irisiotsample.DeviceStatusD</IdLocation> <IndexLocation> ^dc .irisiotsample.DeviceStatusI</IndexLocation> <StreamLocation> ^dc .irisiotsample.DeviceStatusS</StreamLocation> <Type> %Storage.Persistent </Type> } } 此类用于将 DeviceStatus 保存在 SQL 表中。 DeviceStatusRequest 类 Class dc.irisiotsample.DeviceStatusRequest Extends Ens.Request { Property deviceId As %String ; Property statusDate As %TimeStamp ; Property status As %Boolean ; Storage Default { <Data name= "DeviceStatusRequestDefaultData" > <Subscript> "DeviceStatusRequest" </Subscript> <Value name= "1" > <Value>deviceId</Value> </Value> <Value name= "2" > <Value>statusDate</Value> </Value> <Value name= "3" > <Value>status</Value> </Value> </Data> <DefaultData>DeviceStatusRequestDefaultData</DefaultData> <Type> %Storage.Persistent </Type> } } 此类用于在互操作性组件之间交换数据。 设备状态服务 Class dc.irisiotsample.DeviceStatusService Extends Ens.BusinessService { Parameter ADAPTER = "EnsLib.MQTT.Adapter.Inbound" ; Method OnProcessInput(pInput As EnsLib.MQTT.Message, pOutput As Ens.StringResponse) As %Status { set tsc= $$$OK set DeviceStatusValue = ##class ( %DynamicAbstractObject ). %FromJSON (pInput.StringValue) set DeviceStatus = ##class (dc.irisiotsample.DeviceStatusRequest). %New () set DeviceStatus.deviceId = DeviceStatusValue.deviceId set DeviceStatus.statusDate = DeviceStatusValue.statusDate set DeviceStatus.status = DeviceStatusValue.status set tsc = ..SendRequestSync ( "DeviceStatusProcess" , DeviceStatus, .Response, - 1 , "Device Status Process" ) set pOutput = Response quit tsc } } adapter 参数表示在接收 MQTT 消息时使用 MQTT 适配器。方法 OnProcessInput 在 pInput 上接收 MQTT 消息并将其发送到业务流程,调用方法 SendRequestSync 作为同步消息。 设备状态进程 Class dc.irisiotsample.DeviceStatusProcess Extends Ens.BusinessProcess { Method OnRequest(request As dc.irisiotsample.DeviceStatusRequest, Output response As Ens.StringResponse) As %Status { Set tsc = 1 Set response = ##class (Ens.StringResponse). %New () Set DeviceStatus = ##class (dc.irisiotsample.DeviceStatus). %New () Set DeviceStatus.deviceId = request.deviceId Set DeviceStatus.status = request.status Set DeviceStatus.statusDate = request.statusDate Set tsc = DeviceStatus. %Save () If $$$ISOK (tsc) { Set tsc = ..SendRequestSync ( "DeviceStatusOperation" , request, .pResponse, - 1 , "Device Status Operation" ) Set response.StringValue = "Device id " _pResponse.deviceId_ " has the status " _pResponse.status } Else { Set response.StringValue = "Error on save the device status" Set SuspendMessage = 1 } quit tsc } Storage Default { <Type> %Storage.Persistent </Type> } } 此类从业务服务接收消息,将其保存到数据库,并调用 DeviceStatusOperation 发送(生成)带有结果的消息。 DeviceStatusOperation Class dc.irisiotsample.DeviceStatusOperation Extends Ens.BusinessOperation { Parameter ADAPTER = "EnsLib.MQTT.Adapter.Outbound" ; Parameter SETTINGS = "-SendSuperSession" ; Method NotifyDeviceStatus(pRequest As dc.irisiotsample.DeviceStatusRequest, Output pResponse As dc.irisiotsample.DeviceStatusResponse) As %Status { #dim tSC As %Status = $$$OK #dim e As %Exception.AbstractException Try { Set message = ##class (EnsLib.MQTT.Message). %New () Set message.Topic = ..Adapter .Topic Set jsonValue = {} Set jsonValue.message = "Device " _pRequest.deviceId_ " has status " _pRequest.status Set message.StringValue = jsonValue. %ToJSON () Set tSC= ..Adapter .Send(message.Topic,message.StringValue) Set pResponse = ##class (dc.irisiotsample.DeviceStatusResponse). %New () Set pResponse.deviceId = pRequest.deviceId Set pResponse.status = pRequest.status } Catch e { Set tSC=e.AsStatus() } Quit tSC } XData MessageMap { <MapItems> <MapItem MessageType= "dc.irisiotsample.DeviceStatusRequest" > <Method>NotifyDeviceStatus</Method> </MapItem> </MapItems> } } 此类从业务流程接收消息,并生成一条 MQTT 消息,发送到具有流程响应的主题。 设备状态生产 Class dc.irisiotsample.DeviceStatusProduction Extends Ens.Production { XData ProductionDefinition { <Production Name= "dc.irisiotsample.DeviceStatusProduction" LogGeneralTraceEvents= "false" > <Description></Description> <ActorPoolSize> 2 </ActorPoolSize> <Item Name= "DeviceStatusService" Category= "" ClassName= "dc.irisiotsample.DeviceStatusService" PoolSize= "1" Enabled= "true" Foreground= "false" Comment= "" LogTraceEvents= "false" Schedule= "" > <Setting Target= "Adapter" Name= "ClientID" >InterSystemsIRIS</Setting> <Setting Target= "Adapter" Name= "Topic" >/DeviceStatusInputTopic</Setting> <Setting Target= "Adapter" Name= "Url" >tcp: //mosquitto:1883</Setting> <Setting Target= "Adapter" Name= "CredentialsName" >mosquitto_cred</Setting> </Item> <Item Name= "DeviceStatusProcess" Category= "" ClassName= "dc.irisiotsample.DeviceStatusProcess" PoolSize= "1" Enabled= "true" Foreground= "false" Comment= "" LogTraceEvents= "false" Schedule= "" > </Item> <Item Name= "DeviceStatusOperation" Category= "" ClassName= "dc.irisiotsample.DeviceStatusOperation" PoolSize= "1" Enabled= "true" Foreground= "false" Comment= "" LogTraceEvents= "false" Schedule= "" > <Setting Target= "Adapter" Name= "ClientID" >InterSystemsIRIS</Setting> <Setting Target= "Adapter" Name= "Topic" >/DeviceStatusOutputTopic</Setting> <Setting Target= "Adapter" Name= "Url" >tcp: //mosquitto:1883</Setting> <Setting Target= "Adapter" Name= "CredentialsName" >mosquitto_cred</Setting> </Item> </Production> } } 此类使用所需参数配置业务服务、业务流程和业务操作,并将这些组件放在一起工作。 主要配置的参数有: URL:设置 MQTT Broker 地址。 主题:接收和发送 MQTT 消息的队列。 DeviceStatusInputTopic 用于业务服务,DeviceStatusOutputTopic 用于业务操作。 CredentialsName:使用用户名和密码设置凭据以连接 MQTT 代理。 ClientID:它是为 InterSystems IRIS 分配的逻辑名称,代理需要它来识别 MQTT 客户端。 如您所见,用于 MQTT 的 IRIS 互操作性适配器是一个非常简单且功能强大的工具,用于使用和生成 MQTT 消息以及自动化涉及 IoT 设备的业务流。所以享受它。 查看原贴由 @Yuri.Gomes 撰写
公告
Claire Zheng · 三月 15, 2023

创意社区新闻摘要#4 | InterSystems Ideas News#4

Hi 开发者社区的成员们,大家好! 欢迎关注我们第4期 InterSystems Ideas News! 我们将分享如下: 如何支持你们team的想法和投票。 在编程大赛中,用户实践Idea(创意)并获得技术奖励。 InterSystems 开发者社区的深色主题版本:是或否(Yay or Nay?)? 最近添加的Idea(创意)。 最重要的消息是,在上一届编程大赛中,有 5 名参赛者因实践InterSystems Ideas 门户网站的创意而获得加分!他们是: 开发者 应用名称 实施的Idea(创意) @Lorenzo Scalese OpenAPI-Suite 添加类似于 SOAP 向导的向导,以根据 OpenAPI 规范生成 REST 客户端 @José Roberto Pereira @Henrique Dias @Henry Pereira iris-tripleslash 添加有助于为 ObjectScript 类生成单元测试的项目 @Sergey Mikhailenko gateway-sql, apptools-admin 创建一个 UI,以便将项目(类、全局变量、应用程序、用户、角色、特权、授权、命名空间映射、SQL 网关、库等)方便、轻松地传输到其他系统实例以进行快速部署。 我们添加了一个新过滤器“我的组织(My organization)”。从现在开始,来自同一公司的人可以过滤来自同一组织的人的想法和投票。 前几天,@Guillaume Rongier 发布了关于为开发者社区添加深色主题的Idea(创意)。我们非常期待您参与 Ideas Portal 主页上的“民意测验”提供意见反馈,或对该想法进行投票和评论。 最近添加的想法 InterSystems Community 深色版本 为 DC 上的工作机会部分添加工作地点 新功能的可搜索索引 通过环境变量设置密码 安排在 DC 站点上发布文章 在 DC 文本编辑器上支持 JSON 支持 DC 文本编辑器上的 linux bash 语言 使用 SQL 命令将数据从 IRIS 捕获更改为 kafka 跨生产互操作消息、服务和操作 ISC 产品的附加数据类型 DTL、BPL 和规则集中 XData 的自动 XML 格式化 断言 CodeAssist 提示 OpenAI API 的 IRIS 类 在消息属性选项卡上显示 UserValues 内容 虹膜即服务 允许在 VS 代码中对互操作性组件 BPL、DTL 和业务规则进行图形编辑 为所有 IRIS 互操作性组件添加源代码控制 审计查找表 为 WRC 门票添加“观察名单”(问题、问题) 连接 InterSystems 文档和开发人员社区 在 npm 上发布适用于 Node.js 的 InterSystems IRIS Native SDK 像往常一样,在InterSystems Ideas上发布您的想法,对现有想法进行投票和评论,并实践Community Opportunity 的Idea(创意)。 请继续关注我们的下一个新闻公告!
公告
Claire Zheng · 四月 10, 2023

创意社区新闻摘要#5 | InterSystems Ideas News#5

Hi 开发者社区的成员们,大家好! 欢迎关注我们第5期 InterSystems Ideas News! 本期分享如下: ✓名人堂 ——创意社区门户的新页面 ✓与 Global Masters 整合——您的每个奇思妙想都可以积分 ✓计划实施的想法清单 11 位开发人员已经实施了来自 Ideas Portal 的想法。我们在 InterSystems Ideas 上创建了一个新的专门页面来向这些英雄致敬。名人堂名单: 已实施创意的名称; 实施创意的开发人员; 项目名称(含详细信息链接)。 实施来自Community Opportunity 的创意,您的名字也将进入名人堂! 大约一个月前,提交产品创意的开发人员开始获得这些创意的积分。 我们想分享一下,自 2 月 22 日以来,作者因以下想法共获得了 18,200 Global Masters的积分 发布、推广或实施的 15 个产品创意: Cross-production Interoperability Messages, Service and Operation by @Stefan Cronje Additional Data Types for ISC Products by @Stefan Cronje Change data capture from IRIS to kafka using SQL commands by @Yuri Marx Allow graphical editing of Interoperability components BPL, DTL and Business Rules in VS Code by @Steve Pisani Examples to work with IRIS from Django by @Evgeny Shvarov Install python and java libraries from ZPM and Installation Manifest (%Installer) by @Yuri Marx Set password through environment variable by @Dmitry Maslennikov Add a project that helps to generate unittests for an ObjectScript class by @Evgeny Shvarov Create a UI for convenient and easy transfer of projects (classes, globals, applications, users, roles, privileges, grants, namespace mapping, SQLgateways, libraries, etc.) to other system instances for fast deployment. by @Sergey Mikhailenko Add a wizard similar to the SOAP wizard to generate a REST client from OpenAPI specification by @Jaime Lerga Public API for access to shared memory by @Alexey Maslov Fold code on loops and If's on studio by @Heloisa Paiva Chat bot to help with TrakCare customization/settings by Sumana Gopinath Iterative build of TrakCare configuration/code tables utilising FHIR and HL7 Messaging. by Linda McKay BPL, DTL, Business Rule Editor in VSCode by @Cristiano Silva 发布您的绝妙想法并赢得积分! 为了总结本期通讯,这里列出了计划实施的创意 Publish the InterSystems IRIS Native SDK for Node.js on npm by @John Murray Move users, roles, resources, user tasks, Mappings (etc) to a seperate Database, other than %SYS, so these items can be mirrored by @Sean.O'Connor1391 Please add google oauth authorization to login to the management portal by @Aleksandr Kolesov InterSystems Ideas - Long Term by @Vinay Purohit BPL, DTL, Business Rule Editor in VSCode by @Sawyer Butterfield Add Favorites in GM by @Irène Mykhailova LIMIT OFFSET support for IRIS SQL by @Dmitry Maslennikov Introduce WITH into IRIS SQL engine by @Evgeny Shvarov Security settings for mirror configurations by @Evgeny Shvarov A modern management portal to manage InterSystems IRIS by @Evgeny Shvarov copy/sync system configurations and user accounts between IRIS instances by @Evgeny Shvarov Jupyter Notebook by Guest 保持创意,在InterSystems Ideas上发布您的奇思妙想,对现有想法进行投票和评论!
公告
Claire Zheng · 五月 18, 2023

创意社区新闻摘要#6 | InterSystems Ideas News#6

Hi 开发者社区的成员们,大家好! 欢迎关注我们第6期 InterSystems Ideas News! 本期分享如下: ✓ 社区成员上个月实施的创意 ✓ 如何在 InterSystems Ideas 上创建新创意 ✓ 最近产生的新创意 名人堂更新了实施社区创新想法的社区成员的名字: 将 IRIS 添加为 Apache Superset 的支持数据库,该创意由@Herman Slagman 提出,由 @Dmitry Maslennikov 实施 请添加 google oauth 授权以登录管理门户,该创意由 @Aleksandr Kolesov 提出,由 @Yuri Marx 实施 👏感谢您实践这些创意👏 新文章“ 如何在 InterSystems Ideas 上创建新创意”逐步描述了创意创建的过程。在向门户添加新想法时阅读它。 为了总结本期时事通讯,以下是自上次新闻公告以来发布的新想法列表 1. @Evgeny Shvarov : 转储 SQL 表2. @Dmitry Maslennikov :对 IRIS 的 Java Hibernate 支持3. @Evgeny Shvarov :为 ObjectScript 变量名添加合法的特殊符号分隔符 4.@Robert Cemper :允许取消“待批准” 5.@Robert Cemper :提供隐藏/取消隐藏帖子的开关。或修复重新发布6. @Scott Roth :Java 网关跟踪路由显示7.@John Murray :在开发者社区将动画 GIF 放在播放/暂停按钮后面8. @yurimarx Marx :在 GEO 仪表板上的数字社区9.@Robert Barbiaux :在 VSCode 中进行单元测试10. @Scott Roth :在消息搜索中保存搜索条件11. @yurimarx Marx :特色文章或问题 👏感谢您发布新想法👏 请继续关注下一期 InterSystems Ideas 新闻公告! 保持创意,在InterSystems Ideas上发布您的奇思妙想,对现有想法进行投票和评论!
公告
Michael Lei · 六月 3, 2023

InterSystems 硬件OS支持平台更新 2023年2季度

InterSystems 支持的硬件OS平台更新 2023年2季度 我们经常收到有关 InterSystems IRIS 数据平台支持的平台和框架列表最近和即将发生的变化的问题。此更新旨在分享最近的更改以及我们对即将发生的更改的已知的情况,但预测未来是一项棘手的工作,不应将其视为承诺的路线图。 话虽如此,关于更新…… IRIS 生产操作系统和 CPU 架构 红帽企业 Linux 近期变动 RHEL 9.2 和 RHEL 8.8 于 2023 年 5 月发布。Red Hat 计划为这些版本提供 4 年的支持。 InterSystems 计划通过我们称为“次要操作系统版本认证”的新流程对 RHEL 9.2 上的 IRIS 进行额外测试,该流程旨在提供额外的安全性,即次要操作系统更新不会破坏任何明显的内容。 随着 RHEL 9.2 的发布,Red Hat 终止了对 RHEL 9.1 的支持。这与 Red Hat 自 RHEL 8.0 以来一直使用的“奇数/偶数”支持周期一致。 RHEL 8.4 扩展维护将于 2023 年 5 月 31 日结束,这意味着 IRIS 也将在那时停止支持此次要版本。 即将发生的变化 RHEL 9.3 计划在今年晚些时候推出。这将是 Red Hat 的短期支持版本,因此 InterSystems 不会推荐将其用于生产部署。 以前的更新 IRIS 2022.1.2 添加了对RHEL 9.0的支持。 9.0 是一个主要的操作系统版本,将 Linux 内核更新到 5.14,将 OpenSSL 更新到 3.0,将 Python 更新到 3.9 IRIS 2022.2.0 移除了对 RHEL 7.x 的支持。 IRIS 的早期版本仍支持 RHEL 7.9。 进一步阅读: RHEL 发布页面 Ubuntu 近期变动 Ubuntu 22.04.02 LTS 于 2023 年 2 月 22 日发布。InterSystems 目前正在通过我们称为“次要操作系统版本认证”的新流程在 22.04.02 LTS 上对 IRIS 进行额外测试。到目前为止,一切都很好。 即将发生的变化 Ubuntu 的下一次重大更新定于 2024 年 4 月 以前的更新 IRIS 2022.1.1 增加了对Ubuntu 22.04 的支持。 22.04 是一个主要的操作系统版本,将 Linux 内核更新到 5.15,将 OpenSSL 更新到 3.0.2,将 Python 更新到 3.10.6 IRIS 2022.2.0 移除了对 Ubuntu 18.04 的支持。 IRIS 的早期版本仍然支持 Ubuntu 18.04。 IRIS 2022.1.1 及更高版本的容器基于 Ubuntu 22.04。 进一步阅读: Ubuntu 发布页面 SUSE 操作系统 即将发生的变化 SUSE Linux Enterprise Server 15 SP5 目前正在进行公测。我们预计 SUSE 将在第二季度末或第三季度初发布 15 SP5,并在此之后添加对 IRIS 的支持。 SP5 将包括 Linux 内核 5.14.21、OpenSSL 3.0.8 和 Python 3.11 SUSE 对 Linux Enterprise Server 15 SP3 的一般支持于 2022 年 12 月 31 日结束,但扩展的安全支持将持续到 2025 年 12 月。 以前的更新 IRIS 2022.3.0 增加了对SUSE Linux Enterprise Server 15 SP4的支持。 15 SP4 是一个主要的操作系统版本,将 Linux 内核更新到 5.14,将 OpenSSL 更新到 3.0,将 Python 更新到 3.9 延伸阅读: SUSE 生命周期 甲骨文Linux 即将发生的变化 根据他们的历史,Oracle Linux 9 将在 2023 年下半年的某个时候包含 RHEL 9.2。 以前的更新 IRIS 2022.3.0 添加了对Oracle Linux 9的支持。 Oracle Linux 9 是跟踪 RHEL 9 的主要操作系统版本,因此它也将 Linux 内核更新到 5.14,将 OpenSSL 更新到 3.0,将 Python 更新到 3.9 进一步阅读: Oracle Linux 支持政策 微软Windows 即将发生的变化 Windows Server 2012 的扩展支持将于 2023 年 10 月结束。如果您仍在该平台上运行,现在是计划迁移的时候了。 IRIS 2023.2 将不适用于Windows Server 2012。 以前的更新 自 IRIS 2022.1 中添加了 Windows Server 2022 以来,我们未对支持的 Windows 版本列表进行任何更改 进一步阅读: Microsoft 生命周期 AIX 即将发生的变化 InterSystems 正与 IBM 密切合作以增加对 OpenSSL 3.0 的支持。这不会包含在 IRIS 2023.2.0 中,因为 IBM 需要在进一步的 TL 版本中针对该功能。好消息是 IBM 正在寻求为 AIX 7.2 和 7.3 发布 OpenSSL 3.0,而且时间看起来应该与 IRIS 2023.3 保持一致。 以前的更新 自从在 IRIS 2022.1 中添加了 AIX 7.3 并删除了 7.1 以来,我们没有对受支持的 AIX 版本列表进行任何更改 进一步阅读: AIX 生命周期 容器 即将发生的变化 IRIS 容器将只标记年份和版本,例如“2023.2”,而不是我们过去一直使用的完整内部版本号。这样,您的应用程序可以默认获取您发布的最新维护版本。 我们还为最新的扩展维护和持续分发 IRIS 版本添加了“latest-em”和“latest-cd”标签。这些将有利于演示、示例和开发环境。 我们还将开始使用“-preview”标记预览容器,以便清楚哪个容器是最新的 GA 版本。 这些更改都将在 2023.2 GA 版本中生效。我们将在 6 月发布更多相关信息。 以前的更新 我们现在正在发布 IRIS 容器的多架构清单。这意味着拉取标记为2022.3.0.606.0的 IRIS 容器将为您的机器的 CPU 架构(Intel/AMD 或 ARM)下载正确的容器。 IRIS 开发操作系统和 CPU 架构 苹果系统 近期变动 我们在 IRIS 2023.1 中添加了对 MacOS 13 的支持 即将发生的变化 MacOS 14 将很快发布,预计将在今年晚些时候正式发布。 CentOS 我们正在考虑取消对 CentOS/CentOS Stream 的支持。请参阅下面的推理。 Red Hat 几年来一直在运行开发人员计划,该计划使开发人员能够获得非生产环境的免费许可证。鼓励当前使用 CentOS 的开发人员通过此程序切换到 RHEL。 CentOS Stream 现在是 RHEL 的“上游”,这意味着它具有 RHEL 尚未包含的错误和功能。它还每天更新,这可能会给平台上的开发人员带来问题(更不用说我们自己的测试人员了)。 自从我们在 IRIS 2022.1 中添加了对 CentOS 8-Stream 的支持并删除了对 CentOS 7.9 的支持后,我们没有对受支持的 CentOS 版本列表进行任何更改 InterSystems 组件 InterSystems API 管理器 (IAM) IAM 3.2 于本季度发布,其中包括对容器基础映像的更改,从 Alpine 到 Amazon Linux。 Caché & Ensemble 生产操作系统和 CPU 架构 以前的更新 Cache 2018.1.7 增加了对 Windows 11 的支持 InterSystems 支持的平台文档 InterSystems 支持的平台文档是支持技术的最终列表的来源。 IRIS 2020.1 支持的服务器平台 IRIS 2021.1 支持的服务器平台 IRIS 2022.1 支持的服务器平台 IRIS 2023.1 支持的服务器平台 Caché & Ensemble 2018.1.7 支持的服务器平台 以上就是全部内容。同样,如果您想了解更多信息,请给我们留言。
文章
Jingwei Wang · 七月 21, 2022

InterSystems SQL 的使用 - 第五部分 - 导入SQL Code

本章介绍了如何将SQL code从文本文件导入InterSystems SQL。当你导入SQL code时,InterSystems IRIS 数据平台使用动态SQL准备并执行每一行的SQL。如果遇到无法解析的SQL code行,SQL导入会跳过该行code,继续准备和执行后续的code行,直到到达文件的末端。所有的SQL code导入操作都会导入到当前的命名空间。 SQL导入主要用于导入数据定义语言(DDL)命令,如CREATE TABLE,并使用INSERT、UPDATE和DELETE命令来填充表。SQL导入可以准备和执行SELECT查询,但不创建结果集。 SQL导入可以用来导入InterSystems的SQL code。它也可以用于code迁移,从其他供应商(FDBMS、Informix、InterBase、MSSQLServer、MySQL、Oracle、Sybase)导入SQL。来自其他供应商的code被转换为InterSystems的SQL并执行。SQL导入不能将所有的SQL命令导入到InterSystems SQL中。它导入的是那些与InterSystems IRIS实现的SQL标准兼容的命令和条款。不兼容的特征通常会被解析,但会被忽略。 SQL导入可以成功地准备一个SQL查询--在适当的时候创建一个相应的缓存查询--但它不会执行查询。 你通过调用%SYSTEM.SQL.Schema类中的适当方法来执行SQL code导入。当导入SQL code时,这些方法可以创建另外两个文件:一个是Errors.log文件,它记录了解析SQL命令的错误;另一个是Unsupported.log文件,它包含了该方法不能识别为SQL命令的行的字面文本。 导入 InterSystems SQL Code 你可以使用%SYSTEM.SQL.Schema方法从一个文本文件中导入InterSystems的SQL code。 ImportDDL()是一个通用的SQL导入方法。该方法作为一个后台(非交互式)进程运行。如下面的例子中所示,示例中第一个参数mysqlcode.txt为SQL命令文件,第二个参数是默认的错误日志文件mysqlcode_Errors.log,第三个参数指定为 "IRIS "。 DO $SYSTEM.SQL.Schema.ImportDDL("c:\InterSystems\mysqlcode.txt",,"IRIS") 注意:这种SQL DDL代码的导入和执行不应该与管理门户SQL界面的导入语句操作相混淆。管理门户SQL界面的导入语句是以XML格式导入SQL语句。 这个mysqlcode.txt文本文件必须是一个没有格式化的文件,如.txt文件。每条SQL命令必须在自己的行中开始。一个SQL命令可以分成多行,允许缩进。每条SQL命令后面必须有一个GO语句,并在自己的行上,下面是一个有效的InterSystems SQL导入文件文本的例子: CREATE TABLE Sample.MyStudents (StudentName VARCHAR(32),StudentDOB DATE) GO CREATE INDEX NameIdx ON TABLE Sample.MyStudents (StudentName) GO INSERT INTO Sample.MyStudents (StudentName,StudentDOB) SELECT Name, DOB FROM Sample.Person WHERE Age <= '21' GO INSERT INTO Sample.MyStudents (StudentName,StudentDOB) VALUES ('Jones,Mary',60123) GO UPDATE Sample.MyStudents SET StudentName='Smith-Jones,Mary' WHERE StudentName='Jones,Mary' GO DELETE FROM Sample.MyStudents WHERE StudentName %STARTSWITH 'A' GO Run() 是一个InterSystems SQL导入方法。这个方法在终端以交互方式运行。它提示你指定导入文本文件的位置,创建Errors.log文件和Unsupported.log文件的位置,以及其他信息。 支持的SQL命令 不是所有有效的InterSystems SQL命令都能被导入。以下是支持的InterSystems SQL命令的列表。 CREATE TABLE, ALTER TABLE, DROP TABLE ​ CREATE VIEW, ALTER VIEW, DROP VIEW ​ CREATE INDEX all index types, except bitslice ​ CREATE USER, DROP USER ​ CREATE ROLE ​ GRANT, REVOKE ​ INSERT, UPDATE, INSERT OR UPDATE, DELETE ​ SET OPTION ​ SELECT for optimizer plan mode only 导入非 InterSystems SQL Code InterSystems SQL 支持导入其他供应商使用的SQL。来自其他供应商的code被转换为InterSystems的SQL code并执行,我们提供了以下方法。 ImportDDL() 也可以用来导入非InterSystems SQL。 要导入特定格式的SQL,你需要指定该格式的名称作为一个参数,例如 FDBMS, Informix, InterBase, MSSQLServer (或MSSQL), MySQL, Oracle, 或Sybase。下面的例子导入了MSSQL代码文件mssqlcode.txt,在当前命名空间中执行该文件中列出的SQL命令。 DO $SYSTEM.SQL.Schema.ImportDDL($lb("C:\temp\somesql.sql","UTF8"),,"MSSQL") 注意,如果第三个参数是MSSQL、Sybase、Informix或MySQL,第一个参数可以是一个SQL code文件路径名或一个双元素%List,第一个元素是SQL code文件路径名,第二个元素是要使用的I/O转换表。 在%SYSTEM.SQL.Schema中提供了单独的交互式方法来导入以下类型的SQL。LoadFDBMS(), LoadInformix(), LoadInterBase(), LoadMSSQLServer(), LoadOracle(), and LoadSybase()。这些方法从终端交互式地运行。它提示你指定导入文本文件的位置,创建Errors.log文件和Unsupported.log文件的位置,以及其他信息。 ImportDDLDir()允许你从一个目录中的多个文件导入SQL code。该方法作为一个后台进程运行。它支持Informix、MSSQLServer和Sybase。所有要导入的文件必须有一个.sql**的后缀。 ImportDir()允许你从一个目录中的多个文件导入SQL code。比ImportDDLDir()提供更多的选项。该方法作为一个后台进程运行。它支持MSSQLServer,和Sybase。你可以指定一个允许的文件扩展名后缀列表。
公告
Michael Lei · 七月 25, 2022

InterSystems 即将举办“推动女性健康-FemTech不止是利基市场“在线论坛

Hi 大家好! 我们很荣幸地宣布InterSystems 将在剑桥总部举办 推动女性健康-FemTech不止是利基市场 高层论坛,论坛将在线上线下同步举行! ⏱ 时间: 7月 29日, 5:30 AM – 7:30 AM ,北京时间(July 28,5:30 PM – 7:30 PM ,EDT/美国东部时间)📍 地点: InterSystems 总部,1 Memorial Drive, Cambridge, MA 本次活动是由 HealthTech Build 组织的,HTB的愿景是为医疗机构、生物科技数字创新者、健康数据科学家、数字疗法开发者和软件工程师,以颠覆性的富有成效的方式为共同目标而努力。对于这次活动,目标将是交流思想,并以新的方式解决未满足的妇女健康需求。 本次论坛的参与嘉宾包括: Janine Kopp, Investor & Head of Venture Studio, Takeda Digital Ventures Uros Kuzmanovic, CEO, Biosens8 Mary Beth Cicero, CEO, 3Daughters Thom Busby, Senior Vice President, Outcome Capital 不要错过这个极好的机会,在志同道合的同伴中发现挑战并讨论新的解决方案。 >> 注册线上会议 <<
文章
Jingwei Wang · 七月 28, 2022

InterSystems SQL 的使用 - 第七部分 - Stored Procedures

定义 Stored Procedures 可以使用以下方式定义stored procedures 使用DDL定义存储过程 使用类方法定义存储过程 使用DDL定义存储过程 CREATE PROCEDURE 可以创建一个查询,它总是作为一个存储过程被预测。一个查询可以返回一个单一的结果集。 CREATE PROCEDURE AgeQuerySP(IN topnum INT 10, IN minage INT 20) BEGIN SELECT TOP :topnum Name, Age FROM Sample.Person WHERE Age > :minage; END 列表中的每个参数声明包括(按顺序)。指定参数模式是IN(输入值),OUT(输出值),还是INOUT(修改值)。如果省略,默认的参数模式是IN,参数名称是区分大小写的。 CREATE QUERY 可以创建一个可以选择作为存储过程投射的查询。一个查询可以返回一个单一的结果集,这个查询可能是也可能不是作为存储过程公开的。要创建一个作为存储过程公开的查询,你必须指定PROCEDURE关键字作为其特征之一。你也可以使用CREATE PROCEDURE语句来创建一个作为存储过程公开的查询。 为了创建一个查询,你必须拥有%CREATE_QUERY管理权限,正如GRANT命令所指定的那样。如果类的定义是一个已部署的类,你不能在该类中创建一个查询。 CREATE QUERY AgeQuery(IN topnum INT DEFAULT 10,IN minage INT 20) PROCEDURE BEGIN SELECT TOP :topnum Name,Age FROM Sample.Person WHERE Age > :minage ; END 使用类定义存储过程 要定义一个方法存储过程,只需定义一个类方法并设置其SqlProc关键字。 Class MyApp.Person Extends %Persistent [DdlAllowed] { ​ /// This procedure finds total sales for a territory ClassMethod FindTotal(territory As %String) As %Integer [SqlProc] { // use embedded sql to find total sales &sql(SELECT SUM(SalesAmount) INTO :total FROM Sales WHERE Territory = :territory ) ​ Quit total } } 这个类被编译后,FindTotal()方法将作为存储过程MyApp.Person_FindTotal()投射到SQL。你可以使用该方法的SqlName关键字改变SQL对存储过程的命名。 该方法使用一个存储过程上下文处理程序,在存储过程和其调用者(例如,ODBC服务器)之间来回传递存储过程上下文。这个过程上下文处理程序是由InterSystems IRIS使用%sqlcontext对象自动生成的(作为%qHandle:%SQLProcContext)。 %sqlcontext由SQLCODE错误状态、SQL行数、错误信息等属性组成,使用相应的SQL变量进行设置,如下所示。 SET %sqlcontext.%SQLCODE=SQLCODE SET %sqlcontext.%ROWCOUNT=%ROWCOUNT SET %sqlcontext.%Message=%msg 使用 Stored Procedures 当执行一个以SQL函数为参数的存储过程时,使用CALL来调用该存储过程,如下面的例子. CALL sp.MyProc(CURRENT_DATE) SELECT查询不支持执行带有SQL函数参数的存储过程。SELECT支持用一个SQL函数参数执行一个存储函数。 xDBC不支持使用SELECT或CALL来执行一个带有SQL函数参数的存储过程。 你可以在一个SQL查询中使用一个存储函数,就像它是一个内置的SQL函数一样。函数的名称是存储函数的SQL名称(在这里是 "Square"),由定义它的schema(包)名称限定(在这里是 "MyApp")。 下面的查询使用了Square函数。 SELECT Cost, MyApp.Utils_Square(Cost) As SquareCost FROM Products 查询Stored Procedures 信息 INFORMATION.SCHEMA.ROUTINES持久化类显示关于当前命名空间中所有routine和程序的信息。 下面的例子返回routine名称,方法或查询名称,routine类型(PROCEDURE或FUNCTION),routine主体(SQL=带SQL的类查询,EXTERNAL=不带SQL的类查询),返回数据类型,以及当前名称空间中模式 "Sample "中所有routine的routine定义。 SELECTROUTINE_NAME,METHOD_OR_QUERY_NAME,ROUTINE_TYPE,ROUTINE_BODY,SQL_DATA_ACCESS,IS_USER_DEFINED_CAST, DATA_TYPE||' '||CHARACTER_MAXIMUM_LENGTH AS Returns,NUMERIC_PRECISION||':'||NUMERIC_SCALE ASPrecisionScale, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='Sample' INFORMATION.SCHEMA.PARAMETERS持久化类显示当前命名空间中所有routine和程序的输入和输出参数的信息。 下面的例子返回了当前命名空间中模式 "Sample "中所有routine的routine名称、参数名称、是输入参数还是输出参数,以及参数数据类型信息。 SELECT SPECIFIC_NAME,PARAMETER_NAME,PARAMETER_MODE,ORDINAL_POSITION, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH AS MaxLen,NUMERIC_PRECISION||':'||NUMERIC_SCALE AS PrecisionScale FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_SCHEMA='Sample'