这几日编写 DB2 自定义函数,发现一个很特别的问题。ascii 函数的使用范围很特别。
我们首先来看这样一个情况:
# db2
db2-> values ascii('a')
db2-> 97
这个实验在 db2 v8 和 db2 v9 环境下测试均能够通过。
我们再来看一个自定义函数 isdigit
CREATE FUNCTION ISDIGIT (
CHKSTRING CHAR(200)
)
RETURNS INTEGER
NO EXTERNAL ACTION
F1: BEGIN ATOMIC
-- #######################################################################
-- # Specify the SQL you want to execute by replacing the text within the
-- # [brackets] with your SQL. There are several ways to do this:
-- # * Enter your SQL directly, or
-- # * Cut and paste your SQL, or
-- # * Right-click in the editor window and select Insert from File...
-- # Note: Be sure to end the statement with the terminator (usually ';')
-- # Example: SELECT COUNT(*) FROM SYSIBM.SYSTABLES;
-- ######################################################################
--[Your SQL to execute goes here]
DECLARE STRLEN INTEGER ;
DECLARE LENS INTEGER ;
DECLARE FLAGS INTEGER ;
DECLARE STRC CHAR(1) ;
SET FLAGS=1 ;
SET LENS = 1;
WHILE LENS < LENGTH(LTRIM(RTRIM(CHKSTRING))) AND FLAGS <> 0 DO
SET STRC = SUBSTR(CHKSTRING,LENS,1);
IF LENGTH(STRC) = 0 THEN
SET FLAGS = 0;
ELSE
IF ASCII(STRC) <48 OR ASCII(STRC)>57 THEN
SET FLAGS = 0;
END IF;
END IF;
SET LENS = LENS + 1;
END WHILE;
RETURN FLAGS;
END F1
|
这个函数在 db2 v8 的环境下部署的时候,会出现 sqlcode 440 的错误,部署失败。但我们在 db2 v9 的环境下却可以部署成功。
通过反复查看,发现在 db2 v8 系统上建库时使用的字符集是 gb2312 而在 db2 v9 的系统上建库时使用的是 gbk 的字符集。
目前比较疑惑的是,究竟是在建库时使用的字符集的影响,还是 db2 v8 本身存在某些函数不能使用在自定义函数中的限制,不过从测试的情况来看,字符集的影响会更大一些,有可能是某些函数不支持在 gb2312 字符集环境下使用。待下一次再全面测试。
初步认为,部分字符操作函数,在用于自定义函数中时,可能会存在不支持 gb2312 字符集环境的情况。
原创文章,请尊重本人的知识产权。
阅读(4718) | 评论(0) | 转发(0) |