1 关注者 · 991 帖子

  

InterSystems Caché 是一个多模型 DBMS 和应用服务器。

查看此处提供的更多详细信息

文档

文章 姚 鑫 · 五月 7, 2022 2m read

第135章 SQL函数 SUBSTR

返回从指定字符串表达式派生的子字符串的字符串函数。

大纲

SUBSTR(string-expression,start[,length])

参数

  • string-expression - 要从中派生子字符串的字符串表达式。表达式可以是列名、字符串文字或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。
  • - 一个整数,它指定子字符串在字符串表达式中的开始位置。正的起始位置指定从字符串开头开始的字符数。 中的第一个字符位于位置 1。负起始位置指定从字符串末尾算起的字符数。如果 为 (零),则将其视为 。
  • - 可选 — 一个正整数,指定要返回的子字符串的长度。此值指定子字符串在起始位置右侧结束长度字符。如果省略,则子字符串从字符串表达式的开头到结尾。如果长度为 或负数, 返回 NULL

描述

因为 可以是负数,所以可以从原始字符串的开头或结尾获取子字符串。

作为参数传递给 的浮点数通过截断小数部分转换为整数。

  • 如果 为 、–0 或 ,则返回的子字符串从字符串的第一个字符开始。
  • 如果 是负数,则返回的子字符串从字符串末尾开始该数量的字符, 表示字符串的最后一个字符。如果负数太大以至于从字符串末尾向后计数的值将位于字符串开头之前,则返回的子字符串从字符串的第一个字符开始。
  • 如果 start
0
0 155
文章 姚 鑫 · 五月 6, 2022 2m read

第134章 SQL函数 STUFF

字符串函数,用于替换字符串中的子字符串。

大纲

STUFF(string,start,length,substring)

参数

  • string - 作为子字符串替换目标的字符串表达式。
  • start - 替换的起点,指定为正整数。从字符串开头开始的字符数,从 1 开始计数。允许的值为 0 到字符串的长度。要追加字符,请指定 的开头和 的长度。空字符串或非数字值被视为 。
  • - 要替换的字符数,指定为正整数。要插入字符,请将长度指定为 。要在开始后替换所有字符,请指定大于现有字符数的长度。空字符串或非数字值被视为 0
  • - 一个字符串表达式,用于替换由其起始点和长度标识的子字符串。可以比它替换的子字符串更长或更短。可以是空字符串。

描述

用另一个子字符串替换一个子字符串。它标识要替换为位置和长度的子字符串,并将其替换为子字符串。

此函数提供与 实现的兼容性。

替换子字符串可能比原始值长或短。要删除原始值,子字符串可以是空字符串 ()。

起始值必须在字符串的当前长度范围内。您可以通过指定起始值 0 将子字符串附加到字符串的开头。空字符串或非数字值被视为 。

start、 或 参数指定 将返回 。

不能将 字段用于字符串或子字符串参数。尝试这样做会生成 SQLCODE -37 错误。

REPLACE 和 STUFF

和 都执行子字符串替换。

0
0 162
文章 姚 鑫 · 五月 5, 2022 3m read

第133章 SQL函数 STRING

将表达式转换并连接成字符串的函数。

大纲

STRING(string1[,string2][,...][,stringN])

参数

  • string - 表达式,可以是字段名称、字符串文字、数字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。如果指定了字段名称,则使用逻辑值。

描述

STRING 将一个或多个字符串转换为 STRING 格式,然后将这些字符串连接成一个字符串。不执行大小写转换。

在字符串转换之前将数字转换为其规范形式。因此,它执行算术运算,从数字中删除前导和尾随零以及前导加号。

如果字符串参数之一为 ,则 STRING 返回 。如果字符串参数之一是空字符串 (),则 将连接其他参数。 保留空格。

可以使用 函数转换数据值以进行区分大小写的字符串比较,或使用 函数转换数据值以进行不区分大小写的字符串比较。

示例

在以下嵌入式 SQL 示例中,STRING 将三个子字符串连接成一个字符串。该示例显示了空格、空字符串和 的处理:

/// d ##class(PHA.TEST.SQLFunction).String()
ClassMethod String()
{
	&sql(
		SELECT STRING('a','b','c'),
			STRING('a',' ','c'),
			STRING('a','','c'),
			STRING('a',NULL,'c')
		INTO :w,:x,:y,:z
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"Resulting string is:",w
		w !,"Resulting string is:",x
		w !,"Resulting string is:",y
		w !,"Resulting string is:",z 
	}
}
0
0 203
文章 姚 鑫 · 五月 4, 2022 2m read

第132章 SQL函数 STR

将数字转换为字符串的函数。

大纲

STR(number[,length[,decimals]])

参数

  • number - 解析为数字的表达式。它可以是字段名称、数字或其他函数的结果。如果指定了字段名称,则使用逻辑值。
  • length - 可选 — 一个整数,指定所需输出字符串的总长度,包括所有字符(数字、小数点、符号、空格)。默认值为 10
  • decimals - 可选 — 一个整数,指定要包含的小数点右侧的位数。默认值为 0。

描述

将数字转换为 格式,根据长度和小数的值截断数字。长度参数必须足够大以包含数字的整个整数部分,并且,如果指定小数,则该小数位数加 (用于小数点)。如果长度不够大,则 将返回一个星号 () 字符串,该字符串等于长度。

在字符串转换之前将数字转换为其规范形式。因此,它执行算术运算,从数字中删除前导和尾随零以及前导加号。

如果 参数为 NULL,则 返回 。如果 参数是空字符串 (),则 返回空字符串。 保留空格。

示例

在以下嵌入式 示例中, 将数字转换为字符串:

/// d ##class(PHA.TEST.SQLFunction).Str()
ClassMethod Str()
{
	&sql(
		SELECT STR(123),
			STR(123,4),
			STR(+00123.45,3),
			STR(+00123.45,3,1),
			STR(+00123.45,5,1)
		INTO :v,:w,:x,:y,:z
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"Resulting STR:",v," string"
		w !,"Resulting STR:",w," string"
		w !,"Resulting STR:",x," string"
		w !,"Resulting STR:",y," string"
		w !,"Resulting STR:",z," string" 
	}
}
0
0 141
文章 姚 鑫 · 五月 3, 2022 1m read

第131章 SQL函数 SQUARE

返回数字平方的标量数值函数。

大纲

SQUARE(numeric-expression)

参数

  • numeric-expression - 解析为数值的表达式。

SQUARE 返回 NUMERIC 或 数据类型。如果 是数据类型 ,则 返回 ;否则,它返回 。

描述

返回数值表达式的平方。如果传递 值,SQUARE 返回 。

返回的精度和小数位数与 乘法运算符返回的相同。

示例

以下嵌入式 SQL 示例返回整数 到 10 的平方:

/// d ##class(PHA.TEST.SQLFunction).Square()
ClassMethod Square()
{
	s a = 0
	while a < 11 {
		&sql(
			SELECT SQUARE(:a) INTO :b
		)
		if SQLCODE '= 0 {
			w !,"Error code ",SQLCODE 
		} else {
			w !,"The square of ",a," = ",b
			s a = a + 1 
		}
	}
}

DHC-APP>d ##class(PHA.TEST.SQLFunction).Square()
 
The square of 0 = 0
The square of 1 = 1
The square of 2 = 4
The square of 3 = 9
The square of 4 = 16
The square of 5 = 25
The square of 6 = 36
The square of 7 = 49
The square of 8 = 64
The square of 9 = 81
The square of 10 = 100
0
0 128
文章 姚 鑫 · 五月 2, 2022 2m read

第130章 SQL函数 SQRT

返回给定数值表达式的平方根的数值函数。

大纲

SQRT(numeric-expression)

{fn SQRT(numeric-expression)}

参数

  • numeric-expression - 解析为计算平方根的正数的表达式。

SQRT 返回 NUMERIC 或 数据类型。如果 是数据类型 ,则 返回 ;否则,它返回 NUMERIC。

描述

返回 的平方根。 numeric-expression 必须是正数。负数值表达式( 除外)会生成 错误。如果传递 值, 返回 。

返回一个精度为 、小数位数为 18 的值。

可以指定为常规标量函数或 标量函数(使用大括号语法)。

示例

以下示例显示了两种 语法形式。两者都返回 的平方根:

SELECT SQRT(49) AS SRoot,{fn SQRT(49)} AS ODBCSRoot

7	7

以下嵌入式 示例返回整数 到 的平方根:

/// d ##class(PHA.TEST.SQLFunction).Sort()
ClassMethod Sort()
{
	s a = 0
	while a < 11 {
		&sql(
			SELECT SQRT(:a) INTO :b
		)
		if SQLCODE '= 0 {
			w !,"Error code ",SQLCODE 
		} else {
			w !,"The square root of ",a," = ",b
			s a = a + 1 
		}
	}
}
0
0 132
文章 姚 鑫 · 五月 1, 2022 4m read

第129章 SQL函数 %SQLUPPER

将值排序为大写字符串的排序规则函数。

大纲

%SQLUPPER(expression[,maxlen]) 

%SQLUPPER expression

参数

  • expression - 字符串表达式,可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。表达式可以是子查询。
  • - 可选 — 一个整数,指定整理后的值将被截断为 的值。请注意, maxlen 包括附加的前导空格。您可以用双括号将 括起来以抑制文字替换:(())。

描述

SQLUPPER 是默认排序规则。

将表达式转换为排序为(不区分大小写)大写字符串的格式。 将所有字母字符转换为大写,从字符串中去除尾随空格(空格、制表符等),然后在字符串开头添加一个前导空格。这个附加的空格会导致 NULL 和数值被整理为字符串。

在将数字传递给函数之前将数值转换为规范形式(删除前导零和尾随零、扩展指数等)。 不会将数字字符串转换为规范形式。

因为 %SQLUPPER 将空格附加到所有值,所以它将 值作为空格进行整理,字符串长度为 1。 将任何仅包含空格(空格、制表符等)的值整理为 SQL 空字符串 ()。当

0
0 151
文章 姚 鑫 · 四月 30, 2022 4m read

第128章 SQL函数 %SQLSTRING

将值排序为字符串的排序规则函数。

大纲

%SQLSTRING(expression[,maxlen])

%SQLSTRING expression

参数

  • expression - 字符串表达式,可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。表达式可以是子查询。
  • - 可选 — 一个正整数,指定整理后的值将被截断为 的值。请注意, maxlen 包括附加的前导空格。可以用双括号将 括起来以抑制文字替换:(())。

描述

%SQLSTRING 将表达式转换为按(区分大小写)字符串排序的格式。 从字符串中去除尾随空格(空格、制表符等),然后在字符串的开头添加一个前导空格。这个附加的空格强制将 NULL 和数值作为字符串进行整理。从数字中删除前导零和尾随零。

因为 将空格附加到所有值,所以它将 值整理为空格,字符串长度为 1。 将任何仅包含空格(空格、制表符等)的值整理为 SQL 空字符串()。当 将空格附加到空(零长度)字符串时,它会将空格加上空字符串的内部表示形式 进行整理,从而导致字符串长度为 。

可选的 参数在索引或整理时将表达式字符串截断为指定的字符数。例如,如果插入带有 截断的字符串,则插入完整的字符串,并且可以通过

0
0 127
文章 姚 鑫 · 四月 29, 2022 1m read

第127章 SQL函数 SPACE

返回一串空格的字符串函数。

大纲

SPACE(count)

{fn SPACE(count)}

参数

  • count - 整数表达式,指定要返回的空格数。

描述

SPACE 返回一个空格字符串 count 个空格长。如果 是数字字符串、十进制数或混合数字字符串, 会将其解析为其整数部分。如果 是负数或非数字字符串将其解析为 。

要从字符串中删除空格,请使用 (前导空格)或 (尾随空格)。

注意:不应将 SPACE 函数与 归类类型混淆。 排序规则在一个值前面添加一个空格,强制将其作为字符串进行评估。为了建立 归类, 提供了一个 归类关键字,ObjectScript 提供了 类的 方法。

示例

以下嵌入式 SQL 示例返回名称字段长度的空格字符串:

/// d ##class(PHA.TEST.SQLFunction).Space()
ClassMethod Space()
{
	&sql(
		SELECT SPACE(LENGTH(name))
			INTO :a
		FROM Sample.Person
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"Leave this much space:",a,"for names" 
	}
}
0
0 102
文章 姚 鑫 · 四月 28, 2022 1m read

第126章 SQL函数 SIN

标量数值函数,返回角度的正弦值(以弧度为单位)。

大纲

{fn SIN(numeric-expression)}

参数

  • numeric-expression - 数值表达式。这是一个以弧度表示的角度。

SIN 返回 NUMERIC 或 数据类型。如果 是数据类型 ,则 返回 ;否则,它返回 。

描述

接受任何数值并将其正弦作为浮点数返回。如果传递一个 值,SIN 返回 。 将非数字字符串视为数值 。

返回一个精度为 、小数位数为 18 的值。

只能用作 标量函数(使用大括号语法)。

可以使用 函数将弧度转换为度数。可以使用 函数将度数转换为弧度。

示例

以下示例显示了 SIN 的效果:

SELECT {fn SIN(0.52)} AS Sine

0.496880137843736714
0
0 97
文章 姚 鑫 · 四月 27, 2022 1m read

第125章 SQL函数 SIGN

返回给定数值表达式符号的数值函数。

大纲

SIGN(numeric-expression)

{fn SIGN(numeric-expression)}

参数

  • numeric-expression - 要为其返回符号的数字。

SIGN 返回 SMALLINT 数据类型。

描述

返回以下内容:

  • -1 如果 numeric-expression 小于零。
  • 如果 numeric-expression 为零,则为 (零):0、 或 。
  • 如果 大于零,则为 。
  • 如果 为 ,或者它是非数字字符串,则为 。

可用作 标量函数(使用花括号语法)或 SQL 通用函数。

在确定其值之前将数值表达式转换为规范形式。例如, 和 都返回 ,表示一个正数。

注意:两个负号(连字符)是内嵌注释指示符。因此,指定两个连续负号的 参数必须显示为用引号括起来的数字字符串。

示例

以下示例显示了 的效果:

SELECT {fn SIGN(-0.0)} AS PosNeg

0
SELECT SIGN(-+-16.748) AS PosNeg

1
0
0 132
文章 姚 鑫 · 四月 26, 2022 4m read

第124章 SQL函数 SECOND

返回日期时间表达式的秒数的时间函数。

大纲

{fn SECOND(time-expression)}

参数

  • time-expression - 作为列名、另一个标量函数的结果或字符串或数字文字的表达式。它必须解析为时间戳字符串或 $HOROLOG 字符串,其中基础数据类型可以表示为 %Time、 或 。

描述

SECOND 返回一个从 0 到 的整数,也可能返回小数秒。秒数是针对 或 值、 格式日期字符串(没有时间值)或时间戳计算的。

时间表达式时间戳可以是数据类型 (编码的 位有符号整数),也可以是数据类型 %Library.TimeStamp ()。

要更改默认时间格式,请使用 命令。

必须提供时间戳字符串 () 或 字符串。 $HOROLOG 字符串可以是完整的日期时间字符串 () 或只是 的时间整数部分。不能提供时间字符串 ();无论实际秒数如何,这始终返回 。

日期时间字符串的时间部分必须是有效时间。否则,将生成 错误 。秒 () 部分必须是 到 范围内的整数。前导零在输入时是可选的;前导零在输出上被抑制。

日期时间字符串的日期部分未经过验证。

当秒部分为或时, 返回 秒。如果提供了没有时间表达式的 ODBC 日期,或者完全省略了时间表达式的秒部分()。

可以使用 或 返回相同的时间信息。

也可以使用

0
0 195
文章 姚 鑫 · 四月 25, 2022 2m read

第123章 SQL函数 SEARCH_INDEX

从索引的 Find() 方法返回一组值的函数。

大纲

SEARCH_INDEX([[schema_name.]table-name.]index-name[,findparam[,...])

参数

  • table-name - 可选 — 为其定义了 index-name 的现有表的名称。不能是一个视图。表的 schema_name 是可选的。如果省略,则搜索 子句中指定的所有表。
  • - 要搜索的索引。现有索引的索引映射的 。
  • findparam - 可选 — 要传递给索引的 方法的参数或逗号分隔的参数列表。

描述

调用 方法并返回一组值。可以选择将参数传递给此 方法。例如, 调用 方法。

可以与 子句中的 %FIND 谓词一起使用,以提供对象的 ,该对象提供封装一组值的抽象表示。这些值通常是查询运行时调用的方法返回的行 。 调用索引的 方法来返回这个 。此用法显示在以下示例中:

该索引必须在 语句引用的表中找到。如果 语句使用的表中不存在指定的索引名称,则会生成 SQLCODE -151 错误。如果指定的索引名不是完全限定的,则会生成 错误,因此在 语句使用的表中不明确(可能引用多个现有索引)。

如果索引存在,但没有对应的 方法,则生成运行时 错误,错误为 。

0
0 137
文章 Michael Lei · 四月 25, 2022 4m read

在一次重大的版本升级中,建议重新编译你所有命名空间的类和例程。 (主要版本的安装后任务).

do $system.OBJ.CompileAllNamespaces("u")
do ##Class(%Routine).CompileAllNamespaces()

为了自动完成这项管理任务并记录任何错误,下面是一个导入并编译到USER命名空间的类的例子,你可以在每次升级后使用它 : admin.utils.cls

 Class admin.utils.cls

0
0 178
文章 姚 鑫 · 四月 24, 2022 2m read

第122章 SQL函数 RTRIM

字符串函数,它返回一个删除了尾随空格的字符串。

大纲

RTRIM(string-expression)

{fn RTRIM(string-expression)}

参数

  • string-expression - 字符串表达式,可以是列名、字符串文字或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。

描述

RTRIM 从字符串表达式中去除尾随空格,并将字符串作为 VARCHAR 类型返回。如果 为 ,则 返回 。如果 是一个完全由空格组成的字符串,则 返回空字符串 ()。

无论要裁剪的输入表达式的数据类型是什么,总是返回数据类型。

RTRIM 留下前导空白;要删除前导空格,请使用 。要删除任何类型的前导和/或尾随字符,请使用 TRIM。要使用尾随空格或其他字符填充字符串,请使用 。要创建一串空白,请使用 。

请注意, 可用作 标量函数(使用大括号语法)或 SQL 通用函数。

示例

以下嵌入式 SQL 示例从字符串中删除了五个尾随空格。它留下五个前导空白:

/// d ##class(PHA.TEST.SQLFunction).Rtrim()
ClassMethod Rtrim()
{
	s a="     Test string with 5 leading and 5 trailing spaces.     "
	&sql(
		SELECT {fn RTRIM(:a)} INTO :b
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"Before RTRIM",!,"start:",a,":end"
		w !,"After RTRIM",!,"start:",b,":end" 
	}
}
0
0 169
文章 姚 鑫 · 四月 23, 2022 2m read

第121章 SQL函数 RPAD

字符串函数,它返回一个右填充到指定长度的字符串。

大纲

RPAD(string-expression,length[,padstring])

参数

  • string-expression - 字符串表达式,可以是列名、字符串文字、主机变量或另一个标量函数的结果。可以是可转换为 VARCHAR 数据类型的任何数据类型。字符串表达式不能是流。
  • length - 整数,指定返回的字符串中的字符数。
  • padstring - 可选 — 由一个字符或一串字符组成的字符串,用于填充输入字符串表达式。 padstring 字符或字符附加到 string-expression 的右侧,以提供创建长度字符的输出字符串所需的尽可能多的字符。 可以是字符串文字、列、主机变量或另一个标量函数的结果。如果省略,则默认为空格字符。

描述

用尾随填充字符填充字符串表达式。它返回填充到长度字符数的字符串的副本。如果字符串表达式的长度超过 个字符,则返回字符串被截断为 个字符。

如果 为 ,则 RPAD 返回 。如果 为空字符串 () ,则 返回一个完全由填充字符组成的字符串。返回的字符串是 类型。

可用于针对链接表的查询。

不会删除前导或尾随空格;它填充字符串,包括任何前导或尾随空格。要在填充字符串之前删除前导或尾随空格,请使用 LTRIM、 或 。

示例

0
0 180
文章 姚 鑫 · 四月 22, 2022 5m read

第120章 SQL函数 ROUND

以指定位数舍入或截断数字的数值函数。

大纲

ROUND(numeric-expr,scale[,flag])

{fn ROUND(numeric-expr,scale[,flag])}

参数

  • numeric-expr - 要四舍五入的数字。一个数值表达式。
  • scale - 计算结果为整数的表达式,该整数指定要舍入到的位数,从小数点开始计数。可以是零、正整数或负整数。如果 scale 是小数, 会将其四舍五入为最接近的整数。
  • flag - 可选 — 一个布尔标志,指定是舍入还是截断 。默认值为 0

返回与 相同的数据类型。

描述

此函数可用于将数字舍入或截断为指定的小数位数。

将 舍入或截断以缩放位置,从小数点开始计数。舍入时,数字 5 始终向上舍入。在 循环或截断操作后删除尾随零。不返回前导零。

  • 如果 为正数,则在小数点右侧的该位数处进行舍入。如果 等于或大于小数位数,则不会发生舍入或零填充。
  • 如果 为零,则舍入到最接近的整数。换句话说,在小数点右边的零位处进行舍入;所有小数位和小数点本身都被删除。
  • 如果 为负数,则在小数点左侧的该位数处进行舍入。如果 等于或大于舍入结果中的整数位数,则返回零。
  • 如果 为零(但表示为:、 等),将返回 (零)且没有小数位,而不管比例值如何。
  • 如果 或 为 , 返回 。

请注意,

0
0 280
文章 姚 鑫 · 四月 21, 2022 1m read

第119章 SQL函数 RIGHT

标量字符串函数,它从字符串表达式的末尾(最右边的位置)返回指定数量的字符。

大纲

{fn RIGHT(string-expression,count)}

参数

  • string-expression - 字符串表达式,可以是列名、字符串文字或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。
  • - 整数,指定从 的结束(最右边)位置返回的字符数。

描述

RIGHT 从字符串表达式的末尾(最右边的位置)返回 个字符。如果为任一参数传递 值, 将返回 。

只能用作 标量函数(使用大括号语法)。

示例

以下示例返回 Sample.Person 表中每个名称最右边的两个字符:

SELECT Name,{fn RIGHT(Name,2)}AS MiddleInitial
     FROM Sample.Person

以下嵌入式 SQL 示例显示 RIGHT 如何处理比字符串本身长的计数:

/// d ##class(PHA.TEST.SQLFunction).Right()
ClassMethod Right()
{
	&sql(
		SELECT Name,{fn RIGHT(Name,40)}
			INTO :a,:b
		FROM Sample.Person
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,a,"=original",!,b,"=RIGHT 40" 
	}
}
0
0 120
文章 姚 鑫 · 四月 20, 2022 2m read

第118章 SQL函数 REVERSE

标量字符串函数,它以相反的字符顺序返回一个字符串。

大纲

REVERSE(string-expression)

参数

  • string-expression - 要反转的字符串表达式。表达式可以是列名、字符串文字、数字或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHARVARCHAR)。

描述

REVERSE 返回字符顺序颠倒的字符串表达式。例如 'Hello World!' 返回为 '!dlroW olleH'。这是一个简单的字符串顺序反转,没有额外的处理。

返回的字符串是数据类型 VARCHAR,与输入值的数据类型无关。数字转换为规范形式,数字字符串在反转之前不会转换为规范形式。

前导和尾随空白不受反转的影响。

反转 值会导致 NULL

注意:因为 REVERSE 总是返回一个 字符串,所以某些类型的数据在反转时会变得无效:

  • 反向列表不再是有效列表,无法从存储格式转换为显示格式。
  • 反转日期不再是有效日期,并且无法从存储格式转换为显示格式。

示例

以下示例反转 字段值。在这种情况下,这会导致名称按中间名首字母排序:

SELECT Name,REVERSE(Name) AS RevName
FROM Sample.Person
ORDER BY RevName
0
0 136
文章 Michael Lei · 四月 20, 2022 1m read

附件中的压缩文件包含了一些我多年来所做的Cache SQL Storage映射的例子。

如果你有现有的globals,并且想通过Objects或SQL暴露它们,你需要设置Cache SQL Storage映射。  如果你没有看到对你的情况有帮助的例子,请给我发一个例子,我可以帮你解决。

下载附件:https://community.intersystems.com/sites/default/files/post-associated-…

0
0 163
文章 姚 鑫 · 四月 19, 2022 1m read

第117章 SQL函数 REPLICATE

将字符串重复指定次数的字符串函数。

大纲

REPLICATE(expression,repeat-count)

参数

  • expression - 要重复的字符串表达式。
  • repeat-count - 重复的次数,以整数表示。

描述

注意:REPLICATE 函数是 函数的别名。提供 REPLICATE 是为了与 兼容。有关详细信息,请参阅重复。

0
0 87
文章 Michael Lei · 四月 19, 2022 13m read

有很多方法可以使用Intersystems生成excel文件,其中一些是ZEN报告、IRIS报告(Logi报告或正式称为JReports),或者我们可以使用第三方Java库,可能性几乎是无限的。

但是,如果你想只用Caché ObjectScript创建一个简单的电子表格呢?(没有第三方应用程序)

在我的案例中,我需要生成包含大量原始数据的报告(财务人员喜欢这些数据),但是我的ZEN/IRIS失败了,给了我一个我想称之为 "零字节的文件",基本上说java的内存用完了,并导致报告服务器上的重载。

这可以用Office Open XML(OOXML)来完成。Office Open XML格式是由一个ZIP包内的一些XML文件组成的。因此,基本上我们需要生成这些XML文件,并将其压缩重命名为.xslx。就这么简单。

这些文件遵循一套简单的惯例,称为开放包装惯例。你需要声明各部分的内容类型,以及告诉消费应用程序应该从哪里开始。

为了创建一个简单的电子表格,我们至少需要5个文件。

  • workbook.xml
  • worksheet.xml
  • [Content_Types].xml
  • styles.xml
  • _rels
    • .rels
    • workbook.xml.rels

workbook.xml
工作簿是各种工作表的容器。

0
0 221
文章 姚 鑫 · 四月 18, 2022 3m read

第116章 SQL函数 REPLACE

字符串函数,用于替换字符串中的子字符串。

大纲

REPLACE(string,oldsubstring,newsubstring)

参数

  • string - 作为子字符串搜索目标的字符串表达式。
  • oldsubstring - 字符串中要匹配的子字符串。
  • newsubstring - 用于替换 oldsubstring 的子字符串。

描述

在字符串中搜索子字符串并替换所有匹配项。匹配区分大小写。如果找到匹配项,它将用 替换 的每个实例。替换子串可能比它替换的子串长或短。如果找不到子字符串,则 将原样返回原字符串。

无论字符串的数据类型如何, 返回的值始终是数据类型 。这允许替换操作,例如 REPLACE(12.3,'.','_')

不能对字符串、 或 newsubstring 参数使用 字段。尝试这样做会生成 错误。

空字符串是字符串值。因此,可以将空字符串用于任何参数值。但是,请注意 ObjectScript 空字符串作为 传递给 。

NULL 不是 中的数据值。因此,为任何 参数指定 将返回 ,无论是否发生匹配。

此函数提供与 实现的兼容性。

REPLACE, STUFF, and $TRANSLATE

和 都执行子字符串替换。 按数据值搜索子字符串。

0
0 186
文章 姚 鑫 · 四月 17, 2022 1m read

第115章 SQL函数 REPEAT

将字符串重复指定次数的字符串函数。

大纲

REPEAT(expression,repeat-count)

{fn REPEAT(expression,repeat-count)}

参数

  • expression - 要重复的字符串表达式。
  • repeat-count - 重复的次数,以整数表示。

描述

REPEAT 返回一串重复计数的表达式实例,连接在一起。

如果表达式为 ,则 返回 NULL。如果 是空字符串,则 返回一个空字符串。

如果重复计数是小数,则仅使用整数部分。如果重复计数为 ,则 返回一个空字符串。如果重复计数是负数、 或非数字字符串,则 返回 。

示例

以下示例显示了 的两种形式。两个示例都返回字符串:

SELECT REPEAT('BANG',3) AS Tripled

BANGBANGBANG
SELECT {fn REPEAT('BANG',3)} AS Tripled

BANGBANGBANG
0
0 153
文章 姚 鑫 · 四月 16, 2022 2m read

第114章 SQL函数 RADIANS

将度数转换为弧度的数值函数。

大纲

RADIANS(numeric-expression)

{fn RADIANS(numeric-expression)}

参数

  • numeric-expression - 以度为单位的角度度量。解析为数值的表达式。

RADIANS 返回 NUMERIC 或 数据类型。如果 是数据类型 , 返回 ;否则,它返回 。

可以指定为标准标量函数或带有大括号语法的 ODBC 标量函数。

描述

以度为单位进行角度测量,并以弧度返回相应的角度测量。如果传递 NULL 值,RADIANS 将返回 。

返回值的默认精度为 ,默认小数位数为 。

可以使用 函数将弧度转换为度数。

示例

以下嵌入式 SQL 示例以 30 度为增量返回与从 到 的度值对应的弧度等效值:

/// d ##class(PHA.TEST.SQLFunction).Radians()
ClassMethod Radians()
{
	s a = 0
	while a < 366 {
		&sql(
			SELECT RADIANS(:a) INTO :b
		)
		if SQLCODE '= 0 {
			w !,"Error code ",SQLCODE 
		} else {
		w !,"degrees ",a," = radians ",b
		s a = a + 30 
		}
	}
}
0
0 129
文章 姚 鑫 · 四月 15, 2022 2m read

第113章 SQL函数 QUARTER

日期函数,它将一年中的季度作为日期表达式的整数返回。

大纲

{fn QUARTER(date-expression)}

参数

  • date-expression - 表达式,它是列的名称、另一个标量函数的结果,或者是日期或时间戳文字。

描述

QUARTER 返回一个从 1 到 的整数。季度是针对 日期整数、$HOROLOG 或 值、ODBC 格式日期字符串或时间戳计算的。

日期表达式时间戳可以是数据类型 (编码的 64 位有符号整数),也可以是数据类型 (yyyy-mm-dd hh:mm:ss.fff)。

四个季度的时间段如下:

Quarter Period (inclusive)
1 January 1 to March 31 (90 or 91 days)
2 April 1 to June 30 (91 days)
3 July 1 to September 30 (92 days)
4 October 1 to December 31 (92 days)

基于日期时间字符串的月份部分。但是,所有日期表达式都经过验证,并且必须包含 112 范围内的月份以及指定月份和年份的有效日期值。否则,将生成 错误 。 的时间部分可以省略,但如果存在则必须有效。

使用 或

0
0 163
文章 Qiao Peng · 四月 14, 2022 11m read

8. 应用安全

InterSystems数据平台上可能运行着多种应用,例如Web网页应用、SOAP服务、REST API、HL7 接口、SQL服务等等。这些应用种类繁多,面临的安全风险也是巨大的,例如代码注入攻击和HTTP的跨站请求伪造攻击等。

这其中代码注入攻击和针对Web应用的攻击尤其需要重视。

8.1 代码注入攻击

代码注入攻击通常和我们编写的程序相关,需要在程序编写时注意避免。

8.1.1 SQL注入攻击

SQL注入攻击是典型的代码注入攻击,通过从外部注入恶意SQL语句获得数据权限并获得敏感数据。关系型访问方式都是通过客户端SQL语句传入执行的,因此它是数据库重点需要防范的。

InterSystems数据平台并不支持以分号分割的多条SQL语句作为一个SQL命令执行,因此它本身免疫了主要的SQL注入攻击手段。

InterSystems数据平台支持动态SQL,即允许SQL命令作为方法的字符串参数传入,这会给SQL注入攻击留有隐患。在编程时,应避免开放服务用于接受完整的SQL语句作为参数,而是通过SQL动态传参来构建运行时SQL。

InterSystems数据平台支持行级安全,这有助于避免在SQL注入攻击时,将所有数据返回给攻击请求。

8.1.2 $ZF

InterSystems数据平台提供了系统函数$ZF,用以调用外部命令。其中$ZF(-1)和$ZF(-2)用以调用服务器操作系统的命令。

0
1 569
文章 姚 鑫 · 四月 13, 2022 1m read

第111章 SQL函数 PREDICT

IntegratedML 函数,它应用指定的训练模型来预测提供的每个输入行的结果。

大纲

PREDICT(model-name )

PREDICT(model-name USE trained-model-name )

PREDICT(model-name WITH feature-columns-clause )

PREDICT(model-name USE trained-model-name WITH feature-columns-clause )

描述

PREDICT 是一个 IntegratedML 函数,可用作 选择项以返回将经过训练的机器学习模型应用于指定查询的结果。

0
0 119
文章 Michael Lei · 四月 13, 2022 7m read

image

这篇文章是对我的  iris-globals-graphDB 应用的介绍。
在这篇文章中,我将演示如何在Python Flask Web 框架和PYVIS交互式网络可视化库的帮助下,将图形数据保存和抽取到InterSystems Globals中。

建议

 

第一步 : 通过使用Python 原生SDK建立与IRIS Globals的链接

 #create and establish connection
  if not self.iris_connection:
        self.iris_connection = irisnative.createConnection("localhost", 1972, "USER", "superuser", "SYS")
                                     
  # Create an iris object
  self.iris_native = irisnative.createIris(self.iris_connection)
  return self.iris_native

 

第二步 : 使用 iris_native.set( ) 功能把数据保存到Globals 里     

#import nodes data from csv file
isdefined = self.iris_native.isDefined("^g1nodes")
if isdefined == 0:
with open("/opt/irisapp/misc/g1nodes.csv", newline='') as csvfile:

reader = csv.DictReader(csvfile) for row in reader: self.iris_native.set(row["name"], "^g1nodes", row["id"])

#import edges data from csv file isdefined = self.iris_native.isDefined("^g1edges") if isdefined == 0: with open("/opt/irisapp/misc/g1edges.csv", newline='') as csvfile: reader = csv.DictReader(csvfile) counter = 0                 for row in reader: counter = counter + 1 #Save data to globals self.iris_native.set(row["source"]+'-'+row["target"], "^g1edges", counter)  

 

第三步: 使用iris_native.get() 功能把节点和边缘数据从Globals传递给PYVIS

 #Get nodes data for basic graph    
  def get_g1nodes(self):
        iris = self.get_iris_native()
        leverl1_subscript_iter = iris.iterator("^g1nodes")
        result = []
        # Iterate over all nodes forwards
        for level1_subscript, level1_value in leverl1_subscript_iter:
#Get data from globals
            val = iris.get("^g1nodes",level1_subscript)
            element = {"id": level1_subscript, "label": val, "shape":"circle"}
            result.append(element)            
        return result

    #Get edges data for basic graph       def get_g1edges(self):         iris = self.get_iris_native()         leverl1_subscript_iter = iris.iterator("^g1edges")         result = []         # Iterate over all nodes forwards         for level1_subscript, level1_value in leverl1_subscript_iter: #Get data from globals             val = iris.get("^g1edges",level1_subscript)             element = {"from": int(val.rpartition('-')[0]), "to": int(val.rpartition('-')[2])}             result.append(element)                     return result

 

Step4: Use PYVIS Javascript to generate graph data

<script type="text/javascript">
    // initialize global variables.
    var edges;
    var nodes;
    var network;
    var container;
    var options, data;
 
    // This method is responsible for drawing the graph, returns the drawn network
    function drawGraph() {
        var container = document.getElementById('mynetwork');
        let node = JSON.parse('{{ nodes | tojson }}');
        let edge = JSON.parse('{{ edges | tojson }}');
     
       // parsing and collecting nodes and edges from the python
        nodes = new vis.DataSet(node);
        edges = new vis.DataSet(edge);

        // adding nodes and edges to the graph         data = {nodes: nodes, edges: edges};

        var options = {           "configure": {                 "enabled": true,                 "filter": [                 "physics","nodes"             ]             },             "nodes": {                 "color": {                   "border": "rgba(233,180,56,1)",                   "background": "rgba(252,175,41,1)",                   "highlight": {                     "border": "rgba(38,137,233,1)",                     "background": "rgba(40,138,255,1)"                   },                   "hover": {                   "border": "rgba(42,127,233,1)",                     "background": "rgba(42,126,255,1)"                 }                 },

                "font": {                   "color": "rgba(255,255,255,1)"                 }               },             "edges": {                 "color": {                     "inherit": true                 },                 "smooth": {                     "enabled": false,                     "type": "continuous"                 }             },             "interaction": {               "dragNodes": true,                 "hideEdgesOnDrag": false,               "hideNodesOnDrag": false,                 "navigationButtons": true,                 "hover": true             },

            "physics": {                 "barnesHut": {                     "avoidOverlap": 0,                   "centralGravity": 0.3,                   "damping": 0.09,                     "gravitationalConstant": -80000,                     "springConstant": 0.001,                     "springLength": 250                 },

                "enabled": true,                 "stabilization": {                     "enabled": true,                     "fit": true,                     "iterations": 1000,                     "onlyDynamicEdges": false,                     "updateInterval": 50                 }             }         }         // if this network requires displaying the configure window,         // put it in its div         options.configure["container"] = document.getElementById("config");         network = new vis.Network(container, data, options);       return network;     }     drawGraph(); </script>

 

第五步: 从app.py 主文件调用上面的代码

#Mian route. (index)
@app.route("/")
def index():
    #Establish connection and import data to globals
    irisglobal = IRISGLOBAL()
    irisglobal.import_g1_nodes_edges()
    irisglobal.import_g2_nodes_edges()

    #getting nodes data from globals     nodes = irisglobal.get_g1nodes()     #getting edges data from globals     edges = irisglobal.get_g1edges()

    #To display graph with configuration     pyvis = True     return render_template('index.html', nodes = nodes,edges=edges,pyvis=pyvis)    

下面是关于此项目的 介绍视频:

0
0 452