搜索​​​​

清除过滤器
文章
姚 鑫 · 六月 7, 2022

第二章 数据类型(一)

# 第二章 数据类型(一) 指定 SQL 实体(如列)可以包含的数据类型。 # 描述 此处描述了以下主题: - 支持的 `DDL` 数据类型及其类属性映射表 - 数据类型优先级用于从具有不同数据类型的数据值中选择最具包容性的数据类型 - 日期、时间、PosixTime 和时间戳数据类型 - 使用SqlCategory和用户定义的标准 - 对 1840 年 12 月 31 日之前的日期的可配置支持 - 支持字符串数据类型、列表数据类型和流数据类型 - 支持 `ROWVERSION` 数据类型 - IRIS® 数据平台 ODBC / JDBC 公开的数据类型 - 使用查询元数据方法和数据类型整数代码确定列的数据类型 - 创建用户定义的数据类型 - 处理未定义的数据类型 - 数据类型转换函数 数据类型指定列可以保存的值的种类。在使用 `CREATE TABLE` 或 `ALTER TABLE` 定义字段时指定数据类型。定义 `SQL` 字段时,可以指定下表(左列)中列出的 `DDL` 数据类型。当指定其中一种 `DDL` 数据类型时,它会映射到右侧列中列出的IRIS 数据类型类。在IRIS 中定义字段时,可以指定 `DDL` 数据类型或数据类型类。 `DDL` 数据类型名称不区分大小写。数据类型类名称区分大小写。 `%Library` 数据类型类可以通过全名(例如,`%Library.String`)或短名(`%String`)来指定。 它们映射到的 `DDL` 数据类型和数据类型类通常提供不同的参数和参数默认值。数据类型类通常提供比 `DDL` 数据类型更多的参数来定义允许的数据值。 要查看当前系统数据类型映射,请转到管理门户,选择系统管理、配置、SQL 和对象设置、系统 DDL 映射。 ![image](B110835562E847B8BD0AF148FA8090E4) 还可以定义其他用户数据类型。要创建或查看用户数据类型映射,请转到管理门户,选择系统管理、配置、SQL 和对象设置、用户 `DDL` 映射。 # DDL 数据类型表 DDL Data Type | Corresponding IRIS Data Type Class ---|--- `BIGINT` |`%Library.BigInt (MAXVAL=9223372036854775807, MINVAL=-9223372036854775807)`如果 `BIGINT` 列可以同时包含 `NULL` 和极小的负数,需要重新定义索引空标记以支持标准索引排序规则。 `BIGINT(%1)` |`%Library.BigInt %1` 被忽略。相当于 `BIGINT`。提供 MySQL 兼容性。 `BINARY`| `%Library.Binary(MAXLEN=1)` `BINARY(%1)`| `%Library.Binary(MAXLEN=%1)` `BINARY VARYING` |`%Library.Binary(MAXLEN=1)` `BINARY VARYING(%1)` |`%Library.Binary(MAXLEN=%1)` `BIT`| `%Library.Boolean` . `CHAR`| `%Library.String(MAXLEN=1)` `CHAR(%1)`| `%Library.String(MAXLEN=%1)` `CHAR VARYING`| `%Library.String(MAXLEN=1)` `CHAR VARYING(%1)`| `%Library.String(MAXLEN=%1)` `CHARACTER`| `%Library.String(MAXLEN=1)` `CHARACTER VARYING`| `%Library.String(MAXLEN=1)` `CHARACTER VARYING(%1)`| `%Library.String(MAXLEN=%1)` `CHARACTER(%1)` |`%Library.String(MAXLEN=%1)` `DATE`| `%Library.Date` `DATETIME`| `%Library.DateTime` `DATETIME2`| `%Library.DateTime` `DEC` |`%Library.Numeric MAXVAL=999999999999999, MINVAL=-999999999999999`, `SCALE=0`. `DEC(%1)`|`%Library.Numeric` 一个 64 位有符号整数。如果 `%1` 小于 `19`,则 `MAXVAL` 和 `MINVAL` 是 `%1` 位数。例如,`DEC(8) MAXVAL=99999999,MINVAL=-99999999,SCALE=0`。 `%1` 的最大有意义值是 `19`; `%1` 值大于 `19` 不会产生错误,但默认为 `19`。如果 `%1` 为 `19` 或更大:MAXVAL=9223372036854775807,MINVAL=-9223372036854775808,SCALE=0。 DEC(%1,%2)| `%Library.Numeric` (`MAXVAL=, MINVAL=, SCALE=%2`) DECIMAL| `%Library.Numeric MAXVAL=999999999999999`, `MINVAL=-999999999999999`, SCALE=0. DECIMAL(%1)|%Library.Numeric 一个 64 位有符号整数。如果 %1 小于 19,则 MAXVAL 和 MINVAL 是 %1 位数。例如,DECIMAL(8) MAXVAL=99999999,MINVAL=-99999999,SCALE=0。 %1 的最大有意义值是 19; %1 值大于 19 不会产生错误,但默认为 19。如果 %1 为 19 或更大:MAXVAL=9223372036854775807,MINVAL=-9223372036854775808,SCALE=0。 DECIMAL(%1,%2) | `%Library.Numeric` (`MAXVAL=, MINVAL=, SCALE=%2`) DOUBLE |%Library.Double 这是 IEEE 浮点标准。具有此数据类型的 SQL 列返回的默认精度为 20。 DOUBLE PRECISION|%Library.Double 这是 IEEE 浮点标准。具有此数据类型的 SQL 列返回的默认精度为 20。 FLOAT|已弃用 — %Library.Double 这是 IEEE 浮点标准。具有此数据类型的 SQL 列返回的默认精度为 20。 FLOAT(%1) 已弃用 — %Library.Double 这是 IEEE 浮点标准。具有此数据类型的 SQL 列返回的默认精度为 20。 IMAGE| %Stream.GlobalBinary INT |%Library.Integer (MAXVAL=2147483647, MINVAL=-2147483648) INT(%1) |%Library.Integer (MAXVAL=2147483647, MINVAL=-2147483648)。 %1 被忽略。相当于 INT。提供 MySQL 兼容性。 INTEGER| %Library.Integer (MAXVAL=2147483647, MINVAL=-2147483648) LONG| %Stream.GlobalCharacter LONG BINARY| %Stream.GlobalBinary LONG RAW| %Stream.GlobalBinary LONGTEXT|%Stream.GlobalCharacter 等效于 LONG。提供 MySQL 兼容性。 LONG VARCHAR| %Stream.GlobalCharacter LONG VARCHAR(%1)| %Stream.GlobalCharacter The %1 is ignored. LONGVARBINARY |%Stream.GlobalBinary LONGVARBINARY(%1)| %Stream.GlobalBinary The %1 is ignored. LONGVARCHAR| %Stream.GlobalCharacter LONGVARCHAR(%1)| %Stream.GlobalCharacter The %1 is ignored. MEDIUMINT |%Library.Integer(MAXVAL=8388607,MINVAL=-8388608) 提供 MySQL 兼容性。 MEDIUMINT(%1)| %Library.Integer(MAXVAL=8388607,MINVAL=-8388608) %1 被忽略。提供 MySQL 兼容性。 MEDIUMTEXT| %Stream.GlobalCharacter MONEY| %Library.Currency(MAXVAL=922337203685477.5807, MINVAL=-922337203685477.5808, SCALE=4) NATIONAL CHAR| %Library.String(MAXLEN=1) NATIONAL CHAR(%1)| %Library.String(MAXLEN=%1) NATIONAL CHAR VARYING| %Library.String(MAXLEN=1) NATIONAL CHAR VARYING(%1)|%Library.String(MAXLEN=%1) NATIONAL CHARACTER| %Library.String(MAXLEN=1) NATIONAL CHARACTER(%1)| %Library.String(MAXLEN=%1) NATIONAL CHARACTER VARYING|%Library.String(MAXLEN=1) NATIONAL CHARACTER VARYING(%1)|%Library.String(MAXLEN=%1) NATIONAL VARCHAR| %Library.String(MAXLEN=1) NATIONAL VARCHAR(%1)| %Library.String(MAXLEN=%1) NCHAR| %Library.String(MAXLEN=1) NCHAR(%1)| %Library.String(MAXLEN=%1) NTEXT| %Stream.GlobalCharacter NUMBER|%Library.Numeric 一个 64 位有符号整数。 (MAXVAL=9223372036854775807, MINVAL=-9223372036854775808, SCALE=0) NUMBER(%1)|%Library.Numeric 一个 64 位有符号整数。如果 %1 小于 19,则 MAXVAL 和 MINVAL 是 %1 位数。例如,NUMBER(8) MAXVAL=99999999,MINVAL=-99999999,SCALE=0。 %1 的最大有意义值是 19; %1 值大于 19 不会产生错误,但默认为 19。如果 %1 为 19 或更大:MAXVAL=9223372036854775807,MINVAL=-9223372036854775808,SCALE=0。 NUMBER(%1,%2)| `%Library.Numeric` (`MAXVAL=, MINVAL=, SCALE=%2`) NUMERIC| %Library.Numeric MAXVAL=999999999999999, MINVAL=-999999999999999, SCALE=0. NUMERIC(%1)|%Library.Numeric 一个 64 位有符号整数。如果 %1 小于 19,则 MAXVAL 和 MINVAL 是 %1 位数。例如,NUMERIC(8) MAXVAL=99999999,MINVAL=-99999999,SCALE=0。 %1 的最大有意义值是 19; %1 值大于 19 不会产生错误,但默认为 19。如果 %1 为 19 或更大:MAXVAL=9223372036854775807,MINVAL=-9223372036854775808,SCALE=0。 NUMERIC(%1,%2)| `%Library.Numeric` (`MAXVAL=, MINVAL=, SCALE=%2`) NVARCHAR| %Library.String(MAXLEN=1) NVARCHAR(%1)| %Library.String(MAXLEN=%1) NVARCHAR(%1,%2) |%Library.String(MAXLEN=%1) NVARCHAR(MAX)| %Stream.GlobalCharacter 等效于 LONGVARCHAR。提供 TSQL 兼容性。 POSIXTIME| %Library.PosixTime MAXVAL=1406323805406846975, MINVAL=-6979664624441081856, SCALE=0. RAW(%1)|%Library.Binary(MAXLEN=%1) REAL 已弃用 — %Library.Double 这是 IEEE 浮点标准。具有此数据类型的 SQL 列返回的默认精度为 20。 ROWVERSION |%Library.RowVersion(MAXVAL=9223372036854775807, MINVAL=1) 系统分配的顺序整数。 SERIAL| %Library.Counter System-generated: (MAXVAL=9223372036854775807, MINVAL=1). User-supplied: (MAXVAL=9223372036854775807, MINVAL=-9223372036854775807) SMALLDATETIME| %Library.DateTime MAXVAL=’2079-06-06 23:59:59’; MINVAL=’1900-01-01 00:00:00’) SMALLINT| %Library.SmallInt (MAXVAL=32767, MINVAL=-32768) SMALLINT(%1) |%Library.SmallInt %1 被忽略。相当于 SMALLINT。提供 MySQL 兼容性。 SMALLMONEY| %Library.Currency SCALE=4 SYSNAME| %Library.String(MAXLEN=128) TEXT| %Stream.GlobalCharacter TIME| %Library.Time TIME(%1)| %Library.Time(精度=%1)。 PRECISION 是小数秒位数,一个介于 0 到 9 之间的整数值。 TIMESTAMP| %Library.PosixTime TIMESTAMP2 |%Library.TimeStamp TINYINT| %Library.TinyInt (MAXVAL=127, MINVAL=-128) TINYINT(%1) |%Library.TinyInt %1 被忽略。相当于 TINYINT。提供 MySQL 兼容性。 UNIQUEIDENTIFIER)| %Library.UniqueIdentifier VARBINARY)| %Library.Binary(MAXLEN=1) VARBINARY(%1))| %Library.Binary(MAXLEN=%1) VARCHAR )|%Library.String(MAXLEN=1) VARCHAR(%1) )|%Library.String(MAXLEN=%1) VARCHAR(%1,%2))| %Library.String(MAXLEN=%1) VARCHAR2(%1))| %Library.String(MAXLEN=%1) VARCHAR(MAX))|%Stream.GlobalCharacter 等效于 LONGVARCHAR。仅提供 TSQL 兼容性。 重要提示:上面显示的每个 DDL 或 IRIS 数据类型表达式实际上都是一个连续的字符串。这些字符串可能包含空格字符,但通常不包含任何类型的空格。为了便于阅读,此表中出现了一些空白。 # 指定 MAXLEN - 无 `MAXLEN`:没有 `MAXLEN` 值的字段可以取任意长度的值,最多为最大字符串长度。要定义最大长度的字符串字段,请指定 `VARCHAR('')`,这将创建数据类型为 `%Library.String(MAXLEN="")` 的属性。 `VARCHAR()` 创建数据类型为 `%Library.String(MAXLEN=1)` 的属性。要定义没有 `MAXLEN` 值的二进制字段,请指定 `VARBINARY('')`,这将创建数据类型为 `%Library.Binary(MAXLEN="")` 的属性。 `VARBINARY()` 创建数据类型为 `%Library.Binary(MAXLEN=1)` 的属性。 - 大 `MAXLEN`:**具有大 `MAXLEN` 值的字段仅分配实际数据值所需的空间。指定 `%Library.String` 数据类型时,指定的 `MAXLEN` 值不必与数据的实际大小密切对应。如果字段值为`“ABC”`, 仅使用磁盘、全局缓冲区和私有进程内存中的那么多空间。即使使用 `MAXLEN=1000` 声明该字段,私有进程内存也不会为该字段分配那么多空间。 只为字段值的实际大小分配内存,而不管声明的长度如何。** 过大的 `MAXLEN` 值可能会影响 ODBC 应用程序。 ODBC 应用程序尝试根据来自服务器的元数据来决定所需字段的大小,因此应用程序可能会分配比实际需要更多的缓冲区空间。出于这个原因, 提供系统范围的默认 ODBC `VARCHAR` 最大长度 4096;此系统范围的默认设置可使用管理门户进行配置:从系统管理中选择配置,然后选择 SQL 和对象设置,然后选择 SQL。查看或设置 `VARCHAR` 选项的默认长度。要确定当前设置,请调用 `$SYSTEM.SQL.CurrentSettings()`。 ODBC 驱动程序从 TCP 缓冲区获取数据并将其转换为应用程序缓冲区,因此 `MAXLEN` 大小不会影响我们的 ODBC 客户端。 过大的 `MAXLEN` 值不应影响 JDBC 应用程序。 Java 和 .Net 没有应用程序分配缓冲区。客户端仅分配将数据保存为本机类型所需的内容。 # 精确度和范围 `NUMERIC(6,2)` 等数值数据类型具有两个整数值 (p,s) 精度和小数位数。这些映射到 `ObjectScript %Library` 类数据类型。在 SQL 数据类型中指定时,以下内容适用于 `Windows` 系统(最大值在其他系统上可能不同): - `Precision` 精度:`0` 到 `19+s`(含)之间的整数。该值确定最大和最小允许值。这通常是数字中的总位数;但是,其确切值由 `%Library` 类数据类型映射决定。最大整数值为 `9223372036854775807`。大于 `19+s` 的精度默认为 `19+s`。 - Scale:一个整数,指定允许的最大十进制(小数)位数。可以是正整数、0 或负整数。如果 s 大于或等于 `p`,则只允许小数,实际 `p` 值被忽略。允许的最大比例为 18,对应于 `0.999999999999999999`。大于 `18` 的比例默认为 18。 以下示例显示了精度和比例的不同组合的最大值: ```java ClassMethod PrecisionScale() { for i = 0 : 1 : 6 { w "Max for (",i,",2)=",$$maxval^%apiSQL(i,2),! } } ``` ```java DHC-APP>d ##class(PHA.TEST.SQLFunction).PrecisionScale() Max for (0,2)=.99 Max for (1,2)=.99 Max for (2,2)=.99 Max for (3,2)=9.99 Max for (4,2)=99.99 Max for (5,2)=999.99 Max for (6,2)=9999.99 ```
文章
Lilian Huang · 七月 13, 2022

用 Python 的 Native API 调用类方法

InterSystems Native SDK for Python是 InterSystems IRIS APIs 的轻量级接口,曾经只能通过 ObjectScript 使用。 准确地说,我对调用 ObjectScript 方法、类方法的能力特别感兴趣。 它可以工作,而且效果很好,但默认情况下,调用只支持标量参数:字符串、布尔值、整数和浮点数。 但如果你想: - 传递或返回结构,例如字典或列表 - 传递或返回流 您需要编写一些粘合代码或使用这个project (使用 pip install edpy 安装)。 edpy 包会给你一个简单的签名: call(iris, class_name, method_name, args) 它允许您调用任何 ObjectScript 方法并返回结果。 像这样导入它: from edpy import iris call accepts 4 required arguments:- iris - a reference to an established IRIS object- class_name - IRIS class to call- method_name - IRIS method to call- args - list of 0 or more arguments 参数 每个参数可以是以下其中之一: string字符串(任意长度,如果大于 $$$MaxStringLength或 3641144 个符号,则会自动转换为流 boolean布尔值 integer整数 float 浮动 dict字典(转换为动态对象) list or tuple列表或元组(转换为动态数组) 字典、列表和元组参数可以递归地包含其他字典、列表和元组(持续性内存)。 返回值 在返回值,我们期望是动态对象/数组或 JSON 字符串/流。 在这种情况下,edpy 会首先将其转换为 Python 字符串,并在可能的情况下将其解释为 Python 字典或列表。 否则,结果将按原样返回给调用者。 就是这样,但让我给你一些 ObjectScript 方法的例子,以及如何使用这个 Python 函数调用它们。 示例1: Pong ClassMethod Test(arg1, arg2, arg3) As %DynamicArray{ return [(arg1), (arg2), (arg3)]} 调为: >>> iris.call(iris_native, "User.Py", "Test", [1, 1.2, "ABC"])[1, 1.2, 'ABC'] 这里没有惊喜。 参数被打包回一个数组并返回给调用者。 示例 2: 属性 ClassMethod Test2(arg As %DynamicObject) As %String{ return arg.Prop} 像这样调用: >>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":123}])123 现在进行更嵌入式的调用: >>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":{"Prop2":123}}]) {'Prop2': 123} 如果属性太长也没关系 - 流将用于将其发送到 IRIS 和/或返回: ret = iris.call(iris_native, "User.Py", "Test2", [{"Prop":"A" * 10000000}]) >>> len(ret) 10000000 如果您需要保证InterSystems IRIS 端的流,您可以使用%Get: set stream = arg.%Get("Prop",,"stream") 如果流是 base64 编码的,您可以使用以下命令自动对其进行解码: set stream = arg.%Get("Prop",,"stream<base64") 示例 3: 字符串或流 ClassMethod Test3(arg As %Stream.Object) As %String { set file = ##class(%Stream.FileCharacter).%New() set file.TranslateTable = "UTF8" set filename = ##class(%File).ManagerDirectory() _ "test.txt" do file.LinkToFile(filename) if $isObject(arg) { set sc = file.CopyFromAndSave(arg) } else { do file.Write(arg) set sc = file.%Save() } if $$$ISERR(sc) { set jsonret = {"status":0, "payload":($system.Status.GetErrorText(sc))} } else { set jsonret = {"status":1} } quit jsonret.%ToJSON() } 这里我们将字符串或流写入 <mgr>test.txt。 >>> iris.call(iris_native, "User.Py", "Test3", ["😊"]) {'status': 1} 注意:在所有代码示例中输入为“&# x1f642;“。 如果我打开文件,我会看到一个 😊 而不是两个 ?? - 所以我们保留编码。 >>> iris.call(iris_native, "User.Py", "Test3", ["🙂" * 10000000]) {'status': 1} 为简便起见,我将省略文件输出,但它就在那里。 最后,通过在内部传递一个动态对象或数组,您可以完全避免字符串/流二分法,即使您不知道该属性是比字符串限制短还是长。 在这种情况下,您始终可以像流一样获取可疑属性。 示例4: 返回流 ClassMethod Test4(arg As %DynamicArray) As %String { return arg.%Get(0) } 看起来是这样: >>> ret = iris.call(iris_native, "User.Py", "Test4", [["😊" * 10000000]]) >>> len(ret) 10000000 >>> ret[:5] '😊😊😊😊😊' 还有一件事 还有一个 get_iris(ip="localhost", port=1972, namespace="USER", username="_SYSTEM", password="SYS") 函数可以让您获得一个工作的 IRIS 对象。 所以这里有一个完整的例子,如果你想自己尝试一下: 首先加载 User.Py class 并安装 edpy python 库: pip install edpy 然后在python调用中: from edpy import iris iris_native = iris.get_iris() iris.call(iris_native, "User.Py", "Test", [1, 1.2, "ABC"]) iris.call(iris_native, "User.Py", "Test2", [{"Prop":123}]) iris.call(iris_native, "User.Py", "Test2", [{"Prop":{"Prop2":123}}]) ret2 = iris.call(iris_native, "User.Py", "Test2", [{"Prop":"A" * 10000000}]) iris.call(iris_native, "User.Py", "Test3", ["😊"]) iris.call(iris_native, "User.Py", "Test3", ["😊" * 10000000]) ret4 = iris.call(iris_native, "User.Py", "Test4", [["😊" * 10000000]]) 结论 适用于 Python 的 Native SDK 是一个强大的工具,为您提供对 InterSystems IRIS 的完整且不受限制的访问。 我希望这个项目可以为您节省一些时间来编组 InterSystems IRIS 调用。 是否有一些它不支持的方法参数组合? 如果是这样,请在评论中分享您是如何调用的。 链接: Native SDK Docs User.Py class Repo 原文请参考链接:https://community.intersystems.com/node/521336
文章
姚 鑫 · 八月 23, 2022

第十章 配置数据库(二)

# 第十章 配置数据库(二) # 本地数据库 “本地数据库”页面显示关于系统上的数据库的以下信息: - `Name`—数据库名称。 - `Mirror`——如果数据库是镜像的,则镜像的名称; - `Directory` - `IRIS.DAT` 文件的位置。 - `Size` 大小 (MB) — 以 `MB` 为单位的数据库大小。 - `Status` 状态 — 指定数据库是挂载、卸载还是卸载;如果已挂载,则指定它是否具有只读或读写权限。 - `Resource Name`资源名称 — 控制对数据库的访问的数据库资源的名称; - `Encrypted` — 指定数据库是否加密; - `Journal` 指定数据库是否被记录; ## 创建本地数据库 要创建本地数据库,请导航到本地数据库页面(系统管理 > 配置 > 系统配置 > 本地数据库)。 1. 单击创建新数据库以打开数据库向导。 2. 在文本框中输入数据库名称。数据库名称必须: - 尚未在 `IRIS` 实例中使用 - 长度在 `1` 到 `30` 个字符之间 - 以字母字符或下划线开头;其余部分可以包括字母数字字符、破折号或下划线 3. 首次使用特定浏览器在 `IRIS` 实例中创建本地数据库时,必须 - 输入数据库目录的名称,在这种情况下,包含 `IRIS.DAT` 文件的目录在确认后将在 `c:\InterSystems\mgr` 中创建 - 单击文件夹图标浏览到现有目录,在这种情况下,将在该目录中创建 `IRIS.DAT` 文件 此后,默认情况下,将在与先前数据库目录相同的位置创建一个与提供的数据库名称相同的目录,其中包含 `IRIS.DAT` 文件。例如,如果首先在 `c:\InterSystems\mgr` 下的任何目录中创建数据库 `db22`,当再次单击 `Create New Database` 并在 `Enter the name of your database` 框中输入 `db33` 时,`c:\InterSystems\mgr\db33` 会自动填写到数据库目录文本框中。如果将其更改为 `c:\InterSystems\db33` 并创建 `db33`,则下次将填充基本目录 `c:\InterSystems`。 注意:不支持在配置数据库目录时使用符号链接。 4. 单击下一步继续配置数据库。如果指定的目录中已经存在 `IRIS.DAT` 文件,会收到警告,并且可以 - 单击完成以使用现有文件,在这种情况下,所有数据库特征都由 `IRIS.DAT` 文件确定。您通常会在从另一个实例复制或移动数据库时执行此操作,或者在同一系统上临时挂载在另一个实例中创建的数据库时执行此操作。 - 单击 `Back` 指定另一个目录,然后再次单击 `Next` 以在下一步中继续指定新数据库的特征。 5. 在 `Initial Size` 文本框中,键入数据库大小的兆字节数(默认值为 `1 MB`)。 **注意:不能创建或编辑数据库,使其大小大于可用的总磁盘空间。如果指定的大小在磁盘可用空间的 `90%` 以内,会收到警告并且必须确认操作。** 6. 从 `Block size for this database will be` 下拉列表中选择所需的块大小。默认情况下,所有新数据库都使用 `8 KB` 的块大小创建。 注意:请勿从下拉列表中选择 `8 KB` 以外的块大小,除非已阅读并理解大块大小注意事项`/` 7. 从 `Journal globals` 中选择是否要在此数据库中记录全局变量`?`下拉列表。 注意:如果将数据库配置为存储临时全局变量,将 `Journal globals` 属性设置为 `No` 与将临时全局变量存储在 IRSTEMP 中是不同的。 8. 如果激活了加密,可以通过选择是加密数据库来加密这个数据库?。 9. 如果实例是镜像的一部分,可以通过为 `Mirrored Database?` 选择 `Yes` 来将此数据库添加到镜像中。 10. 从此面板开始,可以单击下一步。继续配置数据库或完成以接受剩余的默认值。 11. 选择资源来控制对该数据库的访问: - 默认值 — `%DB_%DEFAULT` - 现有 - 从现有数据库资源列表中选择 - 新建 — 创建新的数据库资源(新名称默认为 `%DB_%` 数据库名称) 12. 单击下一步查看数据库属性列表。 13. 单击完成以添加数据库。 现在已准备好配置和管理新数据库。 **注意:为防止意外损坏数据库,不能打开或写入名为 `IRIS.DAT` 的操作系统文件,即使它不是已安装的数据库。**
文章
姚 鑫 · 三月 6, 2021

第五章 SQL定义表(一)

# 第五章 SQL定义表 # 表名称和架构名称 可以通过定义表(使用`CREATE TABLE`)或通过定义投影到表的持久类来创建表: - DDL:InterSystemsIRIS®数据平台使用CREATE TABLE中指定的表名来生成相应的持久类名,并使用指定的架构名来生成相应的包名。 - 类定义:InterSystemsIRIS®数据平台使用持久类名称来生成对应的表名,并使用包名称来生成对应的模式名。 由于以下原因,这两个名字之间的对应关系可能不相同: - 持久化类和SQL表遵循不同的命名约定。 适用不同的有效字符和长度要求。 模式和表名不区分大小写; 包名和类名区分大小写。 系统自动将有效提供的名称转换为有效的对应名称,以确保生成的名称是惟一的。 - 持久化类名与对应的SQL表名之间的匹配是默认的。 可以使用`SqlTableName`类关键字来提供不同的SQL表名。 - **默认模式名可能与默认包名不匹配。 如果指定一个非限定的SQL表名或持久类名,系统将提供一个默认的模式名或包名。 初始的默认模式名是`SQLUser`; 初始默认包名为`“User”`。** # 模式名称 表、视图或存储过程名称可以是限定的(`schema.name`),也可以是限定的(`name`)。 - 如果指定模式名(限定名),则指定的表、视图或存储过程将被分配给该模式。 如果模式不存在,则InterSystems SQL创建模式,并将表、视图或存储过程分配给它。 - 如果没有指定模式名(非限定名),InterSystems SQL将使用默认模式名或模式搜索路径分配模式,如下所述。 ## 模式命名注意事项 模式名遵循标识符约定,需要特别注意非字母数字字符的使用。 模式名不应该指定为带分隔符的标识符。 **尝试指定“USER”或任何其他SQL保留字作为模式名会导致`SQLCODE -312`错误。** `INFORMATION_SCHEMA`模式名和相应的信息。 模式包名在所有命名空间中保留。 用户不应该在这个模式/包中创建表/类。 当执行一个创建操作(比如`create TABLE`),指定一个还不存在的模式时,InterSystems IRIS将创建新的模式。 InterSystems IRIS使用模式名生成相应的包名。 由于模式及其对应包的命名约定不同,用户应该注意非字母数字字符的名称转换注意事项。 这些名称转换的注意事项与表不同: - 初始字符: - `%` (percent):指定%作为模式名的第一个字符,表示相应的包为系统包,其所有类为系统类。 这种用法需要适当的权限; 否则,这种用法会发出一个`SQLCODE -400`错误,`%msg`表示``错误。 - **`_`(下划线):如果模式名的第一个字符为下划线,则该字符将被对应包名中的小写`“u”`替换。 例如,模式名`_MySchema`生成名为`uMySchema`的包。** - 后续的字符: - **`_`(下划线):如果模式名第一个字符以外的其他字符是下划线,则该字符将被对应包名中的句点(`.`)替换。 由于句点是类的分隔符,下划线将模式分为包和子包。 因此,`My_Schema`生成包含包模式(`My.Schema`)的包My。** - **`@`, `#`, `$` characters:如果模式名包含任何这些字符,这些字符将从相应的包名中剥离。 如果剥离这些字符会产生重复的包名,那么将进一步修改剥离的包名:将剥离的模式名的最后一个字符替换为顺序整数(以0开始),以产生唯一的包名。 因此,`My@#$Schema`生成`MySchema`包,然后创建`My#$Schema`生成`MySchem0`包。 同样的规则也适用于表名对应的类名。** ## 保留模式名 `INFORMATION_SCHEMA`模式名和相应的信息。 模式包名在所有命名空间中保留。 用户不应该在这个模式/包中创建表/类 在所有名称空间中保留`IRIS_Shard`模式名。 用户不应在此模式中创建表、视图或过程。 存储在`IRIS_Shard`模式中的项不会通过编目查询或`INFORMATION_SCHEMA`查询显示。 ## 默认模式名称 - 在执行DDL操作(例如创建或删除表、视图、触发器或存储过程)时,会提供一个非限定名称作为默认的模式名。 架构搜索路径值将被忽略。 - 在执行DML操作时,例如通过选择、调用、插入、更新或删除访问现有表、视图或存储过程,将从模式搜索路径(如果提供了)提供一个不限定的名称。 如果没有架构搜索路径,或者没有使用架构搜索路径定位指定项,则提供默认的架构名称。 初始设置是对所有名称空间(系统范围)使用相同的默认模式名。 可以为所有命名空间设置相同的默认模式名,也可以为当前命名空间设置默认模式名。 如果创建了一个具有非限定名称的表或其他项,InterSystems IRIS将为其分配默认模式名和相应的持久类包名。 如果一个命名的或默认的模式不存在,InterSystems IRIS将创建模式(和包),并将创建的项分配给该模式。 如果删除模式中的最后一项,InterSystems IRIS将删除该模式(和包)。 下面的模式名解析描述适用于表名、视图名和存储过程名。 系统范围的初始默认模式名是`SQLUser`。 对应的持久类包名是`User`。 因此,非限定表名`Employee`或限定表名`SQLUser`。 `Employee`将生成类`User.Employee`。 因为`USER`是一个保留字,尝试用`USER`的模式名(或任何SQL保留字)指定限定名会导致`SQLCODE -1`错误。 **要返回当前默认模式名,请调用`$SYSTEM.SQL.DefaultSchema()`方法:** ```java DHC-APP>WRITE $SYSTEM.SQL.DefaultSchema() SQLUser ``` 或者使用以下预处理器宏: ```java #Include %occConstant WRITE $$$DefSchema ``` 可以使用以下任意一种方式更改默认模式名: - 进入管理界面。 在系统管理中,选择Configuration,然后选择SQL和对象设置,然后选择SQL。 在这个屏幕上,可以查看和编辑当前系统范围内的默认模式设置。 这个选项设置系统范围的默认模式名。![image](/sites/default/files/inline/images/tu_pian__2.png) ![image](/sites/default/files/inline/images/tu_pian__3.png) 这个系统范围的设置可以被当前命名空间的`SetDefaultSchema()`方法值覆盖。 - `$SYSTEM.SQL.SetDefaultSchema()`方法。默认情况下,此方法在系统范围内设置默认架构名称。但是,通过将布尔值第3个参数设置为1,可以仅为当前名称空间设置默认架构。当不同的名称空间具有不同的默认架构名称时,`DefaultSchema()`方法将返回当前名称空间的默认架构名称。 **注意:当更改默认的SQL模式名称时,系统将自动清除系统上所有名称空间中的所有缓存查询。 通过更改默认模式名称,可以更改所有包含非限定表、视图或存储过程名称的查询的含义。 强烈建议在安装InterSystems IRIS时建立默认的SQL模式名,以后不要修改。** 模式名用于生成相应的类包名。 因为这些名称有不同的命名约定,所以它们可能不相同。 可以通过将其设置为系统范围的默认模式来创建与SQL保留字同名的模式,但是不建议这样做。 名为`User`的默认模式根据类命名唯一性约定,生成相应的类包名称`User0`。 ### `_CURRENT_USER`关键字 - 作为系统范围的默认模式名:如果指定`_CURRENT_USER`作为默认模式名,InterSystems IRIS将指定当前登录进程的用户名作为默认模式名。 `_CURRENT_USER`值是`$USERNAME` ObjectScript特殊变量值的第一部分。 如果`$USERNAME`包含一个名字和一个系统地址(`Deborah@TestSys`), `_CURRENT_USER`只包含名字片段; 这意味着`_CURRENT_USER`可以将相同的默认模式名分配给多个用户。 如果进程没有登录,`_CURRENT_USER`指定`SQLUser`作为默认的模式名。 如果指定`_CURRENT_USER/name`作为默认模式名,其中name是选择的任意字符串,那么InterSystems IRIS将当前登录进程的用户名分配为默认模式名。 如果进程没有登录,则name将用作默认的模式名。 例如,如果进程没有登录,`_CURRENT_USER/HMO`使用HMO作为默认模式名。 在`$SYSTEM.SQL.SetDefaultSchema()`中,指定`"_CURRENT_USER"`作为带引号的字符串。 - DDL命令中的模式名:如果在DDL语句中指定`_CURRENT_USER`作为显式的模式名,InterSystems IRIS将其替换为当前系统范围内的默认模式。 例如,如果系统范围的默认模式是`SQLUser`,则命令`DROP TABLE _CURRENT_USER`。 `OldTable SQLUser.OldTable`下降。 这是一种方便的方式来限定名称,以显式地指示应该使用系统范围的默认模式。 它在功能上与指定非限定名相同。 此关键字不能在DML语句中使用。 ## 模式搜索路径 当访问一个现有的表(或视图,或存储过程)进行DML操作时,将从模式搜索路径中提供一个非限定的名称。 按照指定的顺序搜索模式,并返回第一个匹配项。 如果在搜索路径中没有找到匹配的模式,或者没有搜索路径,则使用默认的模式名。 (注意,`#Import`宏指令使用了不同的搜索策略,不会“失败”到默认的模式名。) - 在嵌入式SQL中,可以使用`#SQLCompile Path`宏指令或`#Import`宏指令来提供架构搜索路径,系统间IRIS使用该路径来解析非限定名称。 `#SQLCompile Path`根据遇到的第一个匹配项解析不限定的名称。 如果搜索路径中列出的所有模式只有一个匹配项,则`#Import`解析非限定名。 - 下面的示例提供了包含两个模式名的搜索路径: ```java #SQLCompile Path=Customers,Employees ``` - 在动态SQL中,可以使用`%SchemaPath`属性提供模式搜索路径,系统间IRIS使用该路径解析不限定的表名。 可以直接指定`%SchemaPath`属性,也可以将其指定为`%SQL`的第二个参数。 声明`%new()`方法。 下面的示例提供了包含两个模式名的搜索路径: ```java SET tStatement = ##class(%SQL.Statement).%New(0,"Customers,Employees") ``` - 在SQL Shell中,可以设置`PATH SQL Shell`配置参数来提供架构搜索路径,系统间IRIS使用该路径解析不限定的名称。 如果非限定名与模式搜索路径中指定的任何模式或默认模式名不匹配,则会发出`SQLCODE -30`错误,例如:`SQLCODE: -30`消息:`Table 'PEOPLE' not found in schemas: CUSTOMERS,EMPLOYEES,SQLUSER`。 ## 包含特定于平台的模式名 当创建一个基于odbc的查询以通过Mac上的Microsoft query从Microsoft Excel运行时,如果从可用的表列表中选择一个表,则生成的查询不包括该表的模式(相当于类的包)。 例如,如果选择从示例模式返回`Person`表的所有行,则生成的查询为: ```java SELECT * FROM Person ``` **因为InterSystems IRIS将不限定的表名解释为`SQLUser`模式中的表名,所以该语句要么失败,要么从错误的表返回数据。 要纠正这一点,编辑查询(在SQL View选项卡上),显式引用所需的模式。 然后查询应该是:** ```java SELECT * FROM Sample.Person ``` ## List模式 `INFORMATION.SCHEMA`。 `SCHEMATA persistent`类列出当前名称空间中的所有模式。 下面的示例返回当前命名空间中的所有非系统模式名: ```java SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE NOT SCHEMA_NAME %STARTSWITH '%' ``` Management Portal SQL界面的左侧允许查看模式(或匹配筛选器模式的多个模式)的内容。 # 表名 每个表在其模式中都有一个唯一的名称。 一个表有一个SQL表名和一个对应的持久化类名; 这些名称在允许的字符、区分大小写和最大长度方面有所不同。 如果使用SQL `CREATE TABLE`命令定义,则指定遵循标识符约定的SQL表名; 系统生成一个对应的持久化类名。 如果定义为持久类定义,则必须指定只包含字母和数字字符的名称; 这个名称既用作区分大小写的持久类名,也用作(默认情况下)对应的不区分大小写的SQL表名。 可选的`SqlTableName class`关键字允许用户指定不同的SQL表名。 当使用`CREATE TABLE`命令创建表时,InterSystems IRIS使用表名生成相应的持久化类名。 由于表及其对应类的命名约定不同,用户应该注意非字母数字字符的名称转换: - 初始字符: - `%` (percent): %作为表名的第一个字符是保留的,应该避免(参见标识符)。 如果指定了,`%`字符将从对应的持久化类名中剥离。 - `_`(下划线):如果表名的第一个字符是下划线,则该字符将从对应的持久化类名中剥离。 例如,表名`_MyTable`生成类名`MyTable`。 - 数字:表名的第一个字符不能是数字。 如果表名的第一个字符是标点符号,则第二个字符不能是数字。 这将导致一个`SQLCODE -400`错误,`%msg`值为`" error #5053:类名'schema.name' is invalid "`(没有标点字符)。 例如,指定表名`_7A`会生成`%msg " ERROR #5053: Class name 'User.7A' is invalid "`。 - 后续的字符: - 字母:表名中至少包含一个字母。 表名的第一个字符或初始标点字符后的第一个字符必须是字母。 如果一个字符通过`$ZNAME`测试,它就是一个有效的字母; `$ZNAME`字母验证因不同的地区而不同。 (注意,$ZNAME不能用于验证SQL标识符,因为标识符可能包含标点字符。) - `_`(下划线),`@`,`#`,`$` characters:如果表名包含这些字符中的任何一个,这些字符将从对应的类名中剥离出来,并生成一个唯一的持久类名。 由于生成的类名不包括标点字符,因此不建议创建仅在标点字符上不同的表名。 - 表名在其模式中必须是唯一的。 如果试图创建一个名称仅与现有表大小写不同的表,将会产生`SQLCODE -201`错误。 同一个模式中的视图和表不能具有相同的名称。 尝试这样做会导致`SQLCODE -201`错误。 可以使用`$SYSTEM.SQL.TableExists()`方法确定一个表名是否已经存在。 可以使用`$SYSTEM.SQL.ViewExists()`方法确定视图名是否已经存在。 这些方法还返回与表或视图名称对应的类名。 管理门户SQL interface Catalog Details表信息选项显示与所选SQL表名称对应的类名。 试图指定`“USER”`或任何其他SQL保留字作为表名或模式名会导致`SQLCODE -312`错误。 要指定SQL保留字作为表名或模式名,可以指定名称作为带分隔符的标识符。 如果使用带分隔符的标识符指定包含非字母数字字符的表或模式名,InterSystems IRIS将在生成相应的类或包名时删除这些非字母数字字符。 适用以下表名长度限制: - 唯一性:InterSystems IRIS对持久化类名的前189个字符执行唯一性检查。 对应的SQL表名可能超过189个字符,但是,当去掉非字母数字字符时,它必须在189个字符的限制内是唯一的。 InterSystems IRIS对包名的前189个字符执行唯一性检查。 - 建议最大长度:一般来说,一个表名不应该超过128个字符。 一个表名可能比96个字符长得多,但是在前96个字母数字字符中不同的表名更容易处理。 - 最大组合长度:包名和它的持久类名(加在一起时)不能超过220个字符。 这包括默认的模式(包)名(如果没有指定模式名)和分隔包名和类名的点字符。 当表名转换为对应的持久化类名时,删除超过220个字符时,模式和表名的组合长度可以超过220个字符。 # RowID字段 **在SQL中,每条记录都由一个唯一的整数值标识,这个整数值称为`RowID`。** 在InterSystems SQL中,不需要指定`RowID`字段。 当创建表并指定所需的数据字段时,会自动创建RowID字段。 这个`RowID`在内部使用,但没有映射到类属性。 默认情况下,只有当持久化类被投影到SQL表时,它的存在才可见。 在这个投影表中,将出现一个额外的`RowID`字段。 默认情况下,这个字段被命名为`“ID”`,并分配给第1列。 默认情况下,当在表中填充数据时,InterSystems IRIS将从1开始向该字段分配连续的正整数。`RowID`数据类型为`BIGINT(%Library.BigInt)`。为`RowID`生成的值具有以下约束:每个值都是唯一的。不允许使用`NULL`值。排序规则是精确的。**默认情况下,值不可修改。** 默认情况下,InterSystems IRIS将此字段命名为`“ ID”`。但是,此字段名称不是保留的。每次编译表时都会重新建立`RowID`字段名。如果用户定义了一个名为`“ ID”`的字段,则在编译表时,InterSystems IRIS会将`RowID`命名为`“ ID1”`。例如,如果用户随后使用`ALTER TABLE`定义了一个名为`“ ID1”`的字段,则表编译会将`RowID`重命名为`“ ID2”`,依此类推。在持久性类定义中,可以使用`SqlRowIdName`类关键字直接为此类投影到的表指定`RowID`字段名。由于这些原因,应避免按名称引用`RowID`字段。 InterSystems SQL提供了`%ID`伪列名称(别名),无论分配给`RowID`的字段名称如何,该伪列名称始终返回`RowID`值。 (InterSystems TSQL提供了`$IDENTITY`伪列名称,其作用相同。) `ALTER TABLE`无法修改或删除`RowID`字段定义。 将记录插入表中后,InterSystems IRIS将为每个记录分配一个整数ID值。 `RowID`值始终递增。它们不被重用。因此,如果已插入和删除记录,则`RowID`值将按升序排列,但可能不连续。 - **默认情况下,使用`CREATE TABLE`定义的表使用`$SEQUENCE`执行`ID`分配,从而允许多个进程快速同时填充该表。当使用`$SEQUENCE`填充表时,会将`RowID`值序列分配给进程,然后该进程将顺序分配它们。因为并发进程使用它们自己分配的序列分配`RowID`,所以不能假定多个进程插入的记录按插入顺序排列。** 可以通过设置`SetDDLUseSequence()`方法,将InterSystems IRIS配置为使用`$INCREMENT`执行`ID`分配。若要确定当前设置,请调用`$ SYSTEM.SQL.CurrentSettings()`方法。 - 默认情况下,通过创建持久性类定义的表将使用`$INCREMENT`执行ID分配。在持久性类定义中,可以将`IdFunction`存储关键字设置为序列或增量;否则,可以设置为0。例如,`序列`。 在持久性类定义中,`IdLocation`存储关键字global(例如,对于持久性类`Sample.Person: ^ Sample.PersonD `)包含RowID计数器的最高分配值。 (这是分配给记录的最高整数,而不是分配给进程的最高整数。)请注意,此RowID计数器值可能不再与现有记录相对应。要确定是否存在具有特定RowID值的记录,请调用表的`%ExistsId()`方法。 通过`TRUNCATE TABLE`命令重置`RowID`计数器。即使使用`DELETE`命令删除表中的所有行,也不会通过`DELETE`命令将其重置。如果没有数据插入表中,或者已使用`TRUNCATE TABLE`删除所有表数据,则`IdLocation`存储关键字全局值未定义。 默认情况下,`RowID`值不可用户修改。尝试修改`RowID`值会产生`SQLCODE -107`错误。覆盖此默认值以允许修改`RowID`值可能会导致严重的后果,只有在非常特殊的情况下并应格外谨慎。 `Config.SQL.AllowRowIDUpdate`属性允许`RowID`值是用户可修改的。 ## 基于字段的RowID 通过定义一个用于投影表的持久类,可以定义`RowID`以具有字段或字段组合中的值。为此,请使用`IdKey index`关键字指定一个索引。例如,一个表可以具有一个`RowID`,其`RowId`通过在`PatientName [IdKey]`上指定索引定义`IdxId`来与`PatientName`字段的值相同;或者可以通过指定索引定义`IdxId`来将`PatientName`和`SSN`字段的组合值在`(PatientName,SSN)[IdKey];`上。 - 基于字段的`RowID`效率比采用系统分配的连续正整数的`RowId`效率低。 - 在`INSERT`上:为构成`RowId`的字段或字段组合指定的值必须唯一。指定非唯一值将生成`SQLCODE -119`“在插入时唯一性或主键约束唯一性检查失败”。 - 在`UPDATE`上:默认情况下,组成`RowId`的每个字段的值都是不可修改的。尝试修改这些字段之一的值会生成`SQLCODE -107`“无法基于字段更新`RowID`或`RowID`”。 当`RowID`基于多个字段时,`RowID`值是由`||`连接的每个组成字段的值。操作员。例如,`Ross,Betsy || 123-45-6789`。 InterSystems IRIS尝试确定基于多个字段的`RowID`的最大长度。如果无法确定最大长度,则`RowID`长度默认为512。 ## 隐藏的RowID? - 使用`CREATE TABLE`创建表时,默认情况下隐藏`RowID`。 `SELECT *`不会显示隐藏字段,而是`PRIVATE`。创建表时,可以指定`%PUBLICROWID`关键字以使`RowID`不隐藏和公开。可以在`CREATE TABLE`逗号分隔的表元素列表中的任何位置指定此可选的`%PUBLICROWID`关键字。不能在`ALTER TABLE`中指定。 - 创建作为表投影的持久类时,默认情况下不会隐藏`RowID`。它由`SELECT *`显示,并且是`PUBLIC`。可以通过指定类关键字`SqlRowIdPrivate`来定义具有隐藏且为`PRIVATE`的`RowID`的持久类。 用作外键引用的`RowID`必须是公共的。 默认情况下,不能将具有公共`RowID`的表用作源表或目标表,以使用`INSERT INTO Sample.DupTable SELECT * FROM Sample.SrcTable`将数据复制到重复表中。 可以使用Management Portal SQL界面“目录详细信息字段”列出“隐藏”列来显示`RowID`是否被隐藏。 可以使用以下程序返回指定字段(在此示例中为`ID`)是否被隐藏: ```java /// d ##class(PHA.TEST.SQL).RowID() ClassMethod RowID() { SET myquery = "SELECT FIELD_NAME,HIDDEN FROM %Library.SQLCatalog_SQLFields(?) WHERE FIELD_NAME='ID'" SET tStatement = ##class(%SQL.Statement).%New() SET qStatus = tStatement.%Prepare(myquery) IF qStatus'=1 { WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT } SET rset = tStatement.%Execute() DO rset.%Display() WRITE !,"End of data" } ``` 最后一个占位符使用案例很棒!谢谢 总结的很好
文章
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 ... ```
文章
姚 鑫 · 五月 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中的数据能不能是非数字呢?
文章
Jingwei Wang · 十二月 29, 2021

ObjectScript数据类型 - 日期

$HOROLOG($H) 表示当前的本地日期和时间,是由两个整数值组成的字符串,这些整数是计数器,是InterSystems IRIS存储格式,不是用户可读的日期和时间。 ddddd,sssss 代码示例: w $H,! 北京时间2021年12月29日15:15:30时,输出结果为: 66107,54930 第一个整数,ddddd,是当前日期,表示为自1840年12月31日以来的天数,其中第1天是1841年1月1日。这个日期到达的最大年年限是9999年12月31日,所以这个整数的最大值是2980013。$HOROLOG不能直接用于表示1840年到9999年范围之外的日期 第二个整数,sssss,是当前的时间,表示为从当天午夜开始的秒数计数。系统将时间字段从0递增到86399秒。当午夜时分达到86399时,系统将时间字段重置为0,并将日期字段增加1。 你可以通过调用Horolog()方法获得相同的当前日期和时间信息,如下所示。 WRITE $SYSTEM.SYS.Horolog() $NOW() $NOW()返回当前进程的本地日期和时间,是InterSystems IRIS存储格式,不是用户可读的日期和时间。 ddddd,sssss.ffffff 代码示例: w $NOW(),! 北京时间2021年12月29日15:15:30时,输出结果为: 66107,54930.383622 $ZTIMESTAMP $ZTIMESTAMP返回UTC日期和时间,是InterSystems IRIS存储格式,不是用户可读的日期和时间。带有小数秒,小数秒以三位数的精度表示(Windows系统),或以六位数的精度表示(UNIX®系统) 代码示例: w $ZTIMESTAMP,! 北京时间2021年12月29日15:15:30时,输出结果为: 66107,26130.383 $NOW() vs $HOROLOG vs $ZTIMESTAMP $HOROLOG包含了InterSystems IRIS存储格式的、经过变体调整的本地日期和时间。本地时区是由$ZTIMEZONE特殊变量的当前值决定的,然后根据本地时间变体进行调整,如夏令时。它只返回整数秒,小数秒会被截断。 $NOW()根据$ZTIMEZONE特殊变量的值确定本地时区。本地时间不会因本地时间变体(如夏令时)而调整。因此,它可能与本地时钟时间不一致。$NOW(tzmins)返回与指定的tzmins时区参数对应的时间和日期。$ZTIMEZONE的值被忽略。 $ZTIMESTAMP返回UTC日期和时间。 日期和时间的转换 $ZDATE 将$HOROLOG的日期部分,即ddddd,转换为用户可读的形式。 ​ WRITE $ZDATE($PIECE($HOROLOG,",",1)) 输出结果为: 12/29/2021 $ZTIME 将$HOROLOG的时间部分,即sssss,转换为用户可读的形式。 $ZDATETIME 将$HOROLOG的日期和时间,同时转换为用户可读的形式。 当使用$HOROLOG时,在这些函数中设置时间值的精度总是返回零作为小数秒。 $ZDATETIME(hdatetime,dformat,tformat,precision,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt) $ZDT(hdatetime,dformat,tformat,precision,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt) 参数描述请参考参数解析 参数 描述 hdatetime 内部格式的日期和时间值:$HOROLOG]或者 $ZTIMESTAMP dformat 一个整数,指定返回日期值的格式 tformat 一个整数,指定返回时间值的格式 precision 一个整数,指定返回时间值的小数位数(小数秒):只有当hdatetime格式可以包括小数时间值($ZTIMESTAMP格式),并且选择的tformat选项包括秒时,精度才适用。 monthlist 可选的 - 一个字符串或一个变量的名称,用于指定一组月名。 这个字符串必须以一个分界符开始,它的12个条目必须以这个分界符分开。 例如: January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec monthlist仅在dformat为2、5、6、7、9、18或20时有效。 yearopt 一个整数代码,指定以两位数或四位数的数值表示年份。 startwin 滑动窗口的开始,在这个窗口中,日期用两位数的年份表示。 当你使用yearopt为3或5时,你必须提供startwin,startwin对任何其他yearopt值都是无效的。 当yearopt=3时,startwin是一个$HOROLOG日期格式的绝对日期,表示滑动窗口的开始日期。 当yearopt=5时,startwin是一个数值,表示滑动窗口的起始年份,以当前年份之前的年数表示。 endwin 滑动窗口的末端,在这个窗口中,日期用两位数的年份表示。 当yearopt为3或5时,你可以选择提供endwin。endwin在任何其他yearopt值下无效。 当yearopt=3时,endwin是一个$HOROLOG日期格式的绝对日期,表示滑动窗口的结束日期。 当yearopt=5时,endwin是一个数值,表示滑动窗口的结束年限,以当前年限后的年数表示。 当yearopt=5时,滑动窗口总是从startwin中指定的年份的1月1日开始,到endwin中指定的年份的12月31日结束,或者是隐含的结束年份(如果你省略endwin)。 如果省略endwin(或指定为-1),有效的滑动窗口将是100年的长度。 如果你同时提供startwin和endwin,它们指定的滑动窗口的持续时间不能超过100年。 mindate 有效日期范围的下限。指定为$HOROLOG的整数日期计数,例如 0代表1840年12月31日,2/22/2018表示为64701。 支持的mindate值:正的整数,0 或-1 maxdate 有效日期范围的上限,指定为整数$HOROLOG日期计数. 例如,1/1/2100表示为94599 指定一个大于maxdate的hdatetime日期会产生一个VALUE OUT OF RANGE错误。 指定一个大于2980013的maxdate会产生一个VALUE OF RANGE错误。 你可以指定maxdate,也可以不指定mindate。指定一个小于mindate的maxdate会产生一个ILLEGAL VALUE错误。 erropt 当hdatetime无效时要返回的表达式。为这个参数指定一个值可以抑制与无效或超出范围的hdatetime值有关的错误代码。$ZDATETIME不发出错误信息,而是返回erropt。 localeopt 一个布尔标志,指定对dformat、tformat、monthlist、yearopt、mindate和maxdate默认值以及其他日期和时间特征使用哪种语言: localeopt=0:当前语言属性设置决定这些参数默认值。 localeopt=1:ODBC标准语言决定这些参数默认值。 localeopt没有指定:dformat值决定这些参数默认值。 $ZDATETIMEH 将用户可读的日期和时间,转换为$HOROLOG(ddddd,sssss)格式 $ZDATETIMEH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt) $ZDTH(datetime,dformat,tformat,monthlist,yearopt,startwin,endwin,mindate,maxdate,erropt,localeopt) 参数描述请参考参数解析 可以使用 "T "或 "t "字母代码来指定当前日期。但是,dformat必须是5、6、7、8、9或15。 WRITE $ZDATETIMEH("T",5) 输出: 66107,0 当前日期前三天: WRITE $ZDATETIMEH("T-3",5) 输出: 66104,0 $ZTIMEZONE : 时区 $ZTIMEZONE是一个从格林威治子午线开始的固定时区偏移量,它不对当地的季节性时间变体进行调整,如夏令时。 代码示例: w $ZTIMEZONE,! 输出结果为: -480
问题
xu hui · 六月 22, 2021

ERROR [HYT00] [Cache ODBC][State : HYT00][Native Code 450] [c:\windows\system32\inetsrv\w3wp.exe] Request timed out due to user timeout

我在用.net通过ODBC连接cache数据库,OdbcConnection connection = new OdbcConnection(dbConnection);connection.Open();打开链接时报这错,请教大佬们,这应该怎么解决吗?不胜感激! 您好!该问题请提交WRC服务 您可以登录网址:https://wrc.intersystems.com提交 第一个问题, 你是连本机还是远程?第2个问题, 你有没有测windows操作系统的cache odbc连接? 您好,非常感谢您的回复。我连接的是局域网内的其他远程服务器;我用同样的代码连接windows操作系统的DSN,是可以connection.Open();运行到这步并进行下去的。请问还有可能是什么原因吗?万分感谢@ 好的,初来乍到,不懂流程,抱歉。但我登录您所给的网址,提示 is not enabled for WRC login. If this is unexpected, please contact InterSystems Support.提交不了WRC服务
文章
Tianyu wu · 三月 3, 2021

欢迎大家来给我们投票啦!

这是我们团队参加的第一届InterStstems编程竞赛! 快来看看投票给我们! 超额预订管理系统结合了酒店业的独特条件,例如房价,订购渠道,客户需求等。 本系统使用机器学习算法(例如:KNN / ES-RNN ...)来准确预测酒店的每日未入住和入住率,并进一步与收益结合以找到最佳的最大客房销售量,从而精准增加酒店的边际收益。 移步欣赏作品点击如下连接 https://github.com/BroadCastAir/hotel_api & https://github.com/BroadCastAir/Hotel_OverBooking_Sys 投票给我们点击: Check the related application on InterSystems Open Exchange 我们ISC 中国也想跟您聊一下合作事宜,请 @Jun.Qian 联系一下,谢谢! good! 很棒的应用! 非常棒!很好的应用!
公告
Nicky Zhu · 三月 30, 2021

2021年3月23日 - 提醒:HS2021-03,镜像Dejournaling的潜在数据完整性问题(HealthShare)

尊敬的HealthShare用户: 本帖是HealthShare HS2021-03提醒沟通流程的一部分,同样的信息也会以以下渠道分发: 邮件通知 HealthShare 用户 在 Product Alerts & Advisories 主页上通知 在 WRC Distribution Page InterSystems Documents主页上通知 提醒 产品版本和影响 风险等级 和评分 HS2021-03 -01:镜像Dejournaling的潜在数据完整性问题 这个问题会影响所有支持镜像的HealthShare产品和版本: HealthShare Unified Care Record/Information Exchange, Health Insight, and Patient Index version 15.02 and newer HealthShare Personal Community version 12.0 and newer HealthShare Provider Directory 2019.2, 2020.1 and 2020.2 HealthShare Health Connect and HSAP versions that support mirroring 2-低风险 (临床安全) 1-极低风险(隐私) 1-极低风险 (安全) 2-低风险 (运维) 如果您对本提醒有任何疑问,请联系 support@intersystems.com,并引述“HealthShare Alert HS2021-03”。
文章
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 不是成对出现,则有可能出现不可预知错误。 配置成功状态 主机状态: 备机状态:
文章
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在国内多行业应用,棒👍 好的,谢谢! 感谢提醒,👍
文章
姚 鑫 · 五月 11, 2022

第139章 SQL函数 TIMESTAMPDIFF

# 第139章 SQL函数 TIMESTAMPDIFF 一个标量日期/时间函数,它返回指定日期部分的两个时间戳之间差异的整数计数。 # 大纲 ```java {fn TIMESTAMPDIFF(interval-type,startdate,enddate)} ``` # 参数 - `interval-type` - 返回值将表示的时间/日期间隔类型。 - `startdate` - 时间戳值表达式。 - `enddate` - 将与 `startdate` 进行比较的时间戳值表达式。 # 描述 `TIMESTAMPDIFF` 函数返回指定日期部分间隔(秒、天、周等)的两个给定时间戳之间的差异(即,从另一个中减去一个时间戳)。返回的值是一个 `INTEGER`,即两个时间戳之间的这些间隔数。 (如果 `enddate` 早于 `startdate`,则 `TIMESTAMPDIFF` 返回负 `INTEGER` 值。) 开始日期和结束日期是时间戳。这些时间戳可以是 `%Library.TimeStamp` 数据类型格式 (`yyyy-mm-dd hh:mm:ss.ffff`) 或 `%Library.PosixTime` 数据类型格式(编码的 `64` 位有符号整数)。 间隔类型参数可以是以下时间戳间隔之一: - `SQL_TSI_FRAC_SECOND` - `SQL_TSI_SECOND` - `SQL_TSI_MINUTE` - `SQL_TSI_HOUR` - `SQL_TSI_DAY` - `SQL_TSI_WEEK` - `SQL_TSI_MONTH` - `SQL_TSI_YEAR` 这些时间戳间隔可以使用单引号或双引号来指定,带或不带引号。它们不区分大小写。 `TIMESTAMPDIFF` 和 `DATEDIFF` 不处理季度`quarters` (3 个月间隔)。 请注意,`TIMESTAMPDIFF` 只能用作 ODBC 标量函数(使用大括号语法)。可以使用 `DATEDIFF` 通用函数对时间戳执行类似的时间/日期比较操作。 # %TimeStamp 格式化 如果 `startdate` 或 `enddate` 参数采用 `%Library.TimeStamp` 数据类型格式 (`yyyy-mm-dd hh:mm:ss.ffff`),则适用以下规则: - 如果任一时间戳表达式仅指定时间值并且间隔类型指定日期间隔(天、周、月或年),则在计算结果间隔计数之前,时间戳的缺失日期部分默认为`“1900–01–01”` . - 如果任一时间戳表达式仅指定日期值并且间隔类型指定时间间隔(小时、分钟、秒、小数秒),则在计算结果间隔计数之前,时间戳的缺失时间部分默认为`“00:00:00.000”` . - 可以包含或省略任意位数精度的小数秒。 `SQL_TSI_FRAC_SECOND` 以千分之一秒的整数计数形式返回小数秒的差异(精度为三位数)。 `%PosixTime` 值始终包含六位精度。 # 范围和值检查 `TIMESTAMPDIFF` 对输入值执行以下检查。 - `startdate` 和 `enddate` 的所有指定部分必须有效,然后才能执行任何 `TIMESTAMPDIFF` 操作。 - 日期字符串必须完整且格式正确,其中包含适当数量的元素和每个元素的数字,以及适当的分隔符。年份必须指定为四位数。无效的日期值会导致 `SQLCODE -8` 错误。 - 日期值必须在有效范围内。年:0001 到 9999。月:1 到 12。日:1 到 31。小时:00 到 23。分:0 到 59。秒:0 到 59。一个月中的天数必须与月和年相匹配。例如,日期`“02–29”`仅在指定年份是闰年时有效。无效的日期值会导致 `SQLCODE -8` 错误。 - 小于 10(月和日)的日期值可能包括或省略前导零。不允许使用其他非规范整数值。因此,`Day` 值`“07”`或`“7”`有效,但`“007”`、`“7.0”`或`“7a”`无效。 - 时间值可以全部或部分省略。如果 `startdate` 或 `enddate` 指定了不完整的时间,则为未指定的部分提供零。 - 小于 10 的小时值必须包含前导零。省略此前导零会导致 `SQLCODE -8` 错误。 # 示例 以下示例返回 `7`,因为第二个时间戳 (`2017-12-20 12:00:00`) 比第一个大 `7` 个月: ```sql SELECT {fn TIMESTAMPDIFF(SQL_TSI_MONTH, '2017-5-19 00:00:00','2017-12-20 12:00:00')} 7 ``` 以下示例返回 `566`,因为第二个时间戳 (`'12:00:00'`)) 比第一个时间戳 (`02:34:12`) 大 `566` 分钟: ```sql SELECT {fn TIMESTAMPDIFF(SQL_TSI_MINUTE,'02:34:12','12:00:00')} 566 ``` 以下示例返回 -1440,因为第二个时间戳比第一个小一天(1440 分钟): ```sql SELECT {fn TIMESTAMPDIFF(SQL_TSI_MINUTE,'2017-12-06','2017-12-05')} -1440 ```
文章
Qiao Peng · 六月 11, 2023

统一语义数据平台

数据平台一直在进化:从数据中心到数据中台,离散的数据资产得到进一步梳理和整合、按业务封装数据和操作数据的方法,并逐步提供了企业统一的访问、更新、检索、查询等数据服务。 然而市场上不乏听到数据平台的成功案例,却鲜见这些案例得到大规模推广。原因是什么呢? 一. 传统数据平台建设的挑战 传统数据平台的数据模型基于各自厂商的理解,缺乏统一行业数据模型和行业语义。可供参考的国内卫生信息数据元、数据集标准并非完整的行业语义,例如没有业务实体模型和数据元关系定义。传统的数据平台建设通常根据业务域,围绕数据应用需求组织数据。经常看到按业务域划分为CDR(临床数据中心)、ODR(运营数据中心)、RDR(科研数据中心)...... 这造成了几个挑战: 1. 按业务域、而非业务实体来划分数据,虽然方便相应的业务域数据分析,但跨业务域重叠的业务实体数据,例如患者,需要跨数据中心同步。这些同步由于数据模型上的差异,往往非全息拷贝。随着同步次数越多,跨数据中心的数据越失真,造成数据资产多源不统一、数据资产一致性问题和时效性问题。 2. 数据平台产品语义表达上参差不齐,业务用户依赖数据工程师对数据理解和操作,无论是统计分析还是机器学习,海量的实施工作无法满足业务敏捷性要求; 3. 数据平台及数据应用建设依赖单一厂商的能力,而建设成果,包括数据工具、分析指标和应用都无法跨数据平台复用。往往项目都在做低水平重复建设。 4. 数据互操作标准化程度低,数据的同步、迁移困难。在缺乏数据层互操作性的情况下,各类数据中心建设的依然是数据孤岛。 5. 由于数据中心往往忽视互操作建设,数据缺乏流动,进入数据平台后,往往成为死水一潭。 二. 如何应对挑战 如何解决这些数据平台建设困境?应该如何建设数据平台? 数据资产不是仅为分析服务的,更重要的是作为生产要素在生产全过程中发挥价值- 这就涉及到数据生成、采集、交换、决策… 在这个全过程链条上的数据互操作能力尤为重要。 HIMSS将互操作定义为4级:基础级、结构级、语义级和组织级,并认为只有到达语义级,才是标准的、才能实现广泛的互操作能力。要达到语义级的互操作,需要进行五位一体的标准化:词汇/术语标准、内容标准、传输标准、隐私和安全标准、标识符标准。 随着我们越来越依赖于机器处理数据、发掘数据背后的知识,对数据资产的开放性和互操作性的要求达到了更高的水平 - 实现机器可以理解的互操作。2016年发表在Scientific Data针对科学数据管理和监管,提出了数据的可发现(Findable)、可访问(Accessible)、可互操作(Interoperable)、可复用(Reusable)的FAIR指导原则。 这些原则的核心是让机器可以理解数据所需的语义层面的要求,尤其是可互操作和可复用两部分提到的语义级要求 - 广泛使用的语言、词汇表、元数据引用、符合相关领域的社区标准... 大家都不约而同地指向了统一行业语义。传统数据中心面临的上述挑战,正是因为缺乏统一的行业语义、缺乏统一的语义级互操作。 那什么是统一语义? 三. 统一语义数据平台 圣经记载人类曾经联合起来兴建能通往天堂的高塔 - 巴别塔、也称通天塔。上帝为了阻止人类的计划,让人类说不同的语言。人类相互之间不能沟通,造塔计划因此失败。 统一语言是数据能够互相理解、并利用数据的前提。 语言包含2个层面: 1. 语义:真实世界事物及其关系的表达方法。例如不同电子病历系统对疑似肺癌的记录,可能记录为以下三种之一: A。问题: 癌症 身体部位:肺 确定程度:疑似 B。问题: 肺癌 确定程度:疑似 C。问题: 疑似肺癌 这三种语义表达不统一。没有统一的语义就像图里的电源插座,每个国家规格都不同,是不可能互联互通的。 2. 语法:语言的结构规则,包括词法和句法。而词法和句法都可能有歧义,就像图中示例的那样。 行业数据需要通过统一语义达到互联互通。对数据而言,统一语义不仅在数据模型(语义)、也在数据使用方式(语法)上。不仅数据语义是统一的,操作/互操作数据的方法也是统一的,并且需要能避免词法和句法歧义,才能达到语义级互操作能力! 是不是一定要统一语义?要看数据用途:对于特定的、简单的数据任务,简化的数据模型和数据处理方法可能已经足够,但对于复杂的、跨领域的数据任务,如广泛的自然语言处理、知识图谱构建、大规模机器学习等,统一语义是非常有价值的。 显然,对于数据平台这类多用途平台,应该统一数据语义。 四. 如何建设行业统一语义数据平台 数据平台建设向统一语义迈进,而统一的行业语义模型,应该针对行业用户友好:直观、完整、语义简单、没有二义性,易于数据探索与使用。 统一语义是指要统一物理数据模型和操作数据的语言吗?是要限定到特定的技术栈吗? 先看一下数据库的结构化查询语言(SQL):众多的关系型数据库、甚至很多非关系型数据库都支持ANSI SQL语言。SQL定义了自己的语义 - 表、字段、视图、存储过程... 和自己的语法 - 数据定义语言(DDL)、数据操作语言(DML),但它并没有定义任何数据的物理存储方案!也正因如此,任何数据库厂商、任何数据物理存储方案,都可以通过自己的SQL编译器来支持SQL和SQL客户端,从而屏蔽数据库物理层差异,使用相同的SQL语言共同建设SQL生态。这也是SQL生态壮大的原因之一。 SQL的成功告诉我们,统一行业语义是对行业数据的逻辑表达层的要求,它不应对任何数据库技术底层做要求,也就是不应限定任何技术栈。 前面提到统一的数据操作/互操作能力是统一语义的一部分,是要用单一的数据操作方法吗?数据有多种操作方式,每种操作方式都有自己适用的场景,如下: 对同一份数据提供多模型的操作能力,会极大提升语义层的操作/互操作的便捷性,是非常重要的统一语义特性。重要的是可以针对同一份语义数据进行多种模型的操作/互操作,而不是建立针对每种模型的多套语义,并进行数据复制。 也就是说统一语义,并不是数据只能有一种操作/互操作方式,而应提供对同一份统一语义数据的多种操作/互操作方式。 五. InterSystems统一语义数据平台建设 基于上面的建设思路,InterSystems的医疗信息统一语义平台通过对行业语义的理解和其智能数据编织能力,提供医疗信息数据基座。 5.1 行业语义选择 - FHIR 行业语义应具有开放性、成熟性、准确性、完整性、灵活性、简单性、非二义性、可互操作性、机器可理解,并被广泛接受与认可。纵观医疗信息行业,虽然有不少通用数据模型,但目前最满足上述条件的是HL7 FHIR。它的资源模型覆盖面广,不仅是临床、还包括管理、科研等;不仅包括通用数据模型 - FHIR资源模型,还有对其统一的互操作方法 - FHIR API;按80/20原则设计,允许对资源模型和API进行扩展;资源模型和API简单、并有详细的用例指南;FHIR资源模型、API、扩展都可以被计算机理解;FHIR拥有庞大的用例,并且其触角不断扩展到医疗信息应用的各个层面和各个方向。 另外,更重要的是,FHIR的定位就是行业语义标准 - 逻辑层的标准,任何厂商只需要提供自己的FHIR服务器,就可以利用任何技术栈发布统一的FHIR资源和FHIR API,而屏蔽底层不同类型的数据存储方案、数据模型和数据操作方法。因而它是一个强大的生态标准,所有厂商和用户都可以参与其中。 InterSystems的解决方案选择FHIR作为统一语义,在支持FHIR的6种互操作范式的基础上,提供对FHIR资源的SQL投射 - 无需数据拷贝,就可以使用SQL大规模查询FHIR资源,对统计分析、机器学习提供简单易用的数据操作能力。 5.2 利用数据编织技术,无需推倒重来 如果正在规划数据平台,应考虑按统一语义建设。如果已经建设有各类数据中心,并不需要将已有的建设成果推倒重来。InterSystems的解决方案通过数据编织技术,将数据源编织在一起,并建立逻辑上的统一语义层。原有数据中心和其各类应用继续运行,通过统一语义层来支撑新的数据利用和应用创新。 InterSystems利用数据编织技术,提供针对所有数据源、数据模型、互操作标准的接入能力和适配器。现有的数据中心被视为数据源,只需接入而无需推倒现有建设成果。 InterSystems的多模型能力,将这些离散的数据源统一转换、表达,将多数据源的数据,以FHIR资源这个统一语义模型,发布多种数据模型的数据服务:包括FHIR JSON模型、FHIR对象模型、FHIR SQL模型,满足多种应用场景对统一语义数据的最佳操作方式。 InterSystems数据引擎,为统一语义层提供高性能、横向可扩展的持久化层,满足不同规模的数据用户所需的性能和弹性。 InterSystems提供FHIR与互联互通、HL7 V2、CDA等通用模型的开箱即用的转换能力和对用户自定义模型的自定义转换能力,提供全方位的统一语义互操作能力。