INSERT 标量函数 (scalar function)
INSERT 函数返回一个字符串,其中从源字符串的 start 开始, 长度个字符已被删除并且插入了插入字符串。
该模式是 SYSIBM。
INSERT函数返回一个字符串,其中从源字符串中删除了从start开始的 字符 ,并将 插入字符串 从start开始插入到源字符串中。
- source-string
- 用于指定源字符串的表达式。 表达式必须返回一个值,该值是内置字符串、图形字符串或二进制字符串数据类型,且不是LOB。 字符串的实际长度必须大于或等于1且小于或等于32704字节。
该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。
- start
- 这是一个表达式,它返回一个 INTEGER。 整数指定了源字符串中删除字节和插入另一个字符串的起点。 整数值必须在1到源字符串长度加1的范围内。 如果指定了 OCTETS,且结果为图形数据,则该值必须是介于 1 和源字符串长度加 1 之间的奇数。
参数也可以是字符串或图形字符串数据类型。 字符串参数隐式转换为DECFLOAT(34)数据类型,然后赋值给INTEGER。
- length
- 一个表达式,用于指定从start开始替换源字符串中字符串的长度。 length 必须是一个返回内置 INTEGER 数据类型值的表达式。 长度以指定的字符串单位表示,且值必须在0到源字符串长度的范围内。 如果指定了 OCTETS,且结果为图形数据,则长度必须为偶数且介于源字符串长度的 0 到两倍之间。 不指定长度等同于指定值为1,除非指定了OCTETS,且结果为图形数据,在这种情况下,不指定长度等同于指定值为2。
参数也可以是字符串或图形字符串数据类型。 字符串参数隐式转换为DECFLOAT(34)数据类型,然后赋值给INTEGER。
- 插入字符串
- 一个表达式,用于指定从start位置开始插入到源字符串中的字符串。 表达式必须返回一个值,该值是内置字符串、图形字符串或二进制字符串数据类型,且不是LOB。
source-string 和 insert-string 必须具有兼容的数据类型。
该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。
- CODEUNITS16、 CODEUNITS32 或 OCTETS
- 指定用于表示开始和长度的单位。 如果源字符串是一个定义为位数据的字符串,则不能指定 CODEUNITS16 和 CODEUNITS32。 如果源字符串是图形字符串,则无法指定“八位字节”。 如果源字符串是二进制字符串,则无法指定 CODEUNITS16、 CODEUNITS32 和OCTETS。
如果未明确指定字符串单位,则结果的数据类型将决定所使用的单位:
- 如果结果是一个图形字符串,则一个字符串单元为两个字节。 对于ASCII和EBCDIC数据,这相当于一个双字节字符。 对于Unicode,这对应于一个 UTF-16 代码点。
- 否则,字符串单元就是一个字节。
- CODEUNITS16
- 规定以16位 UTF-16 代码单位表示开始和长度。
- CODEUNITS32
- 规定以32位 UTF-32 代码单元表示开始和长度。
- OCTETS
- 指定以字节为单位表示开始和长度。
有关 CODEUNITS16、 CODEUNITS32 和OCTETS的更多信息,请参阅字符串单元规格。
如果 source-string 和 insert-string 具有不同的 CCSID 集, 则 insert-string (要插入的字符串)将转换为 source-string (源字符串)的 CCSID。
结果的编码方案与源字符串相同。 函数结果的数据类型取决于源字符串和插入字符串的数据类型:
- 如果源字符串是字符串,则为VARCHAR。 结果的CCSID取决于参数:
- 如果源字符串或插入字符串是字符位数据,则结果为位数据。
- 如果源字符串是SBCS Unicode数据,而插入字符串不是SBCS Unicode数据,则结果的CCSID是Unicode数据的混合CCSID。
- 如果源字符串和插入字符串都是SBCS Unicode数据,则结果的CCSID就是SBCS Unicode数据的CCSID。
- 否则,结果的CCSID是源字符串CCSID 对应的混合CCSID。 但是,如果输入是EBCDIC或ASCII,且没有相应的混合系统CCSID,则结果的CCSID是源字符串的 CCSID。
- 如果源字符串是图形,则显示为图形。 结果的CCSID与源字符串的CCSID相同。
- VARBINARY 如果源字符串和插入字符串都是二进制字符串。
结果的长度取决于参数:
- 如果开始和长度是常数,则结果的长度属性为:
其中:L1 - MIN((L1 - V2 + 1), V3) + L4- L1 是源字符串的长度属性
- V2 是起始值
- V3 是长度的值
- L4 是插入字符串的长度属性
- 否则,结果的长度属性为源字符串的长度属性加上插入字符串的长度属性。 在这种情况下, 源字符串的长度属性加上插入字符串的长度属性,对于VARCHAR结果不得超过32704,对于VARGRAPHIC结果不得超过16352。
如果指定了 CODEUNITS16 或 CODEUNITS32 ,则插入操作将在Unicode版本的数据上执行。 如果需要,数据会转换为中间形式,以便评估函数。 如果使用中间形式,结果的实际长度取决于原始数据 (源字符串和插入字符串 )以及该数据在Unicode中的表示形式。 请参阅确定最终结果的长度属性 ,了解如何计算结果字符串的长度属性。
A1 - MIN((A1 - V2 + 1), V3) + A4其中:- A1 是源字符串的实际长度
- V2 是起始值
- V3 是长度的值
- A4 是插入字符串的实际长度
如果结果字符串的实际长度超过了返回数据类型的最大值,则会发生错误。
结果可以为空; 如果任何自变量为空,那么结果为空值。
SELECT CHAR(INSERT('INSERTING',4,2,'IS'),10),
CHAR(INSERT('INSERTING',4,0,'IS'),10),
CHAR(INSERT('INSERTING',4,2,''),10)
FROM SYSIBM.SYSDUMMY1;这个例子返回“INSISTING”、“INSISERTIN”和“INSTING” SELECT CHAR(INSERT('INSERTING',1,0,'XX'),10),
CHAR(INSERT('INSERTING',1,1,'XX'),10),
CHAR(INSERT('INSERTING',1,2,'XX'),10),
CHAR(INSERT('INSERTING',1,3,'XX'),10)
FROM SYSIBM.SYSDUMMY1;这个例子返回“XXINSERTIN”、“XXNSERTING”、“XXSERTING”和“XXERTING” SELECT CHAR(INSERT('ABCABC',7,0,'XX'),10)
FROM SYSIBM.SYSDUMMY1;这个例子返回“ABCABCXX”。 SELECT VARCHAR(INSERT('Hegelstraße',10,1,'ss'),15)
FROM SYSIBM.SYSDUMMY1;这个例子返回“Hegelstrasse”。