第八十章 SQL函数 $LIST(二)

123 阅读3分钟

第八十章 SQL函数 $LIST(二)

示例

在以下嵌入式 SQL 示例中,两个 WRITE 语句都返回“Red”,即列表中的第一个元素。第一个默认写入第一个元素,第二个写入第一个元素,因为位置参数设置为 1

/// d ##class(PHA.TEST.SQLFunction).Li4()
ClassMethod Li4()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(SELECT $LIST(:a), $LIST(:a,1)
		INTO :b,:c )
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The one-arg sublist is ",b
		w !,"The two-arg sublist is ",c }
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li4()
 
The one-arg sublist is Red
The two-arg sublist is Red

以下嵌入式 SQL 示例返回列表中的第二个元素“Blue”

/// d ##class(PHA.TEST.SQLFunction).Li5()
ClassMethod Li5()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(
		SELECT $LIST(:a,2)
		INTO :b 
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The second element is ",b 
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li5()
 
The second element is Blue

以下嵌入式 SQL 示例返回“Red Blue”,这是一个双元素列表字符串,从列表中的第一个元素开始,到第二个元素结束。使用 ZZDUMP 而不是 WRITE,因为列表字符串包含特殊(非打印)编码字符:

/// d ##class(PHA.TEST.SQLFunction).Li6()
ClassMethod Li6()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(
		SELECT $LIST(:a,1,2)
		INTO :b 
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The encoded sublist is"
		ZZDUMP b   ; Prints "Red Blue " 
	}
}

DHC-APP>d ##class(PHA.TEST.SQLFunction).Li6()
 
The encoded sublist is
0000: 05 01 52 65 64 06 01 42 6C 75 65                        ..Red..Blue

以下嵌入式 SQL 示例返回未知长度列表中的最后一个元素。在这里,最后一个元素首先作为普通字符串返回,然后作为编码列表字符串返回:

/// d ##class(PHA.TEST.SQLFunction).Li7()
ClassMethod Li7()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(
		SELECT $LISTLENGTH(:a), $LIST(:a, -1)
		INTO :b,:plain 
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		&sql(
			SELECT $LIST(:a,:b,-1)
			INTO :encoded
		)
		if SQLCODE '= 0 {
			w !,"Error code ",SQLCODE 
		} else {
			w !,"The final element as a string: ",plain
			w !,"The final element as an encoded string: "
			ZZDUMP encoded 
		}
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li7()
 
The final element as a string: Green
The final element as an encoded string:
0000: 07 01 47 72 65 65 6E                                    ..Green

注意

无效的参数值

如果列表参数中的表达式未计算为有效列表,则会生成 SQLCODE -400 致命错误:

/// d ##class(PHA.TEST.SQLFunction).Li8()
ClassMethod Li8()
{
	s a = "the quick brown fox"
	&sql(
		SELECT $LIST(:a, 1)
		INTO :b 
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The sublist is"
		ZZDUMP b   ; Variable not set 
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li8()
 
Error code -400

如果 position 参数或 end 参数的值小于 -1,则会生成 SQLCODE -400 致命错误:

/// d ##class(PHA.TEST.SQLFunction).Li9()
ClassMethod Li9()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(
		SELECT $LIST(:a, -2, 3)
		INTO :b 
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The sublist is"
		ZZDUMP b   ; Variable not set 
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li9()
 
Error code -400

如果 position 参数的值引用了一个不存在的列表成员并且没有使用 end 参数,则会生成 SQLCODE -400 致命错误:

/// d ##class(PHA.TEST.SQLFunction).Li10()
ClassMethod Li10()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(
		SELECT $LIST(:a, 7)
		INTO :b
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The sublist is"
		ZZDUMP b   ; Variable not set
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li10()
 
Error code -400

但是,如果使用 end 参数,则不会发生错误,并且返回 null 字符串。

/// d ##class(PHA.TEST.SQLFunction).Li11()
ClassMethod Li11()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(
		SELECT $LIST(:a, 7, -1)
		INTO :b 
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"Error code ",SQLCODE
		w !,"The sublist is"
		ZZDUMP b   ; Prints a null string 
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li11()
 
Error code 0
The sublist is

如果 position 参数的值标识具有未定义值的元素,则会生成 SQLCODE –400 致命错误:

/// d ##class(PHA.TEST.SQLFunction).Li12()
ClassMethod Li12()
{
	s a = $lb("Red", "Blue", "Green")
	&sql(
		SELECT $LIST(:a, 2)
		INTO :b
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The sublist is"
		ZZDUMP b   ; Variable not set
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li12()
 
The sublist is
0000: 42 6C 75 65                                             Blue

两个参数和三个参数 $LIST

$LIST(list,1) 不等价于 $LIST(list,1,1) 因为前者返回一个字符串,而后者返回一个单元素列表字符串。如果没有要返回的元素,则双参数形式不返回值;三参数形式返回一个空字符串。

Unicode

如果一个 Unicode 字符出现在列表元素中,则整个列表元素将表示为 Unicode(宽)字符。列表中的其他元素不受影响。

以下嵌入式 SQL 示例显示了两个列表。 a 列表由两个仅包含 ASCII 字符的元素组成。 b 列表由两个元素组成:第一个元素包含一个 Unicode 字符($CHAR(960) = pi 符号);第二个元素仅包含 ASCII 字符。

/// d ##class(PHA.TEST.SQLFunction).Li13()
ClassMethod Li13()
{
	s a = $lb("ABC" _ $CHAR(68), "XYZ")
	s b = $lb("ABC" _ $CHAR(960), "XYZ")
	&sql(
		SELECT $LIST(:a, 1), $LIST(:a, 2), $LIST(:b, 1), $LIST(:b, 2)
		INTO :a1, :a2, :b1, :b2 
	)
	if SQLCODE '= 0 {
		w !,"Error code ",SQLCODE 
	} else {
		w !,"The ASCII list a elements: "
		ZZDUMP a1
		ZZDUMP a2
		w !,"The Unicode list b elements: "
		ZZDUMP b1
		ZZDUMP b2 
	}
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).Li13()
 
The ASCII list a elements:
0000: 41 42 43 44                                             ABCD
0000: 58 59 5A                                                XYZ
The Unicode list b elements:
0000: 0041 0042 0043 03C0                                     ABCπ
0000: 58 59 5A                                                XYZ

请注意, IRIS 将 b 的第一个元素完全编码为宽 Unicode 字符。 b 的第二个元素不包含 Unicode 字符,因此 IRIS 使用窄 ASCII 字符对其进行编码。