SQLCODE=-138, SQLSTATE=22011解决办法
SQLCODE=-138, SQLSTATE=22011解决办法
今天从Oracle迁移到DB2环境,在验证DB2的时候,遇到了 A numeric argument of a built-in string function is out of range… SQLCODE=-138, SQLSTATE=22011的报错,不禁陷入疑惑,substr居然不能这么用
问题描述
SELECT SUBSTR(表A.字段B,0,2) FROM 表A;
-138 THE SECOND OR THIRD ARGUMENT OF THE SUBSTR OR SUBSTRING FUNCTION IS OUT OF RANGE
问题原因
从IBM官网查询得知,Oracle1和0是一样的效果,但是db2中substr函数是从1开始的,不能从0开始。
substring 函数
fn:substring 函数返回字符串的子串。
语法fn:substring(source-string,start,length)
source-string:要从中检索子串的字符串。
source-string 的数据类型为 xs:string,或者是空序列。
start
子串在 source-string 中的起始字符位置。source-string 的第一个位置为 1。如果 start<= 0,那么 start 设置为 1。xFFFF 以后的代码点使用两位 16 位值(又称为代理对)并且在计数时被当成一个字符。
start 的数据类型为 xs:double。
length
子串的长度(以字符计)。length 的缺省值是 source-string 的长度。如果 start+length-1 大于 source-string 的长度,那么 length 设置为 (source-string 的长度)-start+1。xFFFF 以后的代码点使用两位 16 位值(又称为代理对)并且在计算字符串长度时被当成一个字符。
length 的数据类型为 xs:double。
返回的值
如果 source-string 并非空序列,那么返回的值是 source-string 的子串,其起始字符位置为 start,并且包含 length 个字符。如果 source-string 是空序列,那么会生成零长度字符串。
示例
以下函数返回起始于字符串“Test literal”的第 6 个字符的 7 个字符。
fn:substring(‘Test literal’,6,7)
返回的值为“literal”。
又是美好的一天,今天你摸鱼了吗~