1 关注者 · 494 帖子

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

文章 Jingwei Wang · 七月 28, 2022 8m read

InterSystems SQL支持在InterSystems IRIS数据平台数据库中将流数据存储为BLOB(Binary Large Objects 二进制大对象)或CLOB(Character Large Objects字符大对象)的能力。

InterSystems SQL支持两种流字段:

  • 字符流:用于大量的文本。
  • 二进制流:用于图像、音频或视频。

BLOBs和CLOBs可以存储多达4GB的数据(JDBC和ODBC规范规定的限制)。除了在通过ODBC或JDBC客户端访问时如何处理字符编码转换(如Unicode到多字节)外,BLOB和CLOB的操作在各方面都是相同的:BLOB中的数据被视为二进制数据,决不转换为其他编码,而CLOB中的数据被视为字符数据,在必要时进行转换。

如果一个二进制流文件(BLOB)包含单一的非打印字符$CHAR(0),它被认为是一个空的二进制流。它相当于""空二进制流值:它存在(不是空的),但长度为0。

从对象的角度来看,BLOB和CLOBs被表示为流对象。更多信息请参见定义和使用类中的 "与流合作 "一章。

定义流数据字段

InterSystems SQL支持流字段的各种数据类型名称。这些InterSystems的数据类型名称是对应于以下的同义词。

  • 字符流:数据类型LONGVARCHAR,映射到%Stream.
0
0 273
文章 Hao Ma · 三月 18, 2024 4m read

TuneTable(调整表)收集数据库中表的统计信息,用来为SQL引擎制定最优的执行计划。在其他数据库产品里,这个动作被称为“gather stats job"或者类似的名字,相比较TuneTable不是那么直白,但作用是一样的。
 

TuneTable是否要人工执行

一定要。

在IRIS 2023版本, 第一次加入了TuneTable的自动执行功能,在此之前的所有IRIS/Caché版本, 如果没有人工执行TuneTable, SQL引擎无法保证给出最好的查询计划。 即使是IRIS2023有了自动执行功能,也还需要人工执行TuneTable的操作,后面解释。

怎么知道有没有执行过TuneTable 

到“管理门户>SQL"页面, 打开一个表, 看“目录详情”,如下图, 如果其中的“选择性”,"离群值选择性“, ”离群值“,“平均字段大小”这些字段有数据, 说明这个表至少做过了一次TuneTable. 

除了“字段”按钮页,在“表信息”还有统计项 “ExtentSize", “索引”页,包含每个索引的统计信息项。

关于这些统计项的想象解释, 我会在下个帖子里介绍。 

什么时候执行TuneTable

简单的说:对于查询所用的表,SQL引擎要有以上有统计信息,而且足够准确。

解释以下“足够准确”。

0
0 273
文章 Muhammad Waseem · 十月 16, 2021 2m read

在本文中,我將演示以下內容:

  • 使用自定義實用程序函數從數據庫更新 ReferencesRange(OBX:7) 針對 ObservationIdentifier(OBX:3.1)[TestCode]
  • 根據數據庫實用程序函數中的 ObservationIdentifier(OBX:3.1)[TestCode] 和 ObservationValue(OBX:5)[Result] 更新異常標誌 (OBX:8)
  • 基於異常標誌的路由消息 (OBX:8)

以下是主要和轉換後的 HL7 2.5 ORU_R01 消息:

第 1 步:首先,我們需要在數據庫中保存參考範圍,為此我使用了 TestRanges 持久類:
第 2 步:我們需要創建一個自定義函數來獲取引用範圍,為此我在實用程序類中創建了 GetReferenceRange() ClassMethod 函數。 請注意這個類應該是來自 EnsRule.FunctionSet 的擴展
 

我們需要創建另一個函數來設置異常標誌,為此我在實用程序類中創建了 SetAbnormalFlag() ClassMethod 函數

第 3 步:現在我們將在數據轉換 (UpdateReferenceRangesDTL) 中使用這些函數。

1
0 271
问题 Michael Lei · 四月 7, 2022

你好!

我想知道,如果在没有运行%BuildIndices()方法的情况下向表中插入索引,是否会有问题。

需要注意的是,在索引之前插入的数据对于检索来说并不重要,所以在索引之前插入的数据在查询中不显示并不是问题。

我问这个问题的原因是,我想避免在需要插入这种索引的大表中进行索引重建。

我正在使用Cache 2018.1。

谢谢。

José

Hi!

I'd like to know if there are any issues if an index is inserted into a table without running the %BuildIndices() method.

It's important to note that data inserted before the index is not important for retrieval, so it's not a problem data inserted before the index don't show up in queries.

The reason why I'm asking this is that I'd like to avoid index reconstruction on big tables which I need to inser such index.

2
0 268
文章 姚 鑫 · 三月 29, 2021 16m read

第十三章 使用动态SQL(七)

SQL元数据

动态SQL提供以下类型的元数据:

  • 在“准备”之后,描述查询类型的元数据。
  • 在“准备”之后,描述查询中选择项的元数据(“列”和“扩展列信息”)。
  • 在准备之后,描述查询参数的元数据:参数,:var参数和常量。 (语句参数,形式参数和对象)
  • 执行之后,描述查询结果集的元数据。在执行Prepare操作(%Prepare()%PrepareClassQuery()%ExecDirect())之后,可以使用属性值。
  • 可以直接为最新的返回元数据属性。
  • 可以返回包含%SQL.StatementMetadata属性的oref的属性。这使可以返回多个准备操作的元数据。

或语句返回所有这些元数据。 INSERT,或返回语句类型元数据和形式参数。

语句类型元数据

使用类进行之后,可以使用%SQL.StatementMetadata statementType属性来确定准备哪种类型的SQL语句,如以下示例所示。本示例使用属性来保存和比较两操作的元数据:

/// d ##class(PHA.TEST.SQL).MetaData()
ClassMethod MetaData()
{
	SET tStatement = ##class(%SQL.Statement).%New()
	SET myquery1 = "SELECT TOP ? Name,Age,AVG(Age),CURRENT_DATE FROM Sample.Person"
	SET myquery2 = "CALL Sample.SP_Sample_By_Name(?)"
	SET qStatus = tStatement.%Prepare(myquery1)
	IF qStatus'=1 {
		WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT
	}
	SET meta1 = tStatement.%Metadata
	SET qStatus = tStatement.%Prepare(myquery2)
	IF qStatus'=1 {
		WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT
	}
	SET meta2 = tStatement.%Metadata
	WRITE "语句类型query 1: ",meta1.statementType,!
	WRITE "语句类型query 2: ",meta2.statementType,!
	WRITE "End of metadata"
}

0
0 267
文章 Hao Ma · 三月 19, 2024 3m read

上个帖子写了TuneTable的执行, 提到了SQL优化器使用的那些统计数据, 这里逐一的介绍一下这些统计项。了解它们看懂和分析SQL执行计划的基础。 如果您不需要做单个查询的优化工作,可以调过这部分内容。 

表的统计项

  • Extent Size: 表的大小,也就是记录数。在执行多表关联(JOIN)的查询时,SQL优化器会根据Extent Size值,从数据量最小的表来开始执行查询。

您还需要了解:表创建的时候Extent Size会获得一个初始值,而之后的插入修改数据并不自动修改这个值。而只有执行TuneTable才会修改这个。 这也就是为什么没有执行过TuneTable的数据库SQL性能好不了的原因。下图中的Patient表,可以看出有1,000,000记录

字段的统计项

请看下面的图

  • 选择性(Selectivity)

选择性取值可以是1或者一个百分数。取值为1说明这是个unique的字段,比如上图的ID, PatientNumber。 %表示的值,取值越高说明唯一性越低。比如上图中的Name的选择性是1.2987%,说明不是唯一值,有重复的姓名,但比例不高。 相反,Sex的选择性是50%, 说明只有两个取值。 

  • 离散值选择性Outlier Selectivity),

始用于Caché2014.

0
0 267
文章 Hao Ma · 四月 15, 2024 3m read

SQL Performance Analysis Toolkit,或者叫SQL性能分析工具,并不是给维护人员使用的。

在RIS文档里是这么说的: 这个工具包里的工具收集SQL执行的详细信息,用来找出一个查询计划的特殊问题。 使用这些信息,开发人员改善这个查询的效率。 它可以非常大的增加服务器的开销。..., 它不应该被持续执行。

要做分析,首先您需要打开一个采集“SQL runtime Statistics"的开关来收集详细信息,这个开关默认的状态是OFF。 文档里说: The SQL Performance Analysis Toolkit offers support specialists the ability to profile specific SQL statements or groups of statements.

这里的"support specialists"指的是厂家的技术支持人员。

因此,总结如下:

  • **如果您是个生产环境的维护人员,除非有厂商的支持要求您执行,否则最好不要在生产系统使用这个工具。除非您有兴趣,想知道这个Toolkit是干什么的, 以便在有厂商人员需要您使用这个工具采集数据的时候,知道工作的大概, 否则不用往下看了。 **
0
0 259
文章 姚 鑫 · 一月 30, 2025 2m read

第十一章 F - H 开头的术语

文件流 (file stream)

对象(Objects)

文件流提供了一个接口,用于在外部文件中操作和存储大量基于文本或二进制的数据。IRIS 的流接口可以在 ObjectScriptSQL 和 中用于操作文件流。

最终类 (final class)

对象(Objects)

不能被扩展或子类化的类。

最终方法 (final method)

对象(Objects)

不能被重写的方法。

最终属性 (final property)

对象(Objects)

不能被重写的属性。

外键 (foreign key)

InterSystems SQL

外键约束表中的一列指向另一表中的另一列。为第一列提供的值必须存在于第二列中。

基础 (foundation)

医疗保健(Health care)

InterSystems IRIS for Health™ 和 中,启用了医疗保健互操作性的命名空间。

以 G 开头的术语

全局 (global)

系统

多维存储结构。全局在 数据库中使用平衡树技术实现。

全局数据库 (globals database)

系统

的基础逻辑和物理数据存储结构,其中所有数据都存储在称为“全局”的多重下标数组系统中。

全局目录 (global directory)

系统

包含全局数据库的目录。

0
0 259
文章 姚 鑫 · 三月 11, 2022 5m read

第七十八章 SQL函数 $LENGTH

返回字符串中字符数或分隔子字符串数的字符串函数。

大纲

$LENGTH(expression[,delimiter])

参数

  • expression - 目标字符串。它可以是数值、字符串文字、任何变量的名称或任何有效的表达式。
  • delimiter - 可选 — 在目标字符串中划分不同子字符串的字符串。它必须是字符串文字,但可以是任意长度。括起来的引号是必需的。

$LENGTH 返回 数据类型。

描述

返回指定字符串中的字符数或指定字符串中的子字符串数,具体取决于使用的参数。

  • $LENGTH(expression) 返回字符串中的字符数。如果表达式为空字符串 (''),则 $LENGTH 返回 。如果表达式为 ,则 返回 。
  • 返回字符串中子字符串的数量。 返回由指定分隔符相互分隔的子字符串的数量。此数字始终等于在表达式字符串中找到的分隔符实例的数量加一。

$LENGTH(expression) 和其他长度函数

和其他长度函数(、CHARACTER_LENGTH、 和

0
0 259
文章 姚 鑫 · 十月 25, 2021 7m read

第五十六章 SQL命令 INSERT OR UPDATE

在表中添加新行或更新表中的现有行。

大纲

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

参数

  • %keyword - 可选-以下一个或多个关键字选项,以空格分隔:%NOCHECK%NOFPLAN、、、、、、。
  • - 要对其执行插入操作的表或视图的名称。此参数可以是子查询。关键字是可选的。
  • column - 可选-与提供的值列表顺序对应的列名或以逗号分隔的列名列表。如果省略,值列表将按列号顺序应用于所有列。
  • - 为相应列字段提供数据值的标量表达式或以逗号分隔的标量表达式列表。
  • :array()
0
0 254
文章 姚 鑫 · 十月 23, 2021 12m read

第五十四章 SQL命令 INSERT(三)

SQLCODE错误

默认情况下,INSERT是要么全有要么全无的事件:要么完全插入行,要么根本不插入行。 IRIS返回一个状态变量SQLCODE,指示插入是成功还是失败。要将行插入到表中,插入操作必须满足所有表、字段名和字段值要求,如下所示。

表:

  • 该表必须已经存在。尝试插入到不存在的表会导致SQLCODE-30错误。
  • 不能将该表定义为READONLY。尝试编译引用ReadOnly表的插入会导致错误。请注意,此错误是在编译时发出的,而不是在执行时发出的。
  • 如果通过视图更新表,则不能将该视图定义为只读。尝试这样做会导致错误。如果视图基于分割表,则不能通过使用定义的视图进行插入。尝试这样做会导致SQLCODE-35,其中不允许基于带有选项条件的切片表的视图()使用。
  • 必须具有适当的权限才能插入表

字段名称:

  • 该字段必须存在。尝试插入不存在的字段会导致错误。
  • 插入必须指定所有必填字段。尝试插入行而不为必填字段指定值会导致错误。
  • 插入不能包含重复的字段名称。尝试插入包含两个同名字段的行会导致错误。
  • 插入不能包含定义为的字段。尝试编译引用字段的插入会导致错误。请注意,此错误现在在编译时发出,而不是仅在执行时发出。使用链接表向导链接表时,可以选择将字段定义为只读。
0
0 253
文章 姚 鑫 · 六月 10, 2022 8m read

第五章 数据类型(四)

Strings

%Library.String 数据类型支持的最大字符串长度为 3,641,144 个字符。通常,极长的字符串应分配为 %Stream.GlobalCharacter 数据类型之一。

因为 IRIS 支持 xDBC 协议 50 和更高版本,所以没有强制执行 ODBC 或 JDBC 字符串长度限制。如果 IRIS 实例和 ODBC 驱动程序支持不同的协议,则使用两个协议中较低的一个。实际使用的协议记录在 ODBC 日志中。

请注意,默认情况下 IRIS 建立系统范围的 ODBC 最大长度为 ;此 ODBC 最大长度是可配置的。

列表结构

IRIS 支持列表结构数据类型 %List(数据类型类 )。这是一种压缩的二进制格式,不会映射到 SQL 的相应本机数据类型。在其内部表示中,它对应于数据类型 ,默认 为 。 IRIS 支持列表结构数据类型 (数据类型类 )对应于数据类型 ,默认 为 。

因此,动态 SQL 不能在 子句比较中使用 数据。也不能使用 INSERT 或 来设置 类型的属性值。

动态 SQL 将列表结构化数据的数据类型返回为 。要确定查询中的字段是数据类型 还是 ,可以使用 布尔标志。这些数据类型的 (客户端数据类型)整数代码是 。

如果使用 ODBC 或 JDBC 客户端,则使用 转换将 数据投影到 VARCHAR

0
0 253
文章 Jingwei Wang · 七月 28, 2022 4m read

定义 Stored Procedures

可以使用以下方式定义stored procedures

  1. 使用DDL定义存储过程
  2. 使用类方法定义存储过程

使用DDL定义存储过程

CREATE PROCEDURE 可以创建一个查询,它总是作为一个存储过程被预测。一个查询可以返回一个单一的结果集。

CREATE PROCEDURE AgeQuerySP(IN topnum INT 10, IN minage INT 20)
BEGIN
SELECT TOP :topnum Name, Age FROM Sample.Person
WHERE Age > :minage;
END

列表中的每个参数声明包括(按顺序)。指定参数模式是IN(输入值),OUT(输出值),还是INOUT(修改值)。如果省略,默认的参数模式是IN,参数名称是区分大小写的。

CREATE QUERY 可以创建一个可以选择作为存储过程投射的查询。一个查询可以返回一个单一的结果集,这个查询可能是也可能不是作为存储过程公开的。要创建一个作为存储过程公开的查询,你必须指定PROCEDURE关键字作为其特征之一。你也可以使用CREATE PROCEDURE语句来创建一个作为存储过程公开的查询。

为了创建一个查询,你必须拥有%CREATE_QUERY管理权限,正如GRANT命令所指定的那样。

0
0 251
文章 姚 鑫 · 四月 12, 2021 3m read

第一章 SQL性能优化简介

InterSystems SQL支持几个特性来优化InterSystems IRIS®数据平台的SQL性能。

表定义优化

SQL性能从根本上取决于良好的数据架构。 将数据划分为多个表并在这些表之间建立关系对于高效的SQL是必不可少的。

描述了以下优化表定义的操作。 这些操作要求定义表,但不要求用数据填充表:

  • 数据存储策略:可以选择使用%Storage.Persistent%Storage.SQL或自定义存储来存储数据。
  • 全局变量命名策略:可以使用USEEXTENTSET参数为数据和索引查找操作指定更短、更高效的散列全局名称。
  • 索引:可以为一个表字段或一组字段定义索引。可以定义几种不同类型的索引:标准索引、位图索引、位图索引和位图范围索引。SQL优化使用定义的索引而不是数据值本身来访问查询、更新或删除操作的特定记录。

表数据优化

根据对表中典型数据的分析,可以执行以下操作来优化表访问:

  • Tune Table:检查典型的表数据并生成(行数)、选择性(具有特定值的行的百分比)和BlockCount元数据。查询优化器使用此信息来确定最有效的查询执行计划。
  • 选择性和异常值选择性:确定某个字段具有特定值的行的百分比,以及某个值是否为异常值,该值明显比该字段的其他值更常见。

查询优化

0
0 251
文章 姚 鑫 · 五月 19, 2022 10m read

第147章 SQL函数 TO_TIMESTAMP

将格式化字符串转换为时间戳的日期函数。

大纲

TO_TIMESTAMP(date_string[,format])

参数

  • date_string - 要转换为时间戳的字符串表达式。此表达式可能包含日期值、时间值或日期和时间值。
  • format - 可选 — 对应于 date_string 的日期和时间格式字符串。如果省略,则默认为 DD MON YYYY HH:MI:SS

描述

TO_TIMESTAMP 函数将各种格式的日期和时间字符串转换为标准时间戳,数据类型为 。 返回具有以下格式的时间戳:

yyyy-mm-dd hh:mm:ss

始终包括前导零。时间使用 小时制指定。默认情况下,返回的时间戳不包括小数秒。

注意: 以 格式返回标准时间戳。 TO_POSIXTIME 返回一个编码的 位时间戳。 是新编程的推荐时间戳格式。

必须指定匹配的 和格式。如果省略格式,则 必须匹配 。

如果 省略了时间戳的组成部分,则 提供缺少的组成部分。如果 date_string 和 都省略了年份,则 默认为当前年份;如果只有 省略了年份,则默认为 00,根据年份格式元素扩展为四位数年份。如果省略日或月值,则 默认为 ; 默认为 。因此,如果 和

0
0 251
文章 姚 鑫 · 九月 20, 2021 11m read

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

创建触发器

大纲

CREATE TRIGGER trigname {BEFORE | AFTER} event [,event]
          [ORDER integer]
          ON table
          [REFERENCING {OLD | NEW} [ROW] [AS] alias]
         action

参数

  • trigname - 要创建的触发器的名称,它是一个标识符。触发器名称可以是限定的,也可以是非限定的;如果限定,则其架构名称必须与表的架构名称匹配。
  • BEFORE eventAFTER event - 事件执行触发器的时间(之前或之后)。 触发器事件或以逗号分隔的触发器事件列表。可用的事件列表选项包括INSERT、和。 可以指定事件的单个更新。子句后跟列名或逗号分隔的列名列表。仅当为时才能指定子句。不能在逗号分隔的事件列表中指定子句。
  • - 可选-当具有相同时间和事件的表有多个触发器时,触发器的执行顺序。如果省略顺序,则为触发器分配的顺序为0。
  • - 为其创建触发器的表。表名可以是限定的,也可以是非限定的;如果限定,则触发器必须驻留在与表相同的架构中。
  • REFERENCING OLD ROW AS alias
0
0 251
文章 Jingwei Wang · 八月 30, 2023 5m read

案例描述

假设您是一名 Python 开发人员或拥有一支训练有素的 Python 专业团队,但您分析 IRIS 中某些数据的期限很紧迫。当然,InterSystems 提供了许多用于各种分析和处理的工具。然而,在给定的场景中,最好使用旧的 Pandas 来完成工作,然后将 IRIS 留到下次使用。
对于上述情况和许多其他情况,您可能需要从 IRIS 获取表来管理 InterSystems 产品之外的数据。但是,当您有任何格式(即 CSV、TXT 或 Pickle)的外部表时,您可能还需要以相反的方式执行操作,您需要在其上导入并使用 IRIS 工具。
无论您是否必须处理上述问题,Innovatium让我明白,了解更多解决编码问题的方法总是能派上用场。好消息是,从 IRIS 引入表时,您不需要经历创建新表、传输所有行以及调整每种类型的繁琐过程。
本文将向您展示如何通过几行代码快速将 IRIS 表转换为 Pandas 数据框架并向后转换。您可以在我的GitHub上查看代码,您可以在其中找到包含本教程每个步骤的 Jupiter Notebook。

从 IRIS 引入一张Table

当然,您应该首先导入该项目所需的库。

 importasimport

下一步将是在 Python 文件和 IRIS 实例之间创建连接。

0
0 249
文章 姚 鑫 · 四月 22, 2021 8m read

第五章 优化查询性能(一)

InterSystems SQL自动使用查询优化器创建在大多数情况下提供最佳查询性能的查询计划。该优化器在许多方面提高了查询性能,包括确定要使用哪些索引、确定多个AND条件的求值顺序、在执行多个联接时确定表的顺序,以及许多其他优化操作。可以在查询的FROM子句中向此优化器提供“提示”。本章介绍可用于评估查询计划和修改InterSystems SQL将如何优化特定查询的工具。

InterSystems IRIS®Data Platform支持以下优化SQL查询的工具:

  • SQL Runtime Statistics用于生成查询执行的运行时性能统计信息
  • 索引分析器,用于显示当前命名空间中所有查询的各种索引分析器报告。这显示了InterSystems SQL将如何执行查询,可以全面了解索引是如何使用的。此索引分析可能表明应该添加一个或多个索引以提高性能。
  • 查询执行计划:显示SQL查询(查询计划)的最佳(默认)执行计划,并可选地显示该SQL查询的备用查询计划以及统计信息。用于显示查询计划的工具包括SQL EXPLAIN命令、$SYSTEM.SQL.ExPlan()方法以及管理门户和SQL Shell中的各种Show Plan工具。查询计划和统计数据是在准备查询时生成的,不需要执行查询。
0
0 248
文章 姚 鑫 · 六月 1, 2022 6m read

第159章 SQL函数 XMLELEMENT

一种格式化 XML 标记标记以包含一个或多个表达式值的函数。

大纲

XMLELEMENT([NAME] tag,expression[,expression])

XMLELEMENT([NAME] tag,XMLATTRIBUTES(expression [AS alias]),expression[,expression])

参数

  • NAME tag - XML标记的名称。NAME关键字是可选的。该参数有三种语法形式: , 和。前两者在功能上是相同的。如果指定,标记必须用双引号括起来。标签中的字母大小写保持不变。

XMLELEMENT不执行标记值的验证。然而,标准要求有效的标记名不能包含任何字符 ,并且不能以, 或数字开头。

如果指定没有标记值的 关键字, 将提供默认标记值:。 NAME 关键字不区分大小写;结果标签初始大写。

  • - 任何有效的表达式。通常是包含要标记的数据值的列的名称。可以指定以逗号分隔的列列表或其他表达式,所有这些都将包含在同一标记中。第一个以逗号分隔的元素可以是 XMLATTRIBUTES 函数。只能指定一个 元素。

描述

函数返回用标记中指定的 XML(或 HTML)标记开始标记和结束标记标记的表达式的值。例如, 返回如下值:。 不能用于生成空元素标记。

可用于引用表或视图的

0
0 248
文章 姚 鑫 · 五月 20, 2022 3m read

第148章 SQL函数 $TRANSLATE

执行逐字符替换的字符串函数。

大纲

$TRANSLATE(string,identifier[,associator])

参数

  • string - 目标字符串。它可以是字段名称、文字、主机变量或 SQL 表达式。
  • identifier - 要在字符串中搜索的字符。它可以是字符串或数字文字、主变量或 SQL 表达式。
  • associator - 可选 — 与标识符中的每个字符对应的替换字符。它可以是字符串或数字文字、主变量或 SQL 表达式。

描述

函数在返回值字符串中执行逐字符替换。它一次处理一个字符的字符串参数。它将字符串中的每个字符与标识符参数中的每个字符进行比较。如果 找到匹配项,它会记下该字符的位置。

  • $TRANSLATE 的双参数形式从输出字符串中删除标识符参数中的所有字符实例。
  • $TRANSLATE 的三参数形式将在字符串中找到的每个标识符字符的所有实例都替换为位置对应的关联字符。替换是基于字符而不是字符串执行的。如果标识符参数包含的字符多于关联参数,则从输出字符串中删除标识符参数中多余的字符。如果标识符参数包含的字符少于关联参数,则忽略关联参数中多余的字符。

$TRANSLATE 区分大小写。

不能用于将 NULL 替换为字符。

如果指定的参数太少,则会发出

1
1 248
问题 Michael Lei · 六月 16, 2021

在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')

How can i do multiple inserts(rows) in one single statement?

Values are not in another table, so i cannot use Select into.

Thanks,

Jimmy Christian.

1
0 247
文章 姚 鑫 · 四月 21, 2021 13m read

第四章 缓存查询(二)

运行时计划选择

运行时计划选择(RTPC)是一个配置选项,它允许SQL优化器利用运行时(查询执行时)的离群值信息。运行时计划选择是系统范围的SQL配置选项。

RTPC被激活时,准备查询包括检测查询是否包含具有离群值的字段上的条件。如果PREPARE检测到一个或多个异常值字段条件,则不会将查询发送到优化器。相反,SQL会生成一个运行时计划选择存根。在执行时,优化器使用此存根选择要执行的查询计划:忽略离群值状态的标准查询计划,或针对离群值状态进行优化的替代查询计划。如果有多个异常值条件,优化器可以从多个备选运行时查询计划中进行选择。

  • 准备查询时,SQL将确定它是否包含离群值字段条件。如果是这样,它将推迟选择查询计划,直到执行查询。在准备时,它创建一条标准SQL语句和(对于动态SQL)相应的缓存查询,但将选择是使用此查询计划还是创建不同的查询计划,直到查询执行。在准备时,它创建看起来像是标准SQL语句的内容,如下所示:DECLARE QRS CURSOR FOR SELECT Top ? Name,HaveContactInfo FROM Sample.MyTest WHERE HaveContactInfo=?,用问号表示文字替代变量。
0
0 247
文章 姚 鑫 · 三月 21, 2021 9m read

第十二章 使用嵌入式SQL(五)

嵌入式SQL变量

以下局部变量在嵌入式SQL中具有特殊用途。这些局部变量名称区分大小写。在过程启动时,这些变量是不确定的。它们由嵌入式SQL操作设置。也可以使用SET命令直接设置它们,或使用NEW命令将其重置为未定义。像任何局部变量一样,值将在过程持续期间或直到设置为另一个值或使用NEW进行定义之前一直存在。例如,某些成功的嵌入式SQL操作未设置%ROWID。执行这些操作后,是未定义的或保持设置为其先前值。

  • %msg
  • %ROWCOUNT
  • %ROWID

这些局部变量不是由Dynamic SQL设置的。 (请注意,SQL Shell和Management Portal SQL接口执行Dynamic SQL。)相反,Dynamic SQL设置相应的对象属性。

在嵌入式SQL中使用以下ObjectScript特殊变量。这些特殊的变量名称不区分大小写。在过程启动时,这些变量将初始化为一个值。它们由嵌入式SQL操作设置。不能使用SET或NEW命令直接设置它们。

作为已定义的InterSystems IRIS嵌入式SQL接口的一部分,InterSystems IRIS可以在嵌入式SQL处理期间设置任何这些变量。

如果嵌入式SQL在类方法中(

0
0 245
文章 姚 鑫 · 六月 9, 2022 6m read

第四章 数据类型(三)

日期、时间、PosixTime 和时间戳数据类型

可以定义日期、时间和时间戳数据类型,并通过标准 SQL 日期和时间函数相互转换日期和时间戳。例如,可以使用 CURRENT_DATECURRENT_TIMESTAMP 作为使用该数据类型定义的字段的输入,或者使用 DATEADD、、 或 来操作使用该数据类型存储的日期值。

数据类型类 、、%Library.PosixTime、 和 对于 的处理方式如下:

  1. %Library.Date 类以及逻辑值为 +$HOROLOG$HOROLOG 的日期部分)的任何用户定义数据类型类都应使用 作为 。默认情况下, 和对应的 数据类型只接受正整数, 代表 。要支持早于 的日期,必须在表中定义数据类型为 的日期字段,其中 是从 倒数的负天数最大为。 可以将日期值存储为 到 范围内的无符号或负整数。日期值可以按如下方式输入:
  • 逻辑模式接受 整数值,例如 (2020 年 8 月 28 日)。
  • 显示模式使用 转换方法。它接受当前语言环境的显示格式的日期,例如。它还接受逻辑日期值(+HOROLOG 整数值)。
  • ODBC 模式使用 转换方法。它接受 ODBC 标准格式的日期,例如。它还接受逻辑日期值(+HOROLOG 整数值)。
  1. %Library.Time
0
0 244
文章 姚 鑫 · 四月 7, 2021 12m read

第十九章 存储和使用流数据(BLOBs和CLOBs)

Intersystems SQL支持将流数据存储为Intersystems Iris ®DataPlatform数据库中的 BLOBs(二进制大对象)或 CLOBs(字符大对象)的功能。

流字段和SQL

Intersystems SQL支持两种流字段:

  • 字符流 Character streams,用于大量文本。
  • 二进制流 Binary streams,用于图像,音频或视频。

BLOBs and CLOBs

Intersystems SQL支持将BLOBs(二进制大对象)和(字符大对象)存储为流对象的功能。 BLOBs用于存储二进制信息,例如图像,而用于存储字符信息。 BLOBs和可以存储多达4千兆字节的数据(JDBC和ODBC规范所强加的限制)。

在各种方面,诸多方面的操作在通过ODBC或JDBC客户端访问时处理字符编码转换(例如Unicode到多字节):中的数据被视为二进制数据,从未转换为二进制数据另一个编码,而中的数据被视为字符数据并根据需要转换。

如果二进制流文件(BLOB)包含单个非打印字符,则被认为是空二进制流。它相当于空二进制流程值:它存在(不是),但长度为0。

定义流数据字段

Intersystems SQL支持流字段的各种数据类型名称。这些Intersystems数据类型名称是与以下内容对应的同义词:

0
0 242
文章 姚 鑫 · 十二月 18, 2021 5m read

第十九章 SQL谓词 %STARTSWITH(一)

用指定初始字符的子字符串匹配值。

大纲

scalar-expression %STARTSWITH substring

参数

  • scalar-expression - 将其值与子字符串进行比较的标量表达式(最常见的是数据列)。
  • substring - 解析为包含与标量表达式中的值匹配的第一个或多个字符的字符串或数字的表达式。

描述

%STARTSWITH谓词允许选择以子字符串中指定的字符开头的数据值。 如果不匹配任何标量表达式值,返回空字符串。 无论显示模式如何,这个匹配总是在逻辑(内部存储)数据值上执行。

下面的示例选择所有以“M”开头的名称:

SELECT Name FROM Sample.MyTest WHERE Name %STARTSWITH 'M'

可以用来颠倒谓词的意思。 下面的示例选择除了以开头的名称以外的所有名称:

SELECT Name FROM Sample.MyTest WHERE NOT Name %STARTSWITH 'M'

排序类型

使用与它匹配的字段相同的排序规则类型。 默认情况下,字符串数据类型字段是用SQLUPPER排序规则定义的,它不区分大小写。

在下面的例子中,被定义为; 子字符串匹配不区分大小写:

SELECT UpName FROM Sample.MyTest WHERE UpName %STARTSWITH 'mo'
0
0 241
文章 姚 鑫 · 十一月 14, 2021 8m read

第七十六章 SQL命令 TOP

指定返回多少行的SELECT子句。

大纲

SELECT  [DISTINCT clause] 
  [TOP {[((]int[))] | ALL}]
  select-item{,select-item}

参数

  • int - 限制返回到指定整数的行数。 int参数可以是一个正整数、一个动态SQL输入参数()或一个解析为正整数的嵌入式主机变量()。在动态SQL中,int值可以选择用单括号或双括号括起来(双括号是首选语法); 这些括号禁止在相应的缓存查询中对int值进行文字替换。
  • ALL - 仅在子查询或语句中有意义。 它用于在这些情况下支持使用ORDER BY子句,满足在子查询或CREATE 中使用的查询中子句必须与子句配对的要求。 不限制返回的行数。

描述

可选的子句出现在关键字和可选的DISTINCT子句之后,以及第一个选择项之前。

关键字用于动态SQL和基于指针的嵌入式SQL。 在非游标嵌入式SQL中,关键字的唯一有意义的用法是。 任何其他(其中int是任何非零整数)都是有效的,但没有意义,因为非游标嵌入式SQL中的总是最多返回一行数据。

语句的子句将返回的行数限制为int中指定的行数。 如果没有指定子句,则默认显示满足条件的所有行。 如果指定了子句,则显示的行数或行数要么为

0
0 240