技术概要:InterSystems IRIS Native API for Python
目录
目录
目录
为什么是容器(Container)?
一个SELECT子句,指定在宿主变量中存储选定的值。
INTO :hostvar1 [,:hostvar2]...
:hostvar1 - 在宿主语言中声明的输出宿主变量。
当在INTO子句中指定时,变量名前面加冒号(:)。
主机变量可以是局部变量(非下标或下标)或对象属性。
可以将多个变量指定为逗号分隔的列表、单个下标数组变量或逗号分隔的列表和单个下标数组变量的组合。INTO子句和主机变量仅在嵌入式SQL中使用。它们不在动态SQL中使用。在动态SQL中,%SQL.Statement类为输出变量提供了类似的功能。在通过ODBC、JDBC或动态SQL处理的SELECT查询中指定INTO子句会导致SQLCODE-422错误。
INTO子句可以在SELECT、DECLARE或FETCH语句中使用。INTO子句对于所有三个语句都是相同的;本页上的示例都引用SELECT语句。
INTO子句使用在SELECT-ITEM列表中检索(或计算)的值来设置相应的输出主机变量,从而使这些返回的数据值可用于ObjectScript。在SELECT中,可选INTO子句出现在SELECT-ITEM列表之后、FROM子句之前。
InterSystems很高兴地宣布一个全新的 开发者下载网站 提供InterSystems IRIS社区版和InterSystems IRIS for Health社区版的完整配套版本。 这些都是免费提供给应用开发者使用的。
你可以选择直接从 InterSystems开发者社区 直接 下载 InterSystems IRIS.
在表中添加新行或更新表中的现有行。
INSERT OR UPDATE [%keyword] [INTO] table
SET column = scalar-expression {,column2 = scalar-expression2} ... |
[ (column{,column2} ...) ] VALUES (scalar-expression {,scalar-expression2} ...) |
VALUES :array() |
[ (column{,column2} ...) ] query |
DEFAULT VALUES
下面的嵌入式SQL示例创建一个新表SQLUser.MyKids。下面的示例使用INSERT用数据填充此表。在插入示例之后,提供了一个删除SQLUser.MyKids的示例。
ClassMethod Insert2()
{
&sql(
CREATE TABLE SQLUser.MyKids
(
KidName VARCHAR(16) UNIQUE NOT NULL,
KidDOB INTEGER NOT NULL,
KidPetName VARCHAR(16) DEFAULT 'no pet'
)
)
if SQLCODE=0 {
w !,"创建的表"
} elseif SQLCODE=-201 {
w !,"表已存在"
q
} else {
w !,"CREATE TABLE失败。SQLCODE=",SQLCODE
}
}
下面的嵌入式SQL示例插入具有两个字段值的行(第三个字段KidPetName采用默认值)。请注意,表架构名称由#SQLCompile Path宏指令作为架构搜索路径提供:
默认情况下,INSERT是要么全有要么全无的事件:要么完全插入行,要么根本不插入行。 IRIS返回一个状态变量SQLCODE,指示插入是成功还是失败。要将行插入到表中,插入操作必须满足所有表、字段名和字段值要求,如下所示。
表:
SQLCODE-30错误。READONLY。尝试编译引用ReadOnly表的插入会导致SQLCODE-115错误。请注意,此错误是在编译时发出的,而不是在执行时发出的。SQLCODE-35错误。如果视图基于分割表,则不能通过使用CHECK OPTION定义的视图进行插入。尝试这样做会导致SQLCODE-35,其中不允许基于带有CHECK选项条件的切片表的视图(sample.myview)使用%msg INSERT/UPDATE/DELETE。字段名称:
亲爱的开发者们,
是否准备参加InterSystems 2021全球峰会呢?不要错过InterSystems Developer Community、Open Exchange和Global Masters的专题会议!
⚡️ "Win. Win. Win with InterSystems Developer Ecosystem" VSummit21 session ⚡️

🎁 注意:所有参会者都将获得额外奖励哦~
分享嘉宾:
🗣 @Anastasia Dyubaylo, InterSystems开发者社区经理
🗣 @Lena Evsikova, Product Owner of InterSystems Open Exchange
🗣 @Olga Zavrazhnova, Customer Advocacy Manager, InterSystems
可以将以下类型的数据值插入到流字段中:
set literal="Technique 1"
//do the insert; use a string
&sql(INSERT INTO MyStreamTable (MyStreamField) VALUES (:literal))
OREF)。 IRIS打开此对象并将其内容复制到新的流字段中。例如: set oref=##class(%Stream.GlobalCharacter).%New()
do oref.Write("Technique non-shard 1")
//do the insert; use an actual OREF
&sql(INSERT INTO MyStreamTable (MyStreamField) VALUES (:oref))
或流的OREF的字符串版本,例如:
10月26日-29日,InterSystems 2021全球线上峰会将聚焦于“Analytics”,为您提供全球先进经验和分享。
向表中添加新行(或多行)。
INSERT [%keyword] [INTO] table
SET column1 = scalar-expression1
{,column2 = scalar-expression2} ... |
[ (column1{,column2} ...) ]
VALUES (scalar-expression1 {,scalar-expression2} ...) |
VALUES :array() |
[ (column1{,column2} ...) ] query |
DEFAULT VALUES
IN谓词用于将值与一系列非结构化的项进行匹配。
%INLIST谓词是 IRIS扩展,用于将值与列表结构的元素进行匹配。
使用任一谓词,都可以执行相等比较和子查询比较。
在中有两种格式。第一个用作使用与OR运算符链接在一起的多个相等比较的速记。例如:
SELECT Name, Home_State FROM Sample.Person
GROUP BY Home_State
HAVING Home_State IN ('ME','NH','VT','MA','RI','CT')
如果Home_State等于括号列表中的任意值,则计算为TRUE。列表元素可以是常量或表达式。排序规则适用于IN比较,因为它适用于相等性测试。默认情况下,IN比较使用字段定义的排序规则类型;默认情况下,字符串字段定义为SQLUPPER,不区分大小写。
当日期或时间用于IN谓词相等比较时,会自动执行适当的数据类型转换。如果HAVING子句字段是TIMESTAMP类型,则DATE或TIME类型的值将转换为TIMESTAMP。如果HAVING子句字段为DATE类型,则TIMESTAMP或STRING类型的值将转换为DATE。如果HAVING子句字段为TIME类型,则TIMESTAMP或STRING类型的值将转换为TIME。
对一组数据值指定一个或多个限制性条件的SELECT子句。
SELECT field
FROM table
GROUP BY field
HAVING condition-expression
SELECT aggregatefunc(field %AFTERHAVING)
FROM table
[GROUP BY field]
HAVING condition-expression
condition-expression - 由一个或多个布尔谓词组成的表达式,用于控制要检索哪些数据值。可选的HAVING子句出现在FROM子句、可选的WHERE和GROUP BY子句之后,可选的ORDER BY子句之前。
SELECT语句的HAVING子句限定或取消查询选择中的特定行。符合条件的行是条件表达式为真的行。条件表达式是一系列逻辑测试(谓词),它们可以通过AND和OR逻辑运算符链接起来。
HAVING子句类似于WHERE子句,它可以在组上操作,而不是在整个数据集上操作。因此,在大多数情况下,HAVING子句要么与使用%AFTERHAVING关键字的聚合函数一起使用,要么与GROUP BY子句结合使用,或者两者兼而有之。
HAVING子句条件表达式还可以指定聚合函数。WHERE子句条件表达式不能指定聚合函数。下面的示例显示了这一点:
SELECT子句,它根据一个或多个列对查询的结果行进行分组。
SELECT ...
GROUP BY field {,field2}
field - 从其中检索数据的一个或多个字段。
单个字段名或以逗号分隔的字段名列表。GROUP BY是SELECT命令的一个子句。
可选的GROUP BY子句出现在FROM子句和可选的WHERE子句之后,可选的HAVING和ORDER BY子句之前。
GROUP BY子句接受查询的结果行,并根据一个或多个数据库列将它们分成单独的组。
当将SELECT与GROUP BY结合使用时,将为GROUP BY字段的每个不同值检索一行。
GROUP BY将NULL(没有指定值)字段作为一个独立的值组。
GROUP BY子句在概念上类似于 IRIS聚合函数扩展关键字%FOREACH,但是GROUP BY操作整个查询,而%FOREACH允许在子填充上选择聚合,而不限制整个查询填充。
GROUP BY可以在INSERT命令的SELECT子句中使用。
不能在UPDATE或DELETE命令中使用GROUP BY。
目录
技术概要:基于角色的访问控制
本文档向您介绍基于角色的访问控制,解释它在 InterSystems IRIS®数据平台中的工作原理,并帮助您亲自探索。
要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。
列权限授予用户或角色对指定表或视图上的指定列列表的指定权限。这允许访问某些表列,而不允许访问同一表的其他列。这提供了比GRANT OBJECT-PRIVICATION选项更具体的访问控制,后者定义了整个表或视图的权限。向被授权者授予权限时,应为表授予表级权限或列级权限,但不能同时授予两者。SELECT、INSERT、UPDATE和REFERENCES权限可用于授予对单个列中数据的访问权限。
对具有GRANT OPTION的表具有SELECT、INSERT、UPDATE或REFERENCES对象权限的用户可以向其他用户授予该表的列的相同类型的列权限。
可以指定单个列,也可以指定逗号分隔的列列表。列列表必须用括号括起来。列名可以按任意顺序指定,允许重复。将COLUMN特权授予已具有该特权的列不起作用。
以下示例授予两列的UPDATE权限:
GRANT UPDATE(Name,FavoriteColors) ON Sample.Person TO Deborah
可以授予表或视图的列特权。可以向任何类型的被授权者授予列权限,包括用户列表、角色列表、*和_PUBLIC。但是,不能将星号(*)通配符用于权限、字段名或表名。
向用户或角色授予特权。
GRANT admin-privilege TO grantee [WITH ADMIN OPTION]
GRANT role TO grantee [WITH ADMIN OPTION]
GRANT object-privilege ON object-list TO grantee [WITH GRANT OPTION]
GRANT SELECT ON CUBE[S] object-list TO grantee [WITH GRANT OPTION]
GRANT column-privilege (column-list) ON table TO grantee [WITH GRANT OPTION]
[toc]
这个可选关键字在查询的FROM子句中指定。
它建议 IRIS使用多个处理器(如果适用)并行处理查询。
这可以显著提高使用一个或多个COUNT、SUM、AVG、MAX或MIN聚合函数和/或GROUP BY子句的某些查询的性能,以及许多其他类型的查询。
这些通常是处理大量数据并返回小结果集的查询。
例如,SELECT AVG(SaleAmt) FROM %PARALLEL User.AllSales GROUP BY Region使用并行处理。
既指定单个字段又指定聚合函数且不包含GROUP BY子句的查询不能执行并行处理。
例如,SELECT Name,AVG(Age) FROM %PARALLEL Sample。
Person不执行并行处理,而是从SELECT Name,AVG(Age) FROM %PARALLEL Sample.Person GROUP BY Home_State执行并行处理。
%PARALLEL用于SELECT查询及其子查询。
INSERT命令子查询不能使用%PARALLEL。
指定%PARALLEL可能会降低某些查询的性能。
在具有多个并发用户的系统上使用%PARALLEL运行查询可能会导致整体性能下降。
Mysql里有sql_safe_updates参数,可以限制不带where条件的update/delete语句执行失败,这个参数设置后,可以防止业务bug/漏洞导致把整个表都更新或者删除(线上发生过的案例),也可以防止在线误操作更新/删除整张表。
请问Cache或者IRIS中有相关的设置吗?翻了下帮助文档,没找到,有个话,告诉下是哪个设置?谢谢
一个SELECT子句,指定要查询的一个或多个表。
SELECT ... FROM [optimize-option] table-ref [[AS] t-alias][,table-ref [[AS] t-alias]][,...]
optimize-option - 可选-指定查询优化选项(优化器提示)的单个关键字或由空格分隔的一系列关键字。支持以下关键字:%ALLINDEX、%FIRSTTABLE TABLE TABNAME、%FULL、%IGNOREINDEX NAME、%INORDER、%NOFLATTEN、%NOMERGE、%NOREDUCE、%NOSVSO、%NOTOPOPT、%NOUNIONOROPT、%PARALLEL和%STARTTABLE。table-ref - 从其中检索数据的一个或多个表、视图、表值函数或子查询,以逗号分隔的列表或使用JOIN语法指定。
在使用带有JOIN语法的视图时存在一些限制。
可以指定一个用括号括起来的子查询。AS t-alias - 可选—表名的别名。
必须是有效的标识符。FROM子句指定在SELECT语句中查询数据的一个或多个表(或视图或子查询)。
如果没有查询表数据,则FROM子句是可选的,如下所述。
冻结查询计划。
FREEZE PLANS BY ID statement-hash
FREEZE PLANS BY TABLE table-name
FREEZE PLANS BY SCHEMA schema-name
FREEZE PLANS
statement-hash - 查询计划的SQL语句定义的内部哈希表示,用引号括起来。
偶尔,看起来相同的SQL语句可能有不同的语句散列项。
需要SQL语句的不同代码生成的设置/选项的任何差异都会导致不同的语句散列。
这种情况可能发生在支持不同内部优化的不同客户机版本或不同平台上。table-name - 现有表或视图的名称。
表名可以是限定的(schema.table),也可以是非限定的(table)。
非限定表名接受默认模式名。schema-name - 现有模式的名称。
该命令冻结指定模式中所有表的所有查询计划。FREEZE PLANS命令用来冻结查询计划。
需要解冻已冻结的查询计划,使用unfreeze plans命令。
“冻结计划”可以冻结“计划状态”为“未冻结”的查询计划。
它不能冻结计划状态为“Unfrozen/Parallel”的查询计划。
FREEZE PLANS为冻结查询计划提供了四种语法形式:
重新定位游标,并从中检索数据。
FETCH cursor-name [INTO host-variable-list ]
cursor-name - 当前打开的游标的名称。
游标名称是在DECLARE命令中指定的。
游标名称区分大小写。INTO host-variable-list - 可选—将取操作列中的数据放入局部变量中。
host-variable-list指定一个主机变量或一个逗号分隔的主机变量列表,它们是包含与游标关联的数据的目标。
INTO句是可选的。
如果没有指定,FETCH语句只定位游标。在嵌入式SQL应用程序中,FETCH语句从游标检索数据。
所需的操作顺序是:DECLARE、OPEN、FETCH、CLOSE。
在未打开的游标上尝试FETCH会导致SQLCODE -102错误。
作为SQL语句,这只在嵌入式SQL中得到支持。
通过ODBC使用ODBC API支持等价的操作。
INTO子句可以指定为DECLARE语句的子句,也可以指定为FETCH语句的子句,或者两者都指定。
INTO子句允许将fetch列中的数据放到本地主机变量中。
列表中的每个主机变量,从左到右,都与游标结果集中的相应列相关联。
每个变量的数据类型必须匹配或支持对应结果集列的数据类型的隐式转换。
变量的数量必须与游标选择列表中的列数匹配。
返回指定查询的查询计划。
EXPLAIN [ALT] [STAT] [INTO :host-variable] query
ALT - 可选-返回备用查询计划。默认情况下,返回单个查询计划。STAT - 可选-(仅限动态SQL):返回查询计划运行时性能统计信息。默认情况下,返回不带运行时统计信息的查询计划。对于嵌入式SQL,此语法被忽略。INTO :host-variable - 可选-(仅限嵌入式SQL):放置查询计划的输出主机变量。对于动态SQL,此语法被忽略。query - SELECT queryEXPLAIN命令以xml标记文本字符串的形式返回指定查询的查询计划。
该查询计划作为一个结果集返回,该结果集由一个名为plan的字段组成。
查询必须是SELECT查询。
EXPLAIN不能用于创建查询计划的其他SQL操作,例如带SELECT子句的INSERT。
指定不以SELECT关键字开始的查询将导致SQLCODE -51。
可以使用Show Plan显示非select查询的查询计划。
ALT和STAT关键字可以以任何顺序指定。
INTO关键字必须在这些关键字之后指定。
可选的ALT关键字生成备用查询计划。
所有备用查询计划都以相同的xml标记文本字符串返回。
规范化查询文本(标记为<sql>)在每个查询计划之前列出。
删除视图
DROP VIEW view-name [CASCADE | RESTRICT]
view-name 要删除的视图的名称。
视图名可以是限定的(schema.viewname),也可以是非限定的(viewname)。
非限定视图名接受默认模式名。CASCADE RESTRICT - 可选-指定CASCADE关键字以删除引用view-name的任何其他视图。如果有另一个视图引用view-name,则指定RESTRITE将发出SQLCODE-321错误。默认值为限制。DROP VIEW命令删除视图,但不删除基础表或数据。
也可以使用DropView()方法调用来调用拖放视图操作:
$SYSTEM.SQL.Schema.DropView(viewname,SQLCODE,%msg)
删除用户帐户。
DROP USER user-name
user-name 要删除的用户名。DROP USER命令可删除用户帐户。此用户帐户是使用CREATE USER创建的,并指定了用户名。如果指定的用户名与现有用户帐户不对应, IRIS将发出SQLCODE-118错误。可以通过调用$SYSTEM.SQL.Security.UserExists()方法来确定用户是否存在。
用户名不区分大小写。
还可以使用管理门户删除用户。选择System Administration(系统管理)、Security(安全性)、Users(用户)以列出现有用户。在此用户帐户表上,可以单击要删除的用户帐户的删除。
DROP USER命令是特权操作。在嵌入式SQL中使用DROP USER之前,必须以具有适当权限的用户身份登录。否则将导致SQLCODE-99错误(特权冲突)。
使用$SYSTEM.Security.Login()方法分配具有适当权限的用户:
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql( )
必须具有%Service_Login:Use权限才能调用$SYSTEM.Security.Login方法。
可以通过下面的语句来删除PSMITH:
DROP USER psmith
手术室是医疗机构最重要和最紧缺的医疗资源之一,也是节奏最快、强度最高、人员最密、责任最大的临床场景之一。传统基于人工和纸质的手术申请、手术排期、手术记录和交接转移等耗费了医务人员大量的时间和精力,导致手术室资源运用效率欠佳,且数据时限性与准确性均有待提高。医学信息系统问世和应用后,手术室系统的实施与优化一直是临床用户与医学信息工作者共同热议的话题。
手术室系统既可以作为整体医学信息系统的一部分,也可以作为单独的产品/模块与其他系统对接。鉴于手术室系统过于庞大和精细,本文只挑选其中的“临床记录表”功能进行探讨。
1. 化零为整– 临床记录表
手术过程中会产生诸多数据,这些数据可能来自于患者(生命体征、出入量等)、仪器(心电监护仪、呼吸机、麻醉机、、输液泵等)或者其他系统(电子病历系统、医嘱系统、耗材系统等),分别由不同角色(医生、护士、麻醉师、药剂师等)进行录入和传输。为了让手术核心参与人员方便的获取全部所需数据,手术室系统首先应该做到“化零为整”的前端展示。图1中的“临床记录表”大体分为4个部分:
①行动栏:医务人员通过行动栏中的行动项目,可以清晰的获知在当前场景下需要完成的工作内容,手术医生、麻醉医生、手术室护士等角色均可根据自己的职责和任务单独创建行动栏。
②搜索栏:医务人员通过搜索栏中的预设选项,可以自由切换数据类别,并根据临床需要,查看不同时间段的不同颗粒度的数据。
删除触发器
DROP TRIGGER name [ FROM table ]
name - 要删除的触发器的名称。触发器名称可以是限定的,也可以是非限定的;如果限定,则其架构名称必须与表的架构名称匹配。FROM table - 可选-要从中删除触发器的表。如果指定了FROM子句,则只在表中搜索命名触发器。如果未指定FROM子句,则在NAME中指定的整个架构中搜索命名触发器。DROP TRIGGER命令删除触发器。如果要修改现有触发器,则必须先调用DROP TRIGGER删除旧版本的触发器,然后再调用CREATE TRIGGER。
注:DROP TABLE删除与该表关联的所有触发器。
DROP TRIGGER命令是特权操作。用户必须具有%DROP_TRIGGER管理权限才能执行DROP TRIGGER。否则将导致SQLCODE-99错误,因为%msg用户‘name’没有%DROP_TRIGGER权限。
用户必须对指定表拥有%ALTER特权。如果用户是表的所有者(创建者),则会自动授予该用户对该表的%ALTER权限。否则,必须授予用户对该表的%ALTER特权。否则将导致SQLCODE-99错误,因为%msg用户‘name’没有更改‘Schema.TableName’的表定义所需的%ALTER特权。
生产环境中会定时生成备份(全备,增备),因为服务器空间有限,所以需要定时删除。
请问:IRIS2021 是否有工具或者代码可以实现定时删除3周前备份文件的功能。如果是代码实现,思路是什么,能否给个Demo。