1 关注者 · 494 帖子

SQL 是在关系数据库中存储、操作和检索数据的标准语言。

文章 姚 鑫 · 九月 18, 2021 4m read

第十九章 SQL命令 CREATE TABLE(六)

WITH子句,%CLASSPARAMETER关键字,STORAGETYPE关键字

可选的WITH子句可以在表格元素逗号结尾的圆括号之后和Shard Key定义(如果存在的话)之后指定。 WITH子句可以包含一个用逗号分隔的列表:

  • 一个或多个%CLASSPARAMETER 子句。
  • STORAGETYPE子句

%CLASSPARAMETER子句

WITH关键字之后,可以指定多个关键字子句,每个子句定义一个类参数。 多个%CLASSPARAMETER子句子句之间用逗号分隔。 为了向后兼容,支持将关键字子句指定为中的元素。 在两个位置中指定相同的关键字子句将产生错误。

关键字后面跟着类参数名称、一个可选的等号和要分配给该类参数的文字值(字符串或数字)。 类参数总是定义为常数值。

因为用户可以用任何名称或值定义额外的类参数,所以只执行语法验证; 既不验证类参数是否存在,也不验证类参数的有效值。 下面的示例定义了两个类参数; 第一个子句使用了等号,第二个省略了等号:

CREATE TABLE OurEmployees (
    EMPNUM     INT NOT NULL,
    NAMELAST   CHAR(30) NOT NULL,
    NAMEFIRST  CHAR(30) NOT NULL,
    CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM)
    )
WITH %CLASSPARAMETER DEFAULTGLOBAL = '^GL.EMPLOYEE',
     %CLASSPARAMETER MANAGEDEXTENT 0
0
0 120
文章 姚 鑫 · 九月 17, 2021 9m read

第十八章 SQL命令 CREATE TABLE(五)

定义外键

外键是引用另一个表的字段;存储在外键字段中的值是唯一标识另一个表中的记录的值。此引用的最简单形式如下例所示,其中外键显式引用Customers表中的主键字段CustID

CREATE TABLE Orders (
   OrderID INT UNIQUE NOT NULL,
   OrderItem VARCHAR,
   OrderQuantity INT,
   CustomerNum INT,
   CONSTRAINT OrdersPK PRIMARY KEY (OrderID),
   CONSTRAINT CustomersFK FOREIGN KEY (CustomerNum) REFERENCES Customers (CustID)
   )

最常见的情况是,外键引用另一个表的主键字段。但是,外键可以引用或标识列。在任何情况下,外键引用都必须存在于被引用的表中,并且必须定义为唯一的;被引用的字段不能包含重复值或NULL

在外键定义中,可以指定:

  • 字段名:FOREIGN KEY (CustomerNum) REFERENCES Customers (CustID)。 外键字段(CustomerNum
0
0 170
文章 姚 鑫 · 九月 15, 2021 10m read

第十七章 SQL命令 CREATE TABLE(四)

唯一字段约束

唯一字段约束对多个字段的组合值施加唯一值约束。它具有以下语法:

CONSTRAINT uname UNIQUE (f1,f2)

此约束指定字段f1f2的值组合必须始终是唯一的,即使这两个字段本身的值可能不是唯一的。可以为此约束指定一个、两个或多个字段。

此约束中指定的所有字段都必须在字段定义中定义。如果在此约束中指定的字段没有出现在字段定义中,则会生成SQLCODE-86错误。指定的字段应定义为非空。任何指定的字段都不应定义为唯一的,因为这会使指定此约束变得毫无意义。

字段可以按任何顺序指定。字段顺序指定相应索引定义的字段顺序。允许重复的字段名称。虽然可以在唯一字段约束中指定单个字段名称,但这与为该字段指定唯一数据约束在功能上是相同的。单字段约束确实提供了约束名称以供将来使用。

可以在表定义中指定多个唯一字段约束语句。约束语句可以在字段定义中的任何位置指定;按照惯例,它们通常放在已定义字段列表的末尾。

约束名称

关键字和唯一字段约束名称是可选的。以下各项在功能上等效:

CONSTRAINT myuniquefields UNIQUE (name,dateofbirth)
UNIQUE (name,dateofbirth)

约束名唯一地标识约束,并且还用于派生相应的索引名。

0
0 305
文章 姚 鑫 · 九月 15, 2021 10m read

第十六章 SQL命令 CREATE TABLE(三)

字段数据约束

数据约束控制字段允许使用的值、字段的默认值以及数据值使用的排序规则类型。所有这些数据约束都是可选的。可以按任何顺序指定多个数据约束,并以空格分隔。

NULL和NOT NULL

NOT NULL数据约束关键字指定该字段不接受空值;换句话说,每条记录都必须为该字段指定一个值。NULL和空字符串('') IRIS中是不同的值。可以在接受字符串的字段中输入空字符串,即使该字段定义了限制也是如此。不能在数值字段中输入空字符串。

数据约束关键字显式指定此字段可以接受空值;这是字段的默认定义。

UNIQUE

唯一数据约束指定此字段仅接受唯一值。因此,没有两条记录可以包含该字段的相同值。SQL空字符串()被视为数据值,因此在应用了UNIQUE数据约束的情况下,任何两条记录都不能包含此字段的空字符串值。NULL不被视为数据值,因此唯一数据约束不适用于多个。要限制字段使用,请使用关键字约束。

  • 唯一数据约束要求指定字段的所有值都是唯一值。
  • UNIQUE fields constraint(使用CONSTRAINT关键字)要求一组指定字段的所有值在串联在一起时产生唯一值。不需要将各个字段限制为唯一值。

定义为分片表的表对数据约束的使用有额外的限制。 不包含键的字段或字段组上的唯一约束为插入和更新增加了显著的性能成本。

0
0 352
文章 姚 鑫 · 九月 13, 2021 9m read

第十五章 SQL命令 CREATE TABLE(二)

全局临时表

指定GLOBAL TEMPORARY关键字将表定义为全局临时表。表定义是全局的(对所有进程都可用);表数据是临时的(在进程期间持续存在)。相应的类定义包含一个附加的类参数SQLTABLETYPE=“GLOBAL TEMPORARY”。与标准的 IRIS表一样,ClassType=Persistent,并且类包含关键字,表示它不能有子类。

无论哪个进程创建临时表,临时表的所有者都会自动设置为。这意味着所有用户都可以访问缓存的临时表定义。例如,如果存储过程创建了一个临时表,则允许调用该存储过程的任何用户都可以访问该表定义。这仅适用于临时表定义;临时表数据特定于调用,因此只能由当前用户进程访问。

全局临时表的表定义与基表相同。全局临时表必须具有唯一的名称;尝试为其提供与现有基表相同的名称会导致错误。该表将一直存在,直到显式删除(使用DROP TABLE)。可以使用ALTER TABLE更改表定义。

下面的嵌入式示例创建一个全局临时表:

ClassMethod CreateTable3()
{
	d $SYSTEM.Security.Login("_SYSTEM","SYS")
	n SQLCODE,%msg
	&sql(
		CREATE GLOBAL TEMPORARY TABLE TempEmp 
		(
			EMPNUM     INT NOT NULL,
			NAMELAST   CHAR(30) NOT NULL,
			NAMEFIRST  CHAR(30) NOT NULL,
			CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM)
		)
	)
	if SQLCODE=0 { 
		w !,"表创建"
	} else { 
		w !,"SQLCODE=",SQLCODE,": ",%msg 
	}
}

0
0 315
文章 姚 鑫 · 九月 12, 2021 9m read

第十四章 SQL命令 CREATE TABLE(一)

创建表

大纲

CREATE [GLOBAL TEMPORARY] TABLE 
table (table-element-commalist) [shard-key] [WITH table-option-commalist]

table-element ::= 
     [%DESCRIPTION string] 
     [%FILE string] 
     [{%EXTENTSIZE | %NUMROWS} integer] 
     [%PUBLICROWID] 
     [%ROUTINE string] 
   
    { fieldname datatype [AUTO_INCREMENT] | IDENTITY | SERIAL | ROWVERSION 
            [ %DESCRIPTION string ]
           {
             [ [COLLATE] sqlcollation ]
             [ UNIQUE ]
             [ NULL | NOT NULL ]
             [ PRIMARY KEY ]
             [ REFERENCES table  (reffield-commalist) ]
             [ DEFAULT [(]default-spec[)] ]
             [ ON UPDATE update-spec ]
             [ COMPUTECODE { ObjectScript-code } 
                   [ COMPUTEONCHANGE (field-commalist) |
                     CALCULATED | TRANSIENT ] ]
             } , }

     [{ [CONSTRAINT uname] 
          UNIQUE (field-commalist) }]

    [ [CONSTRAINT pkname] 
          PRIMARY KEY (field-commalist) ] 

     [{ [CONSTRAINT fkname] 
          FOREIGN KEY (field-commalist) REFERENCES table 
              [(reffield-commalist)]  
             [ON DELETE ref-action] [ON UPDATE ref-action]  [NOCHECK] }]


[ SHARD [ KEY (field-commalist)  [ COSHARD [ WITH ] [(]table[)] ] ] ]

[WITH table-option ::=
         { %CLASSPARAMETER paramname [=] value } , }
         [ STORAGETYPE [=] {ROW | COLUMN} ]
     ]

sqlcollation ::=
     { %EXACT | %MINUS | %MVR | %PLUS | %SPACE |   
        %SQLSTRING [(maxlen)] | %SQLUPPER [(maxlen)] |
        %TRUNCATE[(maxlen)]  }
0
0 125
文章 姚 鑫 · 九月 11, 2021 3m read

第十三章 SQL命令 CREATE ROLE

创建角色

大纲

CREATE ROLE role-name

参数

  • role-name - 要创建的角色的名称,它是一个标识符。角色名称不区分大小写。

描述

CREATE ROLE命令可创建角色。角色是可以分配给多个用户的一组命名权限。一个角色可以分配给多个用户,一个用户可以分配多个角色。角色在系统范围内可用,它不限于特定的命名空间。

角色名可以是最多64个字符的任何有效标识符。角色名称必须遵循标识符命名约定。角色名称可以包含字符。角色名称不区分大小写。如果选中了支持分隔标识符配置选项(默认设置),则角色名可以是用引号括起来的分隔标识符。如果是分隔标识符,则角色名可以是SQL保留字。它可以包含句点(.)、插入符号()和两个字符的箭头序列()。它不能包含逗号()或冒号()字符。它可以以除星号()以外的任何有效字符开头。

最初创建角色时,角色只是一个名称;它没有权限。要向角色添加权限,请使用命令。还可以使用命令为角色分配一个或多个角色。这允许创建角色层次结构。

如果调用来创建已经存在的角色,SQL会发出错误。可以通过调用$SYSTEM.SQL.Security.RoleExists()方法确定角色是否已存在:

  WRITE $SYSTEM.SQL.Security.RoleExists("%All"),!
  WRITE $SYSTEM.SQL.Security.RoleExists("Madmen")
0
0 148
文章 姚 鑫 · 九月 10, 2021 10m read

第十二章 SQL命令 CREATE QUERY

创建Query

大纲

CREATE QUERY queryname(parameter_list) [characteristics] 
   [ LANGUAGE SQL ]
   BEGIN
code_body ;
   END

CREATE QUERY queryname(parameter_list) [characteristics] 
    LANGUAGE OBJECTSCRIPT
   { code_body }

参数

  • queryname - 要在存储过程类中创建的查询的名称。queryname必须是有效的标识符。过程名可以是限定的(schema.procname),也可以是非限定的()。非限定过程名接受默认模式名。即使没有指定参数,也必须后跟括号。
  • - 可选-传递给查询的参数列表。参数列表用圆括号括起来,列表中的参数用逗号分隔。即使没有指定参数,括号也是必须的。
  • - 可选-指定查询特征的一个或多个关键字。允许的关键字有结果、容器IDFOR、、、。多个特征由空白(空格或换行符)分隔。特性可以以任何顺序指定。
  • , - 可选—指定用于code_body的编程语言的关键字子句。指定语言对象脚本或语言SQL。如果省略了子句,则默认为。
0
0 187
文章 姚 鑫 · 九月 9, 2021 7m read

第十一章 SQL命令 CREATE PROCEDURE(二)

characteristics

用于创建方法的特征与用于创建查询的特征不同。

如果指定的特征无效,系统将生成SQLCODE -47错误。 指定重复的特征将导致SQLCODE -44错误。

可用的方法特征关键字如下:

方法关键字 含义
FOR className 指定要在其中创建方法的类的名称。如果这个类不存在,它将被创建。还可以通过限定方法名来指定类名。FOR子句中指定的类名通过限定方法名重写指定的类名。如果使用FOR my.class语法指定类名, IRIS将用Sqlname=procname定义类方法。因此,该方法应该作为调用(而不是)。
指定子类不能重写该方法。默认情况下,方法不是。关键字由子类继承。
PRIVATE 指定该方法只能由它自己的类或子类的其他方法调用。默认情况下,方法是公共的,可以不受限制地调用。这个限制由子类继承。
指定创建的方法将包含关键字。这一特征短语的所有形式都是同义词。
指定调用该方法返回的值的数据类型。如果省略RETURNS,则该方法不能返回值。这个规范由子类继承,并且可以由子类修改。该数据类型可以指定类型参数,如、MAXVAL和。例如。注意,当返回一个值时, IRIS会忽略数据类型的长度;例如,
0
0 222
文章 Botai Zhang · 一月 26, 2021 3m read

利用Intersystems IRIS医疗版数据平台内置多模型整合

医院信息查询业务解决方案

概述:

随着医院信息化建设的逐步完善医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们利用Intersystems IRIS数据平台内置多模型整合医院信息查询业务解决方案。该应用程序可通过内置模型应用完成查询业务,大大缩小开发、维护、实施等项目关键运转周期。

应用链接:HealthInfoQueryLayer           

关键应用:IRIS for Health、REST APIObjectScriptGlobals SQL、DATA LOOKUP TABLES

应用程序采用模型及应用介绍:

1.采用模型

1.1. Globals (key-value)

Globals是可以在IRIS数据库中存储和管理的稀疏多维数组。您可以使用ObjectScript和本机API处理Globals

工具:

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_MANAGING

应用:

应用程序根据Globals的键值对、访问速度快的特性。

2
0 609
文章 姚 鑫 · 九月 7, 2021 4m read

第九章 SQL命令 CREATE METHOD(二)

characteristics

可用的关键字如下:

  • FOR className - 指定要在其中创建方法的类的名称。 如果这个类不存在,它将被创建。 还可以通过限定方法名来指定类名。 FOR子句中指定的类名通过限定方法名重写指定的类名。
  • FINAL - 指定子类不能重写该方法。 默认情况下,方法不是。 FINAL关键字由子类继承。
  • - 指定该方法只能由它自己的类或子类的其他方法调用。 默认情况下,方法是公共的,可以不受限制地调用。 这个限制由子类继承。
  • - 指定该方法是一个SQL存储过程。 存储过程由子类继承。 (这个关键字可以缩写为PROC。)
  • , - 指定创建的方法将包含关键字。 这一特征短语的所有形式都是同义词。
  • - 指定调用该方法返回的值的数据类型。 如果省略,则该方法不能返回值。 这个规范由子类继承,并且可以由子类修改。 该数据类型可以指定类型参数,如、和。 例如。 注意,当返回一个值时, IRIS会忽略数据类型的长度; 例如,可以接收由调用方法返回的任意长度的字符串。
  • - 仅当为(默认)时使用。 当指定时, IRIS将语句添加到相应的类方法中,从而生成使用指定的在方法中定义的语句。 可能的模式值是、、和。 默认为。
0
0 120
文章 姚 鑫 · 九月 6, 2021 5m read

第八章 SQL命令 CREATE METHOD(一)

在类中创建方法。

大纲

CREATE [STATIC] METHOD name (parameter_list) 
   [ characteristics ]
   [ LANGUAGE SQL ]
   BEGIN
code_body ;
   END

CREATE [STATIC] METHOD name (parameter_list) 
    [ characteristics ]
    LANGUAGE OBJECTSCRIPT
   { code_body }

参数

  • name - 要在存储过程类中创建的方法的名称。 名称必须是有效的标识符。 过程名可以是限定的(schema.procname),也可以是非限定的(procname)。 非限定过程名接受默认模式名。 名称后面必须跟括号,即使没有指定参数。
  • - 可选——传递给方法的参数列表。 参数列表用圆括号括起来,列表中的参数用逗号分隔。 即使没有指定参数,括号也是必须的。
  • - 可选—指定方法特征的一个或多个关键字。 允许的关键字是RETURNS, FOR, , , , 。可以指定特征关键字短语、或,其中是整数。 这些短语是同义词; 关键字和整数为,提供兼容性。
0
0 134
文章 姚 鑫 · 九月 5, 2021 6m read

第七章 SQL命令 CREATE INDEX(二)

UNIQUE关键字

使用UNIQUE关键字,可以指定索引中的每条记录都有一个唯一的值。 更具体地说,这确保了索引(以及包含索引的表)中的两条记录不能具有相同的排序值。 默认情况下,大多数索引使用大写字符串排序(使搜索不区分大小写)。 在本例中,值“Smith”“SMITH”被认为是相等的,而不是唯一的。 不能指定非默认索引字符串排序规则。 通过在类定义中定义索引,可以为各个索引指定不同的字符串排序规则。

可以更改名称空间的默认排序规则,使字段/属性在默认情况下区分大小写。 更改此选项需要重新编译命名空间中的所有类并重新构建所有索引。 转到Management Portal,选择Classes选项,为存储的查询选择名称空间,并使用Compile选项重新编译相应的类。 然后重建所有指数。 它们将区分大小写。

注意:当表的数据被其他用户访问时,不要重建索引。 这样做可能会导致不准确的查询结果。

BITMAP 关键字

使用关键字,你可以指定这个索引将是位图索引。 位图索引由一个或多个位字符串组成,其中位位置表示行,每个位值表示该行字段(或合并字段名字段的值)的特定值的存在()或不存在()。

0
0 170
文章 姚 鑫 · 九月 4, 2021 9m read

第六章 SQL命令 CREATE INDEX(一)

为表创建索引。

大纲

CREATE [UNIQUE | BITMAP | BITMAPEXTENT | BITSLICE ] INDEX index-name
        ON [TABLE] table-name
       (field-name, ...)
       [AS index-class-name [ (parameter-name = parameter_value, ... ) ] ]
       [WITH DATA  (datafield-name, ...)]

参数

  • UNIQUE - 可选的——一个约束,确保表中不会有两行索引中所有字段的值相同。不能为位图或位片索引指定此关键字。UNIQUE关键字后面可以跟(或被)CLUSTERED或关键字替换。 这些关键字是; 它们是为了与其他供应商兼容而提供的。
  • - 可选—表示创建位图索引。 位图索引允许对具有少量不同值的字段进行快速查询。
  • - 可选-表示应该创建位映射范围索引。 一个表最多只能创建一个位映射范围索引。 BITMAPEXTENT中没有指定字段名。
  • BITSLICE - 可选—创建位片索引。 位片索引可以非常快速地计算某些表达式,比如求和和范围条件。 这是一种专门化的索引类型,只能用于解决非常特定的问题。
0
0 125
文章 姚 鑫 · 九月 3, 2021 3m read

第五章 SQL命令 BUILD INDEX

用数据填充一个或多个索引。

大纲

BUILD INDEX [%NOLOCK] [%NOJOURN] FOR TABLE table-name [INDEX index-name [,index-name]]

BUILD INDEX [%NOLOCK] [%NOJOURN] FOR SCHEMA schema-name

BUILD INDEX [%NOLOCK] [%NOJOURN] FOR ALL

参数

  • FOR TABLE table-name - 已存在表的名称。 表名可以是限定的(schema.table),也可以是非限定的(table)。 非限定表名接受默认模式名。
  • - 可选—索引名称或以逗号分隔的索引名称列表。 如果指定,则只构建这些索引。 如果未指定,将构建为表定义的所有索引。
  • - 现有模式的名称。 此命令为指定模式中的所有表构建所有索引。

描述

提供了三种语法形式来构建/重新构建所有已定义的索引:

  • Table: BUILD INDEX FOR TABLE table-name. 可选的INDEX子句允许仅构建/重新构建指定的索引。
  • 模式中的所有表:BUILD INDEX FOR schema schema-name
0
0 144
文章 姚 鑫 · 九月 2, 2021 4m read

第四章 SQL命令 ALTER VIEW

修改视图。

大纲

ALTER VIEW view-name [(column-commalist)] AS query [WITH READ ONLY]

ALTER VIEW view-name [(column-commalist)] AS query [WITH [level] CHECK OPTION]

参数

参数 描述
view-name 被修改的视图,它具有与表名相同的命名规则。视图名可以是限定的(schema.viewname),也可以是非限定的(viewname)。非限定视图名接受默认模式名。
column-commalist 可选-组成视图的列名。如果这里没有指定,可以在查询中指定列名,如下所示。
作为视图基础的结果集(来自查询)。
可选-指定不能通过此视图对视图所基于的表执行插入、更新或删除操作。默认情况下,允许通过视图进行这些操作,约束如下所示。
可选-指定如何通过此视图对视图所基于的表执行插入、更新或删除操作。级别可以是关键字或。如果没有指定级别,则WITH CHECK OPTION默认为级联。

描述

ALTER VIEW命令用于修改视图。 视图基于由语句或由两个或多个SELECT语句组成的组成的查询的结果集。

0
0 110
文章 姚 鑫 · 九月 1, 2021 3m read

第三章 SQL命令 ALTER USER

修改用户密码。

大纲

ALTER USER user-name IDENTIFY BY password

ALTER USER user-name IDENTIFIED BY password

参数

参数 描述
user-name 待修改密码的已有用户名。用户名不区分大小写。
password 用户的新密码。密码必须至少包含3个字符,并且不能超过32个字符。密码区分大小写。密码可以包含Unicode字符。

描述

ALTER USER命令允许更改用户的密码。可以随时更改自己的密码。要更改其他用户的密码,必须拥有%Admin_Secure:USE系统权限。

IDENTIFIED BY关键字是同义词。

必须是已存在的用户。 指定一个不存在的用户将生成一个带有的SQLCODE -400错误,如下所示:。可以通过调用方法来确定用户是否存在。

作为分隔标识符指定的用户名可以是保留字,可以包含逗号()、句号(.)、插入符号()和两个字符的箭头序列()。 它可以以除星号()以外的任何有效字符开头。

密码可以是字符串字面值、数字或标识符。 字符串字面值必须用引号括起来,并且可以包含任何字符组合,包括空格。 数字或标识符不需要用引号括起来。 数字只能由字符0到9组成。 标识符必须以字母(大写或小写)或

0
0 105
文章 姚 鑫 · 八月 31, 2021 10m read

第二章 SQL命令 ALTER TABLE(二)

删除列限制

DROP COLUMN可以删除指定为逗号分隔列表的多个列定义。每个列出的列名后面必须紧跟其RESTORYCASCADE(如果未指定,则默认为)和或(如果未指定,则默认为)选项。

默认情况下,删除列定义不会从数据映射中删除存储在该列中的任何数据。 要同时删除列定义和数据,请指定选项。

删除列定义并不删除相应的列级特权。 例如,授予用户在该列上插入、更新或删除数据的权限。 这将产生以下后果:

  • 如果删除了一个列,然后添加了另一个同名的列,那么用户和角色将在新列上拥有与旧列相同的特权。
  • 删除列后,不可能撤销该列的对象特权。

由于这些原因,通常建议在删除列定义之前使用REVOKE命令从列中撤销列级特权。

关键字(或无关键字):如果列出现在索引中,或者定义在外键约束或其他唯一约束中,则不能删除该列。 为该列尝试失败,并出现SQLCODE -322错误。 默认为。

关键字:如果该列出现在索引中,该索引将被删除。 可能有多个索引。 如果列出现在外键中,则将删除外键。 可能有多个外键。

如果列在或子句中使用,则不能删除该列。 尝试这样做会导致SQLCODE -400错误。

添加约束限制

可以向以逗号分隔的字段列表添加约束。 例如,可以添加约束,它在两个字段和的组合值上建立一个UNIQUE约束。

0
0 121
文章 姚 鑫 · 五月 30, 2021 8m read

第十一章 发送和接收IBM WebSphere MQ消息

InterSystems IRIS为IBM WebSphere MQ提供了一个接口,可以使用该接口在InterSystems IRIS和IBM WebSphere MQ的消息队列之间交换消息。要使用此接口,必须能够访问IBM WebSphere MQ服务器,并且IBM 客户端必须与InterSystems IRIS在同一台计算机上运行。

该接口由和类组成,这两个类都是%Net.abstractMQ的子类。这些类使用由InterSystems IRIS在所有合适的平台上自动安装的动态链接库。(这是Windows上的;其他平台的文件扩展名不同。)。反过来,InterSystems IRIS动态链接库需要IBM 动态链接库。

该界面仅支持发送和接收文本数据,不支持二进制数据。

使用IBM WebSphere MQ的RIS接口

通常,要使用IBM 的InterSystems IRIS接口,请执行以下操作:

  1. 确保有权访问IBM WebSphereMQv7.x或更高版本。具体而言:
  • IBM WebSphere MQ客户端必须与InterSystems IRIS安装在同一台计算机上。请注意,安装程序会根据需要更新环境变量并添加其他系统变量。
0
0 501
文章 姚 鑫 · 五月 28, 2021 5m read

第九章 创建、编写和阅读MIME邮件

Iris提供了一个可以用于创建MultiPart Mime消息(%Net.MimePart)的类。创建要添加到SOAP消息的附件时,请使用此类;请参阅创建Web服务和Web客户端。因为是一个常见的标准,所以有许多其他可能的应用程序,例如电子邮件处理和HTTP Multipart Post。

MIME消息概述

MIME格式的文档被称为MIME部分。每个MIME部件都有标题,包含邮件正文(文本或二进制)或包含额外的MIME部件。具有MIME版本标题的MIME部分可以用作顶级文档,称为MIME消息。下图显示了示例:

image

在该示例中,EF具有未显示的附加子部分。

要表示MIME部件,请使用 类,该类提供用于设置零件的标题和内容的属性。

创建MIME部分

要创建一个MIME部件,执行以下步骤:

  1. 创建%Net.MIMEPart的实例。
  2. 做以下其中一项:
  • 添加文本或二进制正文。为此,请创建流(文本或二进制)的实例,并将MIME部分的Body属性设置为等于该流。使用标准流接口将数据写入此流。不要为属性指定值。
  • 添加MIME部件列表。为此,请按此处所述创建MIME部件,并将属性设置为等于这些部件的列表。不要为属性指定值。
  1. 可以选择按照“设置和获取MIME部件标头”中的说明设置标头。

设置和获取MIME部件标头

可以设置和获取标头的值。

0
0 220
文章 姚 鑫 · 五月 27, 2021 5m read

第八章 处理收到的电子邮件

处理收到的电子邮件

本节介绍如何处理通过%Net.POP3检索到的电子邮件(%Net.MailMessage)。

Message Basics

检索电子邮件(%Net.MailMessage)后,通常首先确定它是哪种类型的邮件以及如何阅读它;也就是说,它是否是多部分邮件以及各部分是否是二进制的。在此步骤中,您可以使用属性。或者,可以使用IsBinary、和属性,它们间接提供与相同的信息。

如果消息是多部分消息,则每个部分都是的一个实例。

Message Headers

消息本身和消息的每个部分都有一组标头。

%Net.MailMessagePart类提供的属性使可以轻松访问最常用的标头。例如,%Net.MailMessage提供收件人、发件人、主题和日期等属性。数组属性允许访问任何自定义标题.

此外,如果已通过检索到消息,则可以使用方法。在给定标头名称和属性的情况下,此方法返回该属性的值。

Message Contents

了解常规消息结构后,请使用以下技术检索内容:

  • 对于多部分消息,请使用Parts属性,该属性是部分的数组。Parts.Count()给出部件的数量。每个部件的键都是一个整数,从1开始。使用方法检索给定的部件。消息部分是的实例。
  • 对于二进制消息(或消息部分),请使用属性。
  • 对于文本消息(或消息部分),请使用属性。
    • 如果IsHTML
0
0 204
文章 姚 鑫 · 五月 26, 2021 6m read

第七章 从POP3服务器提取电子邮件

将附件另存为文件

Content-Disposition标头可以指定附件,可以带文件名,也可以不带文件名。例如:

Content-Disposition: attachment; filename=genome.jpeg;

如果Content-Disposition标头确实指定了附件,则%Net.POP3实例可以将邮件中的所有附件保存到文件。要实现这一点,请执行以下操作:

  1. 指定%Net.POP3实例的以下属性:
  • StoreAttachToFile指定为%1
  • 将指定为。
  • AttachDir指定有效目录。根据操作系统的不同,确保使用斜杠()或反斜杠()结束目录名称。还要确保该目录已经存在,并且用户对其具有写访问权限。
  1. 调用%Net.POP3实例的Fetch()FetchMessage()

每个文件名的确定方式如下:

  1. 如果标头指定了文件名,则使用该文件名。
  2. 否则,如果标头指定了文件名,则使用该文件名。
  3. 否则,系统将创建格式为的名称。

请注意以下几点:

  • 如果该文件已存在,则不会下载附件。
  • 没有默认值。
  • 附件的大小不受IRIS的限制,但可能受文件系统的限制。
  • 这里不使用DirFileName属性。它们仅在将附件上载到邮件时才相关,如向邮件添加附件中所述。

示例:

下面的示例方法在给定实例和邮件编号的情况下检索整个邮件:

0
0 199
文章 姚 鑫 · 五月 25, 2021 7m read

第六章 从POP3服务器提取电子邮件

从POP3服务器提取电子邮件

与POP3服务器通信

如果拥有所需的权限,并且邮件服务器正在运行,则可以使用POP3协议从该服务器下载和处理电子邮件。通常,要与POP3服务器通信,请登录,执行一系列影响邮箱的操作,然后提交或回滚任何更改。要在系统间IRIS中执行此操作,请执行以下操作:

  1. 创建%Net.POP3的实例。此对象描述将使用的POP3服务器。
  2. 可以选择指定%Net.POP3实例的以下属性:
  • -指定要使用的端口;默认值为。
  • timeout 超时-指定读取超时(以秒为单位);默认值为30秒。
  • -指定在读取邮件时(当邮件包含Content-Disposition;附件标题时)是否将每个附件保存到文件。默认值为False。请注意,除非还设置了,否则此设置不起任何作用。
  • -指定在读取邮件时(当邮件包含;内联标题时)是否将每个内联附件保存到文件中。默认值为False。请注意,除非还设置了AttachDir,否则此设置不起任何作用。
  • -指定将附件保存到的目录。没有违约。根据操作系统的不同,确保使用斜杠()或反斜杠()结束目录名称。还要确保该目录已经存在,并且用户对其具有写访问权限。
  • -指定是否忽略在解码期间发现的无效字符。默认值为FALSE(无效字符会导致错误)。请注意,对于应忽略意外字符还是应在解码期间导致错误的问题含糊不清。
  1. 要使用
0
0 187
文章 姚 鑫 · 五月 24, 2021 7m read

第五章 向邮件添加附件

向邮件添加附件

可以将附件添加到电子邮件或消息部分(具体地说,是添加到%Net.MailMessagePart%Net.MailMessage的实例)。要执行此操作,请使用以下方法:

这些方法中的每一种都会将附件添加到原始邮件(或邮件部分)的Parts数组中,并自动将属性设置为1。

AttachFile()

method AttachFile(Dir As %String, 
                  File As %String, 
                  isBinary As %Boolean = 1, 
                  charset As %String = "", 
                  ByRef count As %Integer) as %Status

将给定文件附加到电子邮件。默认情况下,文件以二进制附件的形式发送,但您可以将其指定为文本。如果文件是文本,还可以指定该文件使用的字符集。

具体地说,此方法创建的实例,并根据需要将文件内容放在BinaryData或属性中,并根据需要设置属性和属性。该方法通过引用返回一个整数,该整数指示此新消息部分在部件数组中的位置。

此方法还设置消息或消息部分的和属性。

AttachStream()

method AttachStream(stream As %Stream.Object, 
                    Filename As %String, 
                    isBinary As %Boolean = 1, 
                    charset As %String = "", 
                    ByRef count As %Integer) as %Status
0
0 138
文章 姚 鑫 · 五月 23, 2021 7m read

第四章 收发电子邮件

本主题描述如何使用InterSystems IRIS发送和接收MIME电子邮件消息。

注意:本主题中的示例是经过组织的,因此管理电子邮件的方法可以用于不同的电子邮件服务器,这在测试和演示期间非常有用。这不一定是最适合生产需要的代码组织。

支持电子邮件协议

电子邮件使用标准协议通过Internet发送消息。 InterSystems IRIS支持以下三种协议:

  • InterSystems IRIS提供MIME电子邮件的对象表示形式。它支持文本和非文本附件、单部分或多部分邮件正文,以及ASCII和非ASCII字符集的标题。
  • 可以通过服务器发送电子邮件。(简单邮件传输协议)是发送电子邮件的Internet标准。
  • 还可以通过POP3从电子邮件服务器检索电子邮件,是从远程服务器检索电子邮件的最常用标准。

注意:InterSystems IRIS不提供邮件服务器。相反,它提供了连接到邮件服务器并与之交互的功能。

InterSystems IRIS如何表示电子邮件

首先,了解InterSystems IRIS如何表示电子邮件非常有用。

通常,多部分MIME邮件由以下部分组成:

  • 一组邮件标头,每个标头都包含邮件发送到的地址等信息。这还包括整个消息的标头和标头。

对于多部分消息,头必须是多部分/混合或多部分的其他子类型;MIME

0
0 161
文章 姚 鑫 · 五月 23, 2021 6m read

第三章 发送HTTP请求

发送HTTP请求

创建HTTP请求后,使用以下方法之一发送该请求:

Delete()

method Delete(location As %String = "", 
              test As %Integer = 0, 
              reset As %Boolean = 1) as %Status

发出HTTP DELETE请求。

Get()

method Get(location As %String = "", 
           test As %Integer = 0, 
           reset As %Boolean = 1) as %Status

发出HTTP GET请求。此方法使Web服务器返回请求的页面。

Head()

method Head(location As %String, 
            test As %Integer = 0, 
            reset As %Boolean = 1) as %Status

发出HTTP Head请求。此方法使Web服务器仅返回响应头,而不返回正文。

0
0 193
文章 姚 鑫 · 五月 19, 2021 2m read

IRIS 单元测试

第一章 单元测试概述☆☆☆☆

第二章 使用%UnitTest进行单元测试☆☆☆☆

第三章 执行测试☆☆☆

第四章 使用Setup和tear Down方法执行测试☆☆☆

前言

IRIS提供了用于对应用程序进行单元测试的类的%UnitTest包。该包为快速开发单元测试类、执行测试和创建报告提供了便利。可以直接使用该包,也可以扩展其类来自定义单元测试工具。%UnitTest在结构上与用于单元测试的xUnit框架非常相似。熟悉这些框架的开发人员使用%UnitTest会特别容易。

本教程提供对%UnitTest包的快速实践介绍。本教程的第一部分和第二部分是相互独立的,可以按任何顺序完成。

  • 完成本教程的第一部分,了解单元测试和集成测试之间的区别、xUnit框架和%UnitTest之间的结构相似性,以及单元测试在敏捷应用程序开发方法中的作用。
  • 完成本教程的第二部分,学习如何使用%UnitTest中的类为InterSystems IRIS应用程序创建和执行单元测试。

注意:本教程假定基本熟悉ObjectScript和InterSystems IRIS的面向对象开发。

预告

下一期系列将用一个月的时间连载,《Caché 网络实用工具》,敬请期待。

交流群

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9VqwzNP-1608850948003)(3E1D939266954ED48BDAEA9B8086B11E)]

0
0 234
文章 姚 鑫 · 五月 18, 2021 6m read

第四章 使用Setup和tear Down方法执行测试

示例:使用Setup和tear Down方法执行测试

以通常的方式执行新的单元测试。

  1. 在一直在使用的命名空间中打开终端。
  2. ^UnitTestRoot的值设置为包含测试类的目录的父级:
USER> Set ^UnitTestRoot="c:\unittests"
  1. 使用%UnitTest.Manager执行测试:
USER> Do ##class(%UnitTest.Manager).RunTest("mytests")
  1. IRIS加载测试类、编译类、执行测试并向终端发送报告。

===============================================================================
Directory: C:\unittests\mytests\cls\MyPackage\
===============================================================================
mytests\cls\MyPackage begins ...
Load of directory started on 01/09/2018 14:36:57 '*.xml;*.XML;*.cls;*.mac;*.int;*.inc;*.CLS;*.MAC;*.INT;*.INC'

Loading file C:\unittests\mytests\cls\MyPackage\Tests.xml as xml
Imported class: MyPackage.Tests

Compilation started on 01/09/2018 15:44:01 with qualifiers ''
Compiling class MyPackage.Tests
Compiling routine MyPackage.Tests.1
Compilation finished successfully in 0.033s.

Load finished successfully.
 
  MyPackage.Tests begins ...
      TestAdd() begins ...
        AssertEquals:Test Add(2,2)=4 (passed)
        AssertNotEquals:Test Add(2,2)'=5 (passed)
        LogMessage:Duration of execution: .000073 sec.
      TestAdd passed
      TestEditContact() begins ...
        AssertStatusNotOK:ContactType = Friend (passed)
        AssertStatusOK:ContactType = Personal (passed)
        LogMessage:Duration of execution: .001227 sec.
      TestEditContact passed
    MyPackage.Tests passed
  mytests\cls\MyPackage passed
 
Use the following URL to view the result:
http://10.0.75.1:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=10&$NAMESPACE=USER
All PASSED
 
0
0 125