0
点赞
收藏
分享

微信扫一扫

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

晚熟的猫 2022-03-30 阅读 43



文章目录

  • ​​第八十章 SQL函数 $LIST(二)​​
  • ​​示例​​
  • ​​注意​​
  • ​​无效的参数值​​
  • ​​两个参数和三个参数 $LIST​​
  • ​​Unicode​​


第八十章 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​​ 字符对其进行编码。



举报

相关推荐

0 条评论