2021年3月19日,在InterSystems极客俱乐部首次进行的直播课中,InterSystems中国售前支持专家刘皆良( @Jeff Liu )分享了一个有趣的主题:告诉你从Caché数据库升级到InterSystems IRIS数据平台的N个理由。直播视频贴上,欢迎大家围观。
第十二章 使用嵌入式SQL(六)
持久类方法中的嵌入式SQL
下面的示例显示了一个持久类,其中包含一个类方法和一个实例方法,两者都包含嵌入式SQL:
Class Sample.MyClass Extends %Persistent [DdlAllowed]
{
ClassMethod NameInitial(Myval As %String) As %String [SqlProc]
{
&sql(SELECT Name INTO :n FROM Sample.Stuff WHERE Name %STARTSWITH :Myval)
IF SQLCODE<0 {WRITE "SQLCODE error ",SQLCODE RETURN %msg}
ELSEIF SQLCODE=100 {WRITE "Query returns no results" RETURN}
WRITE "Hello " RETURN n
}
Method CountRows() As %Integer
{
&sql(SELECT COUNT(*) INTO :count FROM Sample. 第十二章 使用嵌入式SQL(五)
嵌入式SQL变量
以下局部变量在嵌入式SQL中具有特殊用途。这些局部变量名称区分大小写。在过程启动时,这些变量是不确定的。它们由嵌入式SQL操作设置。也可以使用SET命令直接设置它们,或使用NEW命令将其重置为未定义。像任何局部变量一样,值将在过程持续期间或直到设置为另一个值或使用NEW进行定义之前一直存在。例如,某些成功的嵌入式SQL操作未设置%ROWID。执行这些操作后,%ROWID是未定义的或保持设置为其先前值。
%msg%ROWCOUNT%ROWIDSQLCODE
这些局部变量不是由Dynamic SQL设置的。 (请注意,SQL Shell和Management Portal SQL接口执行Dynamic SQL。)相反,Dynamic SQL设置相应的对象属性。
在嵌入式SQL中使用以下ObjectScript特殊变量。这些特殊的变量名称不区分大小写。在过程启动时,这些变量将初始化为一个值。它们由嵌入式SQL操作设置。不能使用SET或NEW命令直接设置它们。
$TLEVEL$USERNAME
作为已定义的InterSystems IRIS嵌入式SQL接口的一部分,InterSystems IRIS可以在嵌入式SQL处理期间设置任何这些变量。
第十二章 使用嵌入式SQL(四)
SQL游标
游标是指向数据的指针,该数据允许嵌入式SQL程序对所指向的记录执行操作。通过使用游标,Embedded SQL可以遍历结果集。嵌入式SQL可以使用游标执行查询,该查询从多个记录返回数据。嵌入式SQL还可以使用游标更新或删除多个记录。
必须首先对SQL游标进行DECLARE,并为其命名。在DECLARE语句中,提供了SELECT语句,该语句标识游标将指向的记录。然后,将此游标名称提供给OPEN游标语句。然后,反复发出FETCH游标语句以遍历SELECT结果集。然后,发出CLOSE游标语句。
- 基于游标的查询使用
DECLARE游标名称CURSOR FOR SELECT来选择记录,并(可选)将select列值返回到输出主机变量中。FETCH语句遍历结果集,使用这些变量返回选定的列值。 - 基于游标的
DELETE或UPDATE使用DECLARE游标名CURSOR FOR SELECT选择操作的记录。没有指定输出主机变量。FETCH语句遍历结果集。DELETE或UPDATE语句包含WHERE CURRENT OF子句,以标识当前光标位置,以便对所选记录执行操作。
请注意,游标不能跨越方法。因此,必须在同一类方法中声明,打开,获取和关闭游标。在生成类和方法的所有代码(例如从.CSP文件生成的类)中考虑这一点很重要。
第十二章 使用嵌入式SQL(三)
主机变量
主机变量是将文字值传入或传出嵌入式SQL的局部变量。 最常见的是,主机变量用于将本地变量的值作为输入值传递给Embedded SQL,或者将SQL查询结果值作为输出主机变量传递给Embedded SQL查询。
主机变量不能用于指定SQL标识符,例如架构名称,表名称,字段名称或游标名称。主机变量不能用于指定SQL关键字。
- 输出主机变量仅在嵌入式SQL中使用。它们在
INTO子句中指定,INTO子句是仅嵌入式SQL支持的SQL查询子句。 - 输入主机变量可以在嵌入式SQL或动态SQL中使用。在动态SQL中,还可以使用
“?”向SQL语句输入文字。输入参数。这”?”语法不能在Embedded SQL中使用。
在嵌入式SQL中,可以在可以使用文字值的任何位置使用输入主机变量。使用SELECT或FETCH语句的INTO子句指定输出主机变量。
注意:当SQL NULL输出到ObjectScript时,它由一个ObjectScript空字符串(“”)表示,该字符串的长度为零。
要将变量或属性引用用作宿主变量,请在其前面加上一个冒号(:)。 嵌入式InterSystems SQL中的主机变量可以是以下之一:
- 一个或多个ObjectScript局部变量,例如:
myvar,指定为以逗号分隔的列表。局部变量可以完全形成并且可以包含下标。
第十二章 使用嵌入式SQL(二)
嵌入式SQL代码
简单的SQL语句
可以将简单的SQL语句(单个嵌入式SQL语句)用于各种操作,包括:
INSERT,UPDATE,INSERT OR UPDATE和DELETE语句。- `DDL语句。
GRANT和REVOKE语句。- 只返回一行的
SELECT语句(或者如果只对返回的第一行感兴趣)。
简单的SQL语句也被称为非基于游标的SQL语句。本章稍后将介绍基于游标的嵌入式SQL。
例如,以下语句查找ID为43的(唯一的)患者的姓名:
&sql(SELECT Name INTO :name
FROM Patient
WHERE %ID = 43)
如果对可以返回多行的查询使用简单语句,则只返回第一行:
&sql(SELECT Name INTO :name
FROM Patient
WHERE Age = 43)
根据查询的不同,不能保证哪一行将首先被返回。此外,如果一个查询包含一个INTO语句,并且该表不包含任何数据(SQLCODE=100),执行该查询将导致未定义(空)的输出主机变量。因此,在访问输出主机变量之前,所有简单嵌入式SQL语句都应该测试SQLCODE=0。
架构名称解析
表名,视图名或存储过程名是合格的(指定架构名称)或不合格的(不指定架构名称)。
中文社区的开发者们,大家好!
我们调整了开发者社区的积分规则,将其调整为双倍积分!
通过持续进行云投资,InterSystems能够提供礼宾级的云服务。
第十二章 使用嵌入式SQL(一)
可以将SQL语句嵌入InterSystemsIRIS®数据平台使用的ObjectScript代码中。这些嵌入式SQL语句在运行时转换为优化的可执行代码。
嵌入式SQL有两种:
- 一个简单的嵌入式SQL查询只能返回单行中的值。简单嵌入式SQL还可以用于单行插入,更新和删除以及其他SQL操作。
- 基于游标的嵌入式SQL查询可以遍历查询结果集,并从多行中返回值。基于游标的嵌入式SQL也可以用于多行更新和删除SQL操作。
注意:嵌入式SQL不能输入到Terminal命令行,也不能在XECUTE语句中指定。要从命令行执行SQL,请使用$SYSTEM.SQL.Execute()方法或SQL Shell接口。
编译嵌入式SQL
当包含嵌入式SQL的例程被编译时,嵌入式SQL不会被编译。 相反,嵌入式SQL的编译发生在SQL代码的第一次执行(运行时)。 第一次执行定义了一个可执行的缓存查询。 这与动态SQL的编译类似,在动态SQL中,直到执行SQL Prepare操作才编译SQL代码。
直到第一次执行例程,嵌入式SQL代码才会根据SQL表和其他实体进行验证。 因此,可以编译包含嵌入式SQL的持久化类的例程或方法,这些SQL引用在例程编译时不存在的表或其他SQL实体。 由于这个原因,大多数SQL错误是在运行时执行时返回的,而不是编译时返回的。
第十一章 SQL隐式联接(箭头语法)
InterSystems SQL提供了一个特殊的–>运算符,作为从相关表中获取值的快捷方式,而在某些常见情况下无需指定显式的JOIN即可。可以使用此箭头语法代替显式联接语法,也可以将其与显式联接语法结合使用。箭头语法执行左外部联接。
箭头语法可用于类的属性或父表的关系属性的引用。其他类型的关系和外键不支持箭头语法。不能在ON子句中使用箭头语法(–>)。
属性引用
可以使用- >操作符作为从“引用表”获取值的简写。
例如,假设定义了两个类:Company:
Class Sample.Company Extends %Persistent [DdlAllowed]
{
/// The Company name
Property Name As %String;
}
Employee:
Class Sample.Employee Extends %Persistent [DdlAllowed]
{
/// The Employee name
Property Name As %String;
/// The Company this Employee works for
Property Company As Company;
}
Employee类包含一个属性,该属性是对Company对象的引用。
在基于对象的应用程序中,可以使用点语法遵循此引用。
嗨,开发者们,
欢迎查询 [InterSystems Developers YouTube 频道] InterSystems Developers YouTube Channel:
|
按观看次数排名前 10 的视频 |
||
| № | Video | Views |
| 1 | Active Directory 与 LDAP 的集成 | 13 079 |
| 2 | FHIR 上的 SMART:基础知识 | 7 463 |
| 3 | 构建现代 Web 应用程序 | 6 133 |
| 4 | 使用 Visual Studio Code 编写 ObjectScript | 5 491 |
| 5 | 使用 FHIR 进行开发 - REST API | 5 195 |
| 6 | 使用 IRIS 社区版、GitHub、Docker 和 VSCode 创建你的第一段 InterSystems ObjectScript 代码 | 1 487 |
| 7 | 托管文件传输 | 1 326 |
| 8 | 规模调整和容量计划 | 1 200 |
| 9 | 使用 Visual Studio Code 和 ObjectScript | 1 155 |
| 10 | 5 分钟内为 InterSystems IRIS 创建 CRUD REST API | 1 013 |
大家好, 现在是九局下半,但在我们的技术世界大赛还留了几手
JDBC 兼容性状态 **这是一篇 [InterSystems 常见问题解答网站](https://faq.intersystems.co.jp/)文章。
版本 2009.1 及更高版本与 JDBC 4.0 API 兼容。 有关详细信息,请查阅以下文档。 [关于 JDBC 支持](First Look: JDBC and InterSystems Databases - InterSystems IRIS Data Platform 2020.3
)
第十章 SQL排序(二)
查询排序
InterSystems SQL提供了排序规则功能,可用于更改字段的排序规则或显示。
我们的承诺
为了建设一个开放、包容的环境,我们(社区贡献者、社区版主、社区经理)承诺为使用InterSystems开发者社区的所有成员提供没有任何骚扰的环境,而不论其年龄、体型、残障、种族、性别认同和表达、经验水平高低、国籍、外表、种族、宗教或性取向。
第十章 SQL排序
排序规则指定值的排序和比较方式,并且是InterSystems SQL和InterSystemsIRIS®数据平台对象的一部分。有两种基本排序规则:数字和字符串。
- 数值排序规则按以下顺序基于完整数字对数字进行排序:
null,然后是负数,从最大到最小,零,然后是正数,从最小到最大。这将创建如下序列:–210,–185,–54,–34,-.02、0、1、2、10、17、100、120。 - 字符串归类通过对每个顺序字符进行归类来对字符串进行排序。这将创建以下顺序:
null,A,AA,AA,AAA,AAB,AB,B。对于数字,这将创建以下顺序:–.02,–185,–210,–34,–54 ,0、1、10、100、120、17、2。
默认的字符串排序规则是SQLUPPER;为每个名称空间设置此默认值。 SQLUPPER排序规则将所有字母都转换为大写(出于排序的目的),并在字符串的开头附加一个空格字符。此转换仅用于整理目的;在InterSystems中,无论所应用的排序规则如何,SQL字符串通常以大写和小写字母显示,并且字符串的长度不包括附加的空格字符。
时间戳记是一个字符串,因此遵循当前的字符串排序规则。但是,由于时间戳是ODBC格式,因此如果指定了前导零,则字符串排序规则与时间顺序相同。
第九章 SQL查询数据库(二)
调用用户定义函数的查询
InterSystems SQL允许您在SQL查询中调用类方法。这为扩展SQL语法提供了强大的机制。
若要创建用户定义的函数,请在持久性InterSystems IRIS类中定义一个类方法。该方法必须具有文字(非对象)返回值。这必须是一个类方法,因为在SQL查询中将没有对象实例可以在其上调用实例方法。还必须将其定义为SQL存储过程。
例如,我们可以在MyApp.Person类中定义一个Cube()方法:
Class MyApp.Person Extends %Persistent [DdlAllowed]
{
/// Find the Cube of a number
ClassMethod Cube(val As %Integer) As %Integer [SqlProc]
{
RETURN val * val * val
}
}
可以使用CREATE FUNCTION,CREATE METHOD或CREATE PROCEDURE语句创建SQL函数。
要调用SQL函数,请指定SQL过程的名称。可以在可能指定标量表达式的任何地方以SQL代码调用SQL函数。函数名称可以使用其架构名称进行限定,也可以不限定。不合格的函数名称采用用户提供的模式搜索路径或系统范围内的默认模式名称。函数名称可以是定界标识符。
第九章 SQL查询数据库
查询类型
查询是执行数据检索并生成结果集的语句。查询可以包含以下任意项:
- 一个简单的
SELECT语句,用于访问指定表或视图中的数据。 - 具有
JOIN语法的SELECT语句,用于访问多个表或视图中的数据。 - 合并多个
SELECT语句的结果的UNION语句。 - 使用
SELECT语句为封闭的SELECT查询提供单个数据项的子查询。 - 在嵌入式SQL中,这是一个使用SQL游标通过
FETCH语句访问多行数据的SELECT语句。
使用SELECT语句
SELECT语句从一个或多个表或视图中选择一行或多行数据。下面的示例显示了一个简单的SELECT:
SELECT Name,DOB FROM Sample.Person WHERE Name %STARTSWITH 'A' ORDER BY DOB

在此的示例Name和DOB是Sample.Person表中的列(数据字段)。
在SELECT语句中必须指定子句的顺序是:SELECT DISTINCT TOP ...选择项INTO ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY。这是命令语法顺序。所有这些子句都是可选的,但SELECT选择项除外。
SELECT子句的执行顺序
可以通过注意SELECT语句的语义处理顺序(与SELECT语法顺序不同)来理解
原文在这里。
我正在参加 Joel Solon 讲授的“使用 InterSystems Objects 和 SQL 进行开发”课程。 课程非常好,我将在这里分享一些从培训中总结的提示。
亲爱的社区开发者们,
我很高兴地向大家介绍一位我们的新版主@姚鑫
亲爱的社区开发者们,
北京时间3月19日下午14:00-16:00,我们将举办一次线上直播,聚焦InterSystems 数据平台与WRC服务,为您答疑解惑!今天隆重向大家介绍此次直播的主讲人!
亲爱的社区开发者们,
我们的社区正在日渐壮大!我们现在已经有了英语、西语、葡语、日语和中文社区,不论你在哪个社区发帖或评论,都可以获得Global Master倡导中心的积分,而最重要的是,在中文社区,你会获得更高积分!
用 2019 版IRIS怎么实现大数据量表的分页查询?比如表里有200万条数据。
第八章 SQL修改数据库
可以对现有的表使用SQL语句,也可以对相应的持久化类使用ObjectScript操作来修改InterSystems IRIS®数据平台数据库的内容。 不能修改定义为只读的持久类(表)。
使用SQL命令为维护数据的完整性提供了自动支持。 SQL命令是一个原子操作(全部或没有)。 如果表上定义了索引,SQL将自动更新它们以反映更改。 如果定义了任何数据或引用完整性约束,SQL将自动执行它们。 如果有任何已定义的触发器,执行这些操作将拉动相应的触发器。
插入数据
可以使用SQL语句或设置和保存持久化类属性将数据插入表中。
使用SQL插入数据
INSERT语句将一条新记录插入SQL表中。
可以插入一条记录或多条记录。
下面的示例插入一条记录。 它是插入单个记录的几种可用语法形式之一:
INSERT INTO MyApp.Person
(Name,HairColor)
VALUES ('Fred Rogers','Black')
以下示例通过查询现有表中的数据插入多条记录:
INSERT INTO MyApp.Person
(Name,HairColor)
SELECT Name,Haircolor FROM Sample.Person WHERE Haircolor IS NOT NULL
还可以发出INSERT或UPDATE语句。
新冠肺炎疫情大流行史无前例地推动着医疗数字化发展,这一进程不仅影响了医疗服务的提供方式,更带来深刻的行业服务模式变革。经济学人邀请了来自数据技术提供商InterSystems、初级医疗服务提供商Babylon、咨询服务提供商埃森哲、数字化医疗解决方案提供商Kaiser Permanente的专家,从各自的领域和观察出发解读多个热点话题。
亲爱的社区用户,您好!
我们在 Global Masters上推出了商业服务奖励计划,这是一个绝佳的契机,您可以在开发者社区和我们的社交媒体上宣传贵公司的应用、解决方案和服务,甚至为您的 OEX 应用兑换 Google AdWords 推广!
大家好!InterSystems Global Masters 倡导中心与开发者社区紧密联系并不是秘密。 为开发者社区做出任何贡献都会带来 Global Masters 积分。 所以, 我们准备了一份关于如何在 Global Masters 以最佳方式获得积分的简短指南。
亲爱的社区开发者,
我们诚挚邀请您参加 InterSystems编程大奖赛获奖成员线上见面会!
时间: 周五(2021年3月12日)-22:00(北京时间)
在此次线上见面会,您可以:
- 了解获胜者的个人履历
- 观看获奖应用的简短demo
- 针对此次大奖赛使用到的技术、奖金和各类疑问,您可以畅所欲言,各抒己见,为下一次竞赛做准备!
线上见面会参与成员:
- @Dmitriy Maslennikov, CaretDev Corp联合创始人、首席技术官和开发者倡导者,
- @José Roberto Pereira, Shift Consultoria e Sistemas Ltda BI开发者
- @Henrique Dias Dias, Sao Paulo Federal Court 系统管理专家/数据库管理员
- @Botai Zhang, 中国开发者
- @Weiwei Yang, 中国开发者
- @Evgeny Shvarov, InterSystems 开发者生态系统经理
您还将有机会在一个特别的网络研讨会上向我们的开发人员提出任何问题。
欢迎您参加线上见面会!
现在就来报名吧!
第七章 SQL表之间的关系
要在表之间强制执行引用完整性,可以定义外键。修改包含外键约束的表时,将检查外键约束。
定义外键
有几种方法可以在InterSystems SQL中定义外键:
- 可以定义两个类之间的关系。定义关系会自动将外键约束投影到SQL。
- 可以在类定义中添加显式外键定义(对于关系未涵盖的情况)。
- 可以使用
CREATE TABLE或ALTER TABLE命令添加外键。可以使用ALTER TABLE命令删除外键。
用作外键引用的RowID字段必须是公共的。引用隐藏的RowID?有关如何使用公用(或专用)RowID字段定义表的信息。
一个表(类)的外键最大数目为400。
外键引用完整性检查
外键约束可以指定更新或删除时的引用操作。
在CREATE TABLE reference action子句中描述了使用DDL定义这个引用操作。
在类定义引用的OnDelete和OnUpdate外键关键字中定义了一个持久化类来定义这个引用操作,该类投射到一个表。
在创建分片表时,这些引用操作必须设置为无操作。
默认情况下,InterSystemsIRIS®数据平台对INSERT,UPDATE和DELETE操作执行外键引用完整性检查。如果该操作将违反参照完整性,则不会执行;该操作将发出SQLCODE -121,-122,-123或-124错误。


