问题 Michael Lei · 五月 5, 2021 来自海外的问题: 使用自身作为参数的%Persistent类中的查询方法 大家好, 我想知道是否有可能获取自身的值来运行查询。 我想创建一些查询以在%Persistent类中找到一个值,但是每个查询都使用不同的值。 #SQL #Caché #Ensemble 0 1 0 296
问题 Michael Lei · 二月 5, 2022 为某一个给定类获取SQL 表名称(答案见英文社区) 假设有一个类 "X.Y.Z" 它的SQL表名称是什么?如何通过ObjectScript获取?? 快速的搜素不能显示任何方法或属性。文档有点 "不对" 说 SQL 表名称是一样的. 至少应该是 'x_y.z'. 答案见英文社区:https://community.intersystems.com/post/getting-sql-table-name-given-class #ObjectScript #SQL #InterSystems IRIS 0 1 0 161
问题 Michael Lei · 六月 16, 2021 来自海外社区的问题:在Ensemble中使用SQL进行批量插入 在Ensemble中使用SQL进行批量插入你好,社区。 我试图在一个表中插入多个值。下面是简单的SQL语句。 插入到表X中 values ('Name', 'Address', 'Phone') 我怎样才能在一条语句中进行多次插入(行)? 数值不在另一个表中,所以我不能使用选择进入。 谢谢。 吉米-克里斯蒂安 Hello Community, I am trying to insert multiple values in a table. Below is the simple sql statement. Insert Into TableX values ('Name', 'Address', 'Phone') #SQL #Ensemble 0 1 0 108
问题 Michael Lei · 四月 29, 2022 Cache 动态 SQL 分页 我想知道是否有更好的方法来使用动态SQL对数据集进行分页,而不是我下面使用的方法。问题是,当潜在的数据池变大时,这段代码就会变慢,以至于无法使用。在分析下面的每一行代码时,似乎速度变慢与最初的rset.%Next()迭代有关。 有没有什么不需要子查询/%VID的可用方法,比如简单的LIMIT/OFFSET? 我的代码类似于: s sql=##class(%SQL.Statement).%New() s query="SELECT *,%VID FROM (SELECT prop FROM table WHERE prop=x) WHERE %VID BETWEEN 1 AND 100" s sc=sql.%Prepare(query) s rset=sql.%Execute() while rset.%Next() {..... #对象数据模型 #SQL #Caché 0 1 1 299
问题 Michael Lei · 四月 27, 2022 如何更改主键? Hi, 请问如何更改表(有数据)上的主键?谢谢! 答: 如果数据已经存在,那么这是一项必须重视的任务,特别是如果存在继承或父/子关系,因为这将导致你的数据存储方案的改变。 最简单的方法是通过一个中间(临时)表来实现。 创建一个具有相同结构的新类,但有一个新的主键。使用SQL(不是合并命令)将数据从旧的类中移到它里面。删除旧类中的数据/索引,然后改变其中的主键。使用合并命令,将数据从新类移到旧类中。删除带有数据的新类。重建索引(如果有的话)。 几个有用的链接: MERGE #SQL #数据导入和导出 #数据库 #Ensemble #InterSystems IRIS 0 1 0 98
文章 Jingwei Wang · 七月 14, 2022 阅读大约需 13 分钟 InterSystems SQL 的使用 - 第三部分 - 表 创建表 可以通过以下方式定义表: 通过DDL定义表 使用任意数据库管理工具执行DDL(使用ODBC,JDBC连接) MyApp.Person表可以使用DDL CREATE TABLE语句来定义,指定SQL schema.table名称。成功执行这个SQL语句会生成一个相应的持久化类,包名MyApp,类名Person。当使用DDL命令定义一个表时,你不需要指定USEEXTENTSET或创建一个位图范围索引。InterSystems SQL会自动应用这些设置,并将它们包含在预测的持久化类中。默认情况下,CREATE TABLE在相应的类定义中指定了Final类的关键字,表示它不能有子类。 #SQL #InterSystems IRIS for Health 0 0 0 242
文章 Jingwei Wang · 七月 14, 2022 阅读大约需 6 分钟 InterSystems SQL 的使用 - 第二部分 - 基础介绍 本文概述了InterSystems SQL的特点,特别是那些没有被SQL标准所涵盖或与InterSystems IRIS 数据平台的统一数据架构有关的特点。假定你已有SQL的知识,本文不是SQL概念或语法的介绍。 表 在InterSystems SQL中,数据是在表内呈现的。每个表都被定义为包含若干列。一个表可以包含零个或多个数据值的行。以下术语大致上是等同的。 #SQL #InterSystems IRIS for Health 0 0 0 339
文章 Jingwei Wang · 七月 14, 2022 阅读大约需 6 分钟 精华文章 InterSystems SQL 的使用 - 第一部分 - 架构及特性介绍 InterSystems SQL为存储在IRIS数据库中的数据提供不折不扣的、标准的关系型访问。 InterSystems SQL具有以下优点。 高性能和可扩展性 - InterSystems SQL的性能和可扩展性优于其他关系型数据库产品。 与IRIS对象技术的集成 - InterSystems SQL与IRIS对象技术紧密集成。你可以混合使用关系型和对象型的数据访问,而不牺牲任何一种方法的性能。 低维护 - 与其他关系型数据库不同,IRIS应用程序不需要在部署的应用程序中重建索引和压缩表。 支持标准SQL查询 - InterSystems SQL支持SQL-92标准语法和命令。 #SQL #InterSystems IRIS for Health 0 0 0 208
文章 姚 鑫 · 七月 13, 2022 阅读大约需 3 分钟 第四章 使用嵌入式 Python(一) 第四章 使用嵌入式 Python (一) 嵌入式 Python 允许使用 Python 作为编程 IRIS 应用程序的本机选项。 预备知识 使用嵌入式 Python 所需的 Python 版本取决于运行的平台。 在 Microsoft Windows 上,IRIS 安装工具包安装正确版本的 Python(当前为 3.9.5),仅用于嵌入式 Python。如果在开发机器上并希望将 Python 用于一般用途,建议从 https://www.python.org/downloads/ 下载并安装相同的版本。 #SQL #Caché 0 0 0 151
文章 姚 鑫 · 七月 10, 2022 阅读大约需 5 分钟 第一章 嵌入式Python概述(一) 第一章 嵌入式Python概述(一) 嵌入式 Python 允许将 Python 与 IRIS 数据平台的本地编程语言 ObjectScript 一起使用。当使用嵌入式 Python 在 IRIS 类中编写方法时,Python 源代码与编译后的 ObjectScript 代码一起编译为在服务器上运行的目标代码。与使用网关或 Python的 Native SDK 相比,这允许更紧密的集成。还可以导入 Python 包,无论它们是自定义的还是公开的,并在ObjectScript 代码中使用它们。 Python 对象是 ObjectScript 中的一等公民,反之亦然。 #SQL #Caché 0 0 0 187
文章 姚 鑫 · 七月 8, 2022 阅读大约需 2 分钟 第二十二章 安全自定义 Web 应用程序登录 第二十二章 安全自定义 Web 应用程序登录 除了推荐的 REST 应用程序支持之外,产品还支持两种类型的传统 Web 应用程序:CSP 和 Zen。在配置使用 CSP 和 Zen 的自定义登录页面时,遵循推荐的协议很重要。这些协议提供了更高的安全性,并最大限度地减少了升级到新产品或版本时的不兼容性。 关于创建自定义 CSP 登录页面 创建自定义 CSP 登录页面: #SQL #Caché 0 0 0 69
文章 姚 鑫 · 七月 7, 2022 阅读大约需 4 分钟 第二十一章 使用工作队列管理器(四) 第二十一章 使用工作队列管理器(四) 分离和附加工作队列 通常,初始化一组工作程序,将工作项排队,然后等待工作程序完成工作项。但是,可能会遇到工作人员作业完成工作项所需的时间比预期更长的情况,或者无法将单个进程专门用于等待。因此,工作队列管理器使能够将工作队列与进程分离,然后将工作队列附加到同一进程或不同的进程。 例如,假设队列引用了初始化的工作队列。还假设向工作队列中添加了几个工作项。在调用 Wait() 或 WaitForComplete() 来确定正在处理的工作的状态之前,可以使用以下方法: Detach() method Detach(ByRef token As %String, timeout As %Integer=86400) as Status 从初始化工作队列时创建的对象引用中分离工作队列对象。 Detach() 方法使任何正在进行的工作能够继续并保留工作队列的当前状态。 token 参数表示一个安全令牌,可以使用它随后将工作队列附加到另一个进程。 timeout 参数是可选的,它指示系统保留分离的工作队列对象的时间量(以秒为单位)。超时期限过后,系统会删除与工作队列关联的所有工作人员作业和信息。超时的默认值为 1 天。 #SQL #Caché 0 0 0 68
文章 姚 鑫 · 七月 6, 2022 阅读大约需 4 分钟 第二十章 使用工作队列管理器(三) 第二十章 使用工作队列管理器(三) 管理类别 一个类别是一个独立的worker jobs池。当初始化一组worker jobs时,可以指定提供worker的类别。如果集合中的任何worker jobs在执行work项时请求额外的worker jobs,则新的worker jobs来自同一类别。 例如,假设系统提供的 SQL 类别分配了最多 8 个worker。然后,假设与BusinessIntelligence相关的流程创建了一个类别,并将最多四个worker分配给该类别。如果 SQL 池中的所有worker在给定时间都参与了工作,则 BusinessIntelligence 类别中的worker可能仍然可以立即处理工作项。 系统包括两个不能删除的类别:SQL 和 Default。 SQL 类别适用于系统执行的任何 SQL 处理,包括查询的并行处理。当在未指定类别的情况下初始化一组worker jobs时,默认类别提worker jobs。 每个类别都具有影响该类别中每个工作队列的行为的属性。这些属性是: #SQL #Caché 0 0 0 74
文章 姚 鑫 · 七月 5, 2022 阅读大约需 5 分钟 第十九章 使用工作队列管理器(二) 第十九章 使用工作队列管理器(二) 基本工作流程 可以通过执行以下步骤来使用工作队列管理器: 将ObjectScript 代码划分为工作单元,这些工作单元是满足特定要求的类方法或子例程。 创建一个工作队列,它是 %SYSTEM.WorkMgr 类的一个实例。为此,请调用 %SYSTEM.WorkMgr 类的 %New() 方法。该方法返回一个工作队列。 可以指定要使用的并行worker jobs的数量,也可以使用默认值,这取决于机器和操作系统。此外,如果已创建类别,则可以指定应从中获取job的类别。 创建工作队列时,工作队列管理器会创建以下工件: - 包含有关工作队列的信息的全局变量,例如工作队列在哪个命名空间中运行 - 工作队列必须处理的序列化工作单元的位置和事件队列 - 在工作队列完成处理工作单元时创建的完成事件的位置和事件队列 #SQL #Caché 0 0 0 69
文章 姚 鑫 · 七月 4, 2022 阅读大约需 7 分钟 第十八章 使用工作队列管理器(一) 第十八章 使用工作队列管理器(一) 工作队列管理器是的一项功能,使能够通过以编程方式将工作分配给多个并发进程来提高性能。在引入工作队列管理器之前,可能已经使用 JOB 命令在应用程序中启动多个进程并使用自定义代码管理这些进程(以及任何导致的故障)。工作队列管理器提供了一个高效且直接的 API,使能够卸载流程管理。 代码在多个地方内部使用工作队列管理器。可以将它用于自己的需求,如以下部分中的高级描述。 背景 计算机硬件开发的最新创新趋向于高性能、多处理器或多核架构。与此同时,内存和网络设备的速度也只是慢慢地提高了。 开发了工作队列管理器以响应这些趋势并根据以下原则: #SQL #Caché 0 0 0 79
文章 姚 鑫 · 七月 3, 2022 阅读大约需 5 分钟 第十七章 进程内存 第十七章 进程内存 介绍 进程使用许多不同的资源来实现其目标。其中包括部分或全部 CPU 周期、内存、外部存储、网络带宽等。这篇文章是关于内存使用的。具体来说,它处理为数据存储分配的内存,例如: - 公共和私有变量 当第一次为它们分配值时,它们被分配了内存空间。在局部数组的情况下,局部变量名称加上所有下标的值的组合引用单个变量值。 除了包含极长字符串的变量外,变量会占用与 $STORAGE 相关的空间。包含极长字符串的变量以不同方式存储,并且不占用 $STORAGE 中的空间。 对象实例 每当实例化一个对象时,都会分配空间来保存对象的当前内容以及它所引用的对象。删除最后一个对象引用时返回该空间。 本地 I/O 缓冲区 将与该进程正在使用的设备相关联的 I/O 缓冲区存储在进程空间中。 #SQL #Caché 0 0 0 77
文章 姚 鑫 · 七月 2, 2022 阅读大约需 5 分钟 第十六章 字符串本地化和消息字典(二) 第十六章 字符串本地化和消息字典(二) XML 消息文件 XML 消息文件是消息字典的导出。这也是希望导入的任何消息的必需格式。 只要有可能,XML 消息文件应该使用 UTF-8 编码。但是,在某些情况下,开发人员或翻译人员可能会使用本地平台编码,例如 shift-jis,以便于编辑 XML 消息文件。无论 XML 文件使用何种编码,应用程序的语言环境都必须支持它,并且它必须能够表达该语言的消息。 XML 消息文件可能包含一种语言和多个域的消息。 Element <MsgFile> 元素是 XML 消息文件的顶级容器,每个文件只有一个 <MsgFile>元素。 #SQL #Caché 0 0 0 54
文章 Michael Lei · 七月 2, 2022 阅读大约需 4 分钟 使用嵌入式 python 访问管理门户仪表盘并在网页上显示 cache 表数据 Hi 社区, 在这篇文章中,我将解释如何通过使用嵌入式python访问管理门户系统的仪表盘信息和表数据。 ##嵌入式 Python #SQL #管理门户 #InterSystems IRIS for Health 0 0 0 170
文章 姚 鑫 · 七月 1, 2022 阅读大约需 4 分钟 第十五章 字符串本地化和消息字典(一) 第十五章 字符串本地化和消息字典(一) 本文概述了字符串本地化,并描述了如何导出、导入和管理消息字典。 字符串本地化 当本地化应用程序的文本时,会创建一种语言的文本字符串清单,然后当应用程序区域设置不同时,建立约定以另一种语言替换这些消息的翻译版本。 支持以下本地化字符串的过程: 开发人员在他们的代码中包含可本地化的字符串(在REST 应用程序或商业智能模型中)。 这种机制各不相同,但最常见的机制是 $$$Text 宏。代替硬编码的文字字符串,开发人员包含 $$$Text 宏的实例,为宏参数提供如下值: 默认字符串 此字符串所属的域(将字符串分组为域时,本地化更易于管理) 默认字符串的语言代码 write "Hello world" 替换为 #SQL #Caché 0 0 0 93
文章 姚 鑫 · 六月 30, 2022 阅读大约需 2 分钟 第十四章 信号(四)- 多进程任务示例 第十四章 信号(四)- 多进程任务示例 可根据此思想进行多任务启动查询汇总数据。 原理 利用job机制开启后台进程。 利用loop循环减少进程的数量等于开启进程的数量,判断多进程任务是否完成。 创建表并插入1000W条数据,统计Moeny字段总金额 创建demo代码如下。 #SQL #Caché 0 0 0 65
文章 姚 鑫 · 六月 29, 2022 阅读大约需 10 分钟 第十三章 信号(三)- 示例演示 第十三章 信号(三)- 示例演示 运行示例 Main、Producer 和 Consumer 这三个类中的每一个都有自己的 Run 方法,最好在各自的终端窗口中运行它们。每次运行时,它都会显示它为日志生成的消息。一旦用户通过提供它正在等待的输入来响应 Main 类,Main 的 Run 方法将终止删除信号量。然后,用户可以通过键入命令查看所有进程的合并日志文件的显示 Do ##class(Semaphore.Util).ShowLog() 注意:以下所有示例都假定所有类都已在“USER”命名空间中编译。 示例 1 - 创建和删除信号量 最简单的例子演示了信号量的创建和销毁。它使用 Semaphore.Main 类。请执行下列操作: #SQL #Caché 0 0 0 65
文章 姚 鑫 · 六月 27, 2022 阅读大约需 7 分钟 第十二章 信号(二)- 生产者消费者示例 第十二章 信号(二)- 生产者消费者示例 下面是一系列使用信号量实现生产者/消费者场景的类。 “主”进程初始化信号量并等待用户指示活动已全部完成。生产者在循环中随机增加一个信号量值,更新之间的延迟可变。消费者尝试在随机时间从信号量中删除随机数量,也是在循环中。该示例由 5 个类组成: - Main – 初始化环境并等待信号量上的活动完成的类。 - Counter – 实现信号量本身的类。它记录它的创建以及由于信号量在等待列表中而发生的任何回调。 - Producer – 一个类,其主要方法增加信号量值。增量是一个随机选择的小整数。完成增量后,该方法会在下一个增量之前延迟一小段随机数秒。 - Consumer 消费者——这是对生产者的补充。此类的主要方法尝试将信号量减少一个随机选择的小整数。它将递减请求添加到其等待列表中,等待时间也是随机选择的秒数。 - Util - 这个类有几个方法被示例的其他类使用。几种方法解决了为所有活动维护公共日志的问题;其他人解决了多个消费者和多个生产者的命名问题。 #SQL #Caché 0 0 0 58
文章 姚 鑫 · 六月 26, 2022 阅读大约需 7 分钟 第十一章 信号(一)- 概念 第十一章 信号(一) - 概念 背景 维基百科对信号量有这样的定义:“在计算机科学中,特别是在操作系统中,信号量是一种变量或抽象数据类型,用于控制多个进程在并行编程或多用户环境中对公共资源的访问。”信号量不同于互斥体(或锁)。互斥锁最常用于管理竞争进程对单个资源的访问。当一个资源有多个相同的副本并且这些副本中的每一个都可以由单独的进程同时使用时,就会使用信号量。 考虑一个办公用品商店。它可能有几台复印机供其客户使用,但每台复印机一次只能由一个客户使用。为了控制这一点,有一组键可以启用机器并记录使用情况。当客户想要复印文件时,他们向职员索取钥匙,使用机器,然后归还钥匙,并支付使用费。如果所有机器都在使用,客户必须等到钥匙归还。保存键的位置用作信号量。 该示例可以进一步推广到包括不同类型的复印机,也许可以通过它们可以制作的副本的大小来区分。在这种情况下,将有多个信号量,如果复制者在复制的大小上有任何重叠,那么希望复制共同大小的客户将有两个资源可供提取。 #SQL #Caché 0 0 0 97
文章 姚 鑫 · 六月 25, 2022 阅读大约需 2 分钟 第十章 设置结构化日志记录(二) 第十章 设置结构化日志记录(二) 注:IRIS有,Cache无。 启用结构化日志记录 ^LOGDMN 例程允许管理结构化日志记录;还有一个基于类的 API,将在下一节中介绍。 要使用 ^LOGDMN 启用结构化日志记录: 打开终端并输入以下命令: set $namespace="%sys" do ^LOGDMN 这将启动一个带有以下提示的例程: #SQL #Caché 0 0 0 58
文章 姚 鑫 · 六月 24, 2022 阅读大约需 4 分钟 第九章 设置结构化日志记录(一) 第九章 设置结构化日志记录(一) IRIS 支持结构化日志记录。 创建多个日志,每个日志用于不同的目的。从以前的产品迁移过来的客户可以像过去一样利用这些日志,但现在还可以将所有日志信息导入一个单一的、中央的、机器可读的日志文件——结构化日志。然后可以将此文件与第三方分析工具一起使用。 本文概述了结构化日志中的信息,展示了日志示例,并描述了如何启用结构化日志记录。 结构化日志中可用的信息 当启用结构化日志记录时,系统会将相同的数据写入结构化日志,它也会写入其他日志(无论哪个)。例如,系统将相同的行写入messages.log 和结构化日志。 启用结构化日志记录后,结构化日志包含以下所有信息: #SQL #Caché 0 0 0 78
文章 姚 鑫 · 六月 23, 2022 阅读大约需 3 分钟 第八章 操作位和位串(四) 第八章 操作位和位串(四) 操作以整数形式实现的位串 设置位 要创建一个存储为整数的新位串,请对每个位求和 2 的幂: set bitint = (2**2) + (2**5) + (2**10) write bitint 1060 要将现有位串中的位设置为 1,请使用 $zboolean 函数(逻辑 OR)的选项7 (arg1 ! arg2): set bitint = $zboolean(bitint, 2**4, 7) write bitint 1076 要将现有位串中的位设置为 0,请使用 $zboolean 函数的选项 2 (arg1 & ~arg2): #SQL #Caché 0 0 0 79
文章 姚 鑫 · 六月 22, 2022 阅读大约需 4 分钟 第七章 操作位和位串(三) 第七章 操作位和位串(三) 操作位串 要创建新的位串,请使用 $bit 函数将所需位设置为 1: kill bitstring set $bit(bitstring, 3) = 1 set $bit(bitstring, 6) = 1 set $bit(bitstring, 11) = 1 使用 $bit 将现有位串中的位设置为 1: set $bit(bitstring, 5) = 1 使用 $bit 将现有位串中的位设置为 0: set $bit(bitstring, 5) = 0 由于位串中的第一位是位 1,因此尝试设置位 0 会返回错误: #SQL #Caché 0 0 0 50
文章 姚 鑫 · 六月 21, 2022 阅读大约需 3 分钟 第六章 操作位和位串(二) 第六章 操作位和位串(二) 将位序列存储为整数 如果要将一系列布尔参数传递给方法,一种常见的方法是将它们作为编码为单个整数的位序列传递。 例如,Security.System.ExportAll() 方法用于从 IRIS 实例中导出安全设置。如果查看此方法的类引用,将看到它的定义如下: classmethod ExportAll(FileName As %String = "SecurityExport.xml", ByRef NumExported As %String, Flags As %Integer = -1) as %Status 第三个参数 Flags 是一个整数,其中每个位代表一种可以导出的安全记录。 #SQL #Caché 0 0 0 81
文章 姚 鑫 · 六月 20, 2022 阅读大约需 4 分钟 第五章 操作位和位串 第五章 操作位和位串 有时可能希望在基于数据平台的应用程序中存储一系列相关的布尔值。可以创建许多布尔变量,也可以将它们存储在数组或列表中。或者可以使用称为“位串”的概念,它可以定义为位序列,首先呈现最低有效位。位串允许您以非常有效的方式存储此类数据,无论是在存储空间还是处理速度方面。 位串可以以两种方式之一存储,作为压缩字符串或整数。如果在没有上下文的情况下听到术语“位串”,则表示位序列存储为压缩字符串。本文向介绍了这两种类型的位串,然后介绍了一些可用于操作它们的技术。 将位序列存储为位串 存储位序列的最常见方式是在位串中,这是一种特殊的压缩字符串。除了节省存储空间外,还可以使用 ObjectScript 系统函数有效地操作位串。 这样的系统函数是 $factor,它将整数转换为位串。我们可以通过执行以下语句将整数 11744 转换为位串: set bitstring = $factor(11744) 要查看位串内容的表示,可以使用 zwrite 命令: #SQL #Caché 0 0 0 77
文章 姚 鑫 · 六月 19, 2022 阅读大约需 3 分钟 第四章 锁定和并发控制(四) 第四章 锁定和并发控制(四) 避免死锁 增量锁定具有潜在危险,因为它可能导致称为死锁的情况。当两个进程各自对已被另一个进程锁定的变量断言增量锁定时,就会出现这种情况。因为尝试的锁是增量的,所以现有的锁不会被释放。结果,每个进程在等待另一个进程释放现有锁的同时挂起。 举个例子: 进程 A 发出此命令:lock + ^MyGlobal(15) 进程 B 发出此命令:lock + ^MyOtherGlobal(15) 进程 A 发出此命令:lock + ^MyOtherGlobal(15) 此 LOCK 命令不返回;进程被阻塞,直到进程 B 释放这个锁。 #SQL #Caché 0 0 0 107